CUDA10.0官方文档的翻译与学习之介绍

2023-11-18

背景

从这次开始,我将用数篇博客来分享前一阵我对CUDA10.0官方文档之编程指南的翻译与学习的笔记。由于内容非常多,我将每一章单独分享出来,可能有地方翻译得词不达意,所以建议大家参考原文:https://docs.nvidia.com/cuda/archive/10.0/cuda-c-programming-guide/index.html

介绍

从图像处理到通用目的的平行计算

在不知满足的追求实时性的市场的驱动下,高分辨度的3D图像、可编程的gpu已经进化成了一个高度并行化、多线程多核处理器、拥有强悍的计算马力和内存带宽的处理器,如下两张图所示

CPU和GPU在处理浮点数能力上的差异的背后原因,是GPU是专门为密集型、高并行化计算——特别是图像渲染而设计的,故而使用了更多用来做数据处理的晶体管——要比进行数据存储或流程控制的多很多,如下图所示

 

另外,GPU特别适合解决那些被称之为并行数据计算的问题,也就是要并行执行那些处理数据元素的程序,而且有着高强度的数学运算(数学运算要比内存操作多得多)。因为对每个数据元素要执行相同的程序,那么对复杂的流程控制的要求就会降低。另外,因为程序在很多的数据元素上执行,且拥有很高的运算强度,所以内存访问延迟就可以被计算而不是大的数据缓存锁隐藏。

数据并行处理把数据元素映射给了数据处理线程,很多处理大数据集的应用可以使用并行数据编程模型来加速计算。在3维渲染中,像素和边的巨大集合可以被映射给并行线程,类似地,诸如对已渲染的图像进行再加工、视频编解码、图像缩放、立体视觉、样式识别这样的数据和媒体处理应用可以把图像块和像素映射到并行处理线程上。事实上,图像渲染和处理领域之外的很多算法可以被数据并行处理加速,包括通用信号处理、物理模拟到经济计算或生物计算。

cuda:一个为通用目的产生的并行计算平台和编程模型

2006年11月份,英伟达引入了cuda,这是一个使用英伟达GPU中的并行计算引擎来用一种比在单个CPU上更有效的方式来解决很多复杂计算问题的通用计算平台和编程模型。cuda提供一个允许开发者用C语言来作为高级编程语言的软件环境,如下图所示,诸如Fortran、DirectCompute、OpenACC等其他语言、应用编程接口或者基于指令的方法也被cuda支持

可量化的编程模型

多核CPU和多核GPU的出现意味着主流处理器芯片是现在的并行平台,而且,它们的并行性服从摩尔定律。我们面临的挑战是要开发能够扩展并行度以利用越来越多的核的应用,例如3D图像应用把它们的并行度扩展到了拥有核数不一的多核GPU上。

cuda并行编程模型的设计就是用来克服这种挑战,同时用程序员熟悉的标准程序语言(例如C)来保持一个低的学习曲线。

在cuda核心中有三个关键抽象:线程组的层次、共享内存和同步栅栏,这也是面向程序员的最少的语言扩展内容。这些抽象提供了嵌套在在粗粒度的数据并行和任务并行中的细粒度数据并行和线程并行,从而引导程序员把问题分成可以通过线程或块并行解决的粗粒度子问题,并且把每个子问题进一步分成可以被块内所有线程一起并行解决的细粒度问题。

这种解构通过允许线程在解决每个子问题时合作来保留语言的表达性,同时允许自动量化。确实,每个线程块可以在GPU内任何可调度的处理器上以任何顺序并发或串行执行(如下图所示),并且只有运行时系统需要知道物理处理器数量

这种可量化的编程模型允许GPU架构通过缩放处理器的数量和内存分区来跨越宽泛的市场范围:从高性能爱好者的GeForce到专业的Quadro和Tesla计算产品到各种便宜的主流GeforceGPU。

结语

以上就是CUDA10.0官方文档的第一章内容,从中我的思考如下:

1、GPU中大部分晶体管都是用来ALU,所以它不擅长复杂的逻辑控制,而是擅长运算,这正与CPU互补。所以我们开发时应该各尽其能,让CPU处理逻辑判断,然后让GPU处理运算;

2、CUDA的接口都是C或C++写的,所以我们必须提前掌握C或C++,不过相信科班出身的应该对这俩都不陌生;

3、CUDA可以对很多计算密集型的应用进行加速,这些应用可以参见《CUDA高性能计算》一书中的例子,里面涉及用CUDA实现的手电筒应用、热力可视化、振荡器等应用,大体逻辑都是UI渲染部分交给OpenGL,而运算部分交给CUDA。

下一章将会介绍CUDA的编程模型,包括线程视图的层次、内存层次、核函数以及异构编程

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

CUDA10.0官方文档的翻译与学习之介绍 的相关文章

  • 如何实现设备端CUDA虚拟功能?

    我发现 CUDA 不允许将具有虚拟函数的类传递到内核函数中 对于这个限制有什么解决方法吗 我真的很希望能够在内核函数中使用多态性 Thanks 罗伯特 克罗维拉评论中最重要的部分是 只需在设备上创建对象即可 所以记住这一点 我正在处理我有一
  • 使用非均匀节点优化 CUDA 内核插值

    原问题 我有以下内核使用非均匀节点执行插值 我想对其进行优化 global void interpolation cufftDoubleComplex Uj double points cufftDoubleComplex result i
  • cudaGetDevice() 失败。状态:CUDA 驱动程序版本不足以满足 CUDA 运行时版本

    当我在 GPU 中运行 TensorFlow 时 出现以下错误 2018 09 15 18 56 51 011724 E tensorflow core common runtime direct session cc 158 Intern
  • cuda简单应用程序适用于32位而不适用于64位

    我的简单 cuda helloworld 应用程序在 Windows 10 上使用 Visual Studio 2015 社区构建 32 位时运行良好 但是 如果我在 64 位中构建它 则不会执行 GPU 特斯拉K40c 工具包 CUDA
  • CUDA - 为什么基于扭曲的并行减少速度较慢?

    我有关于基于扭曲的并行减少的想法 因为根据定义 扭曲的所有线程都是同步的 因此 我们的想法是输入数据可以减少 64 倍 每个线程减少两个元素 而无需任何同步 与 Mark Harris 的原始实现相同 减少应用于块级 数据位于共享内存上 h
  • 在 Windows 上的 Qt Creator 中编译 Cuda 代码

    几天来我一直在尝试获取在 32 位 Windows 7 系统上运行的 Qt 项目文件 我希望 需要在其中包含 Cuda 代码 这种组合要么非常简单 以至于没有人愿意在网上放一个例子 要么非常困难 似乎没有人成功 不管怎样 我发现的唯一有用的
  • 如何在 gitlab-ci docker 执行器中使用 cuda

    我们正在使用 gitlab 持续集成来构建和测试我们的项目 最近 其中一个项目添加了 CUDA 的要求以启用 GPU 加速 我不想改变我们的管道 docker 和 gitlab ci 对我们来说运行良好 所以我想以某种方式让 docker
  • 如何在 Windows 上的 nvidia GPU 的 Visual Studio 2010 中配置 OpenCL?

    我在华硕笔记本电脑上的 Wwindows 7 操作系统上使用 NVIDIA GeForce GTX 480 GPU 我已经为 CUDA 4 2 配置了 Visual Studio 2010 如何在 Visual Studio 2010 上为
  • CUDA:如何检查计算能力是否正确?

    使用较高计算能力编译的 CUDA 代码将在计算能力较低的设备上完美执行很长一段时间 然后有一天在某些内核中默默地失败 我花了半天时间追寻一个难以捉摸的错误 结果发现构建规则已经sm 21而该设备 Tesla C2050 是2 0 是否有任何
  • 如何用Go语言的cgo编译Cuda源码?

    我用 cuda c 编写了一个简单的程序 它可以在 eclipse nsight 上运行 这是源代码 include
  • 使用 CUDA __device__ 函数时出现链接器错误 2005 和 1169(多重定义的符号)(默认情况下应内联)

    这个问题与以下问题有很大关系 A 如何将CUDA代码分成多个文件 https stackoverflow com questions 2090974 how to separate cuda code into multiple files
  • 如何将CUDA时钟周期转换为毫秒?

    我想用一些代码来测量时间within我的内核需要 我已经关注了这个问题 https stackoverflow com questions 11209228 timing different sections in cuda kernel连
  • CUDA程序导致nvidia驱动程序崩溃

    当我超过大约 500 次试验和 256 个完整块时 我的 monte carlo pi 计算 CUDA 程序导致我的 nvidia 驱动程序崩溃 这似乎发生在 monteCarlo 内核函数中 任何帮助都会受到赞赏 include
  • CUDA素数生成

    当数据大小增加超过 260k 时 我的 CUDA 程序停止工作 它不打印任何内容 有人能告诉我为什么会发生这种情况吗 这是我的第一个 CUDA 程序 如果我想要更大的素数 如何在 CUDA 上使用大于 long long int 的数据类型
  • 传递给 CUDA 的结构中的指针

    我已经搞砸了一段时间了 但似乎无法正确处理 我正在尝试将包含数组的对象复制到 CUDA 设备内存中 然后再复制回来 但当我遇到它时我会跨过那座桥 struct MyData float data int dataLen void copyT
  • 如何优化这个 CUDA 内核

    我已经分析了我的模型 似乎该内核约占我总运行时间的 2 3 我一直在寻找优化它的建议 代码如下 global void calcFlux double concs double fluxes double dt int idx blockI
  • 设置最大 CUDA 资源

    我想知道是否可以设置 CUDA 应用程序的最大 GPU 资源 例如 如果我有一个 4GB GPU 但希望给定的应用程序只能访问 2GB 如果它尝试分配更多 就会失败 理想情况下 这可以在进程级别或 CUDA 上下文级别上设置 不 目前没有允
  • CUDA 常量内存是否应该被均匀地访问?

    我的 CUDA 应用程序的恒定内存小于 8KB 既然它都会被缓存 我是否需要担心每个线程访问相同的地址以进行优化 如果是 如何确保所有线程同时访问同一地址 既然它都会被缓存 我是否需要担心每个线程访问相同的地址以进行优化 是的 这缓存本身每
  • 在 __device/global__ CUDA 内核中动态分配内存

    根据CUDA 编程指南 http developer download nvidia com compute cuda 3 2 prod toolkit docs CUDA C Programming Guide pdf 第 122 页 可
  • 有没有一种有效的方法来优化我的序列化代码?

    这个问题缺乏细节 因此 我决定创建另一个问题而不是编辑这个问题 新问题在这里 我可以并行化我的代码吗 还是不值得 https stackoverflow com questions 17937438 can i parallelize my

随机推荐

  • 字符串的字体和显示 (3)

    安卓有三种字符串 String String Array Quantity String Plurals String和String Array容易理解 一个是字符串 一个是字符串数组 通过 String planets res getSt
  • Qt做发布版,解决声音和图片、中文字体乱码问题

    前些天做Qt发布版 发现居然不显示图片 后来才发现原来还有图片的库没加 找找吧 去qt的安装包 我装在了F盘 在F盘F QT qt plugins 找到了plugins 这里面有个 imageformats是图片的库 里面有jpg gif等
  • 谷歌开源代码评审规范:好坏代码应该这样来判断

    谷歌开源了一套代码评审 Code Review 规范 它是谷歌一套通用的工程实战指南 几乎涵盖了所有编程语言与各种类型的项目 这个规范代表了谷歌长期发展以来最佳实战经验的集合 谷歌表示希望开源项目或其他组织能够从这套规范中受益 代码评审 也
  • Docker学习:Docker核心命令

    前言 本讲是从Docker系列讲解课程 单独抽离出来的一个小节 重点介绍八大核心命令和一些常用的辅助命令 比如inspect logs push commit等 如果你想 通过部署Tomcat容器 从查找镜像 到拉取 到运行 最后到移除 来
  • sql server - 将sqlserver安装到虚拟机内

    目录 1 安装 打开虚拟机 1 1 打开vmware 1 2 安装虚拟系统到vmware Windows Server 2016 2 安装SQL server 2014 2 1 把SQL server下载并上传到虚拟机 2 2 安装与配置
  • C++ 虚函数表解析

    C 虚函数表解析 陈皓 http blog csdn net haoel 前言 C 中的虚函数的作用主要是实现了多态的机制 关于多态 简而言之就是用父类型别的指针指向其子类的实例 然后通过父类的指针调用实际子类的成员函数 这种技术可以让父类
  • Web前端学习:jQuery基础 · 小终结【异步处理AJAX】

    目录 一 AJAX介绍 AJAX处理过程 二 AJAX请求 代码演示 案例一 获取txt文本内容 通过页面窗口弹出 案例二 返回json数据 一 AJAX介绍 ajax技术的目的是让javascript发送http请求 与后台通信 获取数据
  • Flask框架-重定向与错误

    在Web服务访问时并不总是能够返回正确的结果 当用户访问了错误的URL 或者传输了错误的请求参数 Web服务就需要返回相关的错误信息进行提示 Flask中针对错误请求的场景提供了相关的API 包括标准错误的响应和标准重定向的响应处理 在We
  • 江波龙深化存储技术优势 紧密结合物联网应用需求创新

    转自 http www chinaflashmarket com Producer Netcom News 142127 云计算 大数据以及移动互联网时代下 全球存储容量以爆发式的速度在增长 根据市场调研机构预测 2020年全球存储容量将从
  • servlet编程会话管理技术

    1 会话管理 浏览器与服务器之间会话过程中产生的会话数据 Cookie特点 1 会话数据放在浏览器端 2 数据类型只能string 而且有大小限制的 3 相对数据存放不安全 Session特点 1 会话数据放在服务器端 服务
  • MES的数据采集方式

    为实现生产车间现场数据的采集 制造业MES系统数据采集方法有手工录入方式和自动化提取采集两大类 主要有以下几类 一 手动方式 1 手工方式 操作员或编程员在MES系统控制面板上 输入特定的触发程序 经DNC服务器的自动翻译 就可得到机床端的
  • Jenkins集成Sonar与Gitlab代码质量检测

    前提默认 安装docker19 与docker compose 安装Jenkins 1 docker compose yaml配置 version 3 services jenkins network mode host 镜像 image
  • 3、Java的If语句与For循环

    一 语句 条件语句 根据不同的条件 执行不同的语句 if if else if else if if else if else if else switch 循环语句 重复执行某些动作 for while do while 1 1 if语句
  • 深度学习算法面试常问问题(三)

    pooling层是如何进行反向传播的 average pooling 在前向传播中 就是把一个patch的值取平均传递给下一层的一个像素 因此 在反向传播中 就是把某个像素的值平均分成n份 分配给上一层 max pooling 在前向传播中
  • 用Odoo创建一个网站

    原贴地址 https www odoo com documentation 10 0 howtos website html 声明 这篇指导假设你有python的知识并安装了Odoo 请注意文件的目录结构 本文的目录结构与原文不同 创建一个
  • 快速打开CMD的几个方法

    1 在开始菜单里面找CMD EXE 很快的哟 2 在资源管理器的地址栏直接键入CMD按回车也能启动CMD 3 资源管理器 按住Shift点右键也能召唤CMD哦 选 在此处打开命令窗口 就行了
  • squirrel-foundation状态机的使用细节

    上一篇文章介绍了stateless4j spring statemachine以及squirrel foundation三款状态机引擎的实现原理 以及我为何选择squirrel foundation作为解决方案 本文主要介绍一下项目中如何使
  • sqlloader出现SQL*Loader-704和ORA-12154的错误

    1 错误描述 生成的sqlloder各个文件完好 权限也具备 但是就是导入oracle数据库的时候报错 错误为 SQL Loader 704 Internal error ulconnect OCIServerAttach 0 ORA 12
  • vue3+ts实现todolist功能

    先看一下实现效果 可以看到内部实现的内容有enter输入 单项删除 全选 以及删除选中项等功能 具体在实现前需要常见有ts的vue3项目 项目创建 具体项目创建 就是 vue create 项目名称 在创建后 选择的时候有vue2和vue3
  • CUDA10.0官方文档的翻译与学习之介绍

    背景 从这次开始 我将用数篇博客来分享前一阵我对CUDA10 0官方文档之编程指南的翻译与学习的笔记 由于内容非常多 我将每一章单独分享出来 可能有地方翻译得词不达意 所以建议大家参考原文 https docs nvidia com cud