CUDA模型解读-顺便学习

本文介绍了CUDA编程的基本概念,包括GPU与CPU架构的区别、CUDA编程模型、线程组织方式及内存访问特性。作者通过对比GPU和CPU的特点,阐述了CUDA如何简化GPU编程难度。
部署运行你感兴趣的模型镜像
最近因为开始关注一些GPU的东西,主要也是翻译GPU Gem3的缘故,碰到很多的CUDA的架构和术语问题。例如Grid、Kernel、Block竟不知为何物。于是翻出了Nvidia的技术手册,随意扫了扫。

CSND首页链接中的CUDA中国站有翻译版,不过有些明显的错误。我的版本中省去了不少扯皮的官方套话,因为官方的中英文版本大家都能看到,所以换个角度理解问题可能更有意义。其中有不少个人观点,请包容,有错误了请告诉我,欢迎交流。

原文地址:
http://developer.download.nvidia.com/compute/cuda/1_1/NVIDIA_CUDA_Programming_Guide_1.1.pdf

-------------------------------------

1- introduction




 
图1. GPU浮点计算能力

因为是从Nvidia的技术手册弄过来的图,多少有些YY的成分。Nvidia想用这么一副图从最开始就把用户们征服,其实不然,作为一个专用并行计算设备,如果浮点计算能力不超过CPU数十百倍,那还真对不起自己。浮点计算能力强的如IBM的超级计算机,日本的地球模拟器,这些硬指标不代表所有的方面。

虽然没有什么好比的,不过我们还是能够看到,但从计算能力角度讲,GPU确实在CPU之上,而且依据发展趋势,GPU的计算能力会有更好的提升。

图2. GPU于CPU架构差异
又是一副Nvidia的YY图。和CPU复杂的cache,麻烦的流水线不同,GPU中有更多的SIMD计算单元,更好的并行性。这其实也就解释了图1.的问题,CPU的主要精力并没有集中在植入更多ALU或者SIMD单元上,而是在现有的架构上,企图扩展核的数量。CPU的问题,就像微软的问题,已经太复杂了,没法做一些纯粹的事情。
"Up until now, however, accessing all that computational power packed into the GPU and efficiently leveraging it for non-graphics applications remained tricky:"
我们不要忘记GPU毕竟是做Z-Buffer光栅化出生的,本来属于定制硬件,要想真正的在通用领域发挥作用,并不那么容易操作。实现一些算法的时候,不能像CPU那样直接,内存访问也存在诸多限制。数据结构,忘掉数据结构的事儿吧,期待CUDA有点新的地方。

图3. CUDA的编程模型
总而言之,大家都看得出这个问题,一个新的硬件,要让用户接受,主要是让开发者接受开发难度,让消费者接受价格。价格这个东西,有很多办法,但开发难度就不好说了。Nvidia深知这一点,从很久之前,好像是2002年那本CG教程开始,一直在推广GPU上的编程,提供API,提供SDK。
从CUDA来看,Nvidia真的是下了大功夫了,硬件完全的被抽象,语言也迈入C/C++,和CG语言那种模棱两可的感觉相比,CUDA更像是一个革新。
2 - Programming Model
在用CUDA编程时,GPU被看成能够并行执行很多线程的计算设备compute device)。此时,GPU作为CPU或者主机(host)的协同处理器,也就是说,程序中数据并行、计算密集的部分将被从主机转移到GPU上来。
更精确的说,那些对不同数据进行多次相同处理的程序部分,能够被单独分离成多线程的方式在设备上运行的函数。把这些函数被编译为设备上的指令集合,就叫做内核kernel)。

图 3. CUDA的线程模型
让我们来看看,设计者是如何来抽象整个GPU的计算的吧:
  • 线程块Thread Block
    线程块是一批能共同协作的线程,它们通过快速内存访问分享数据,并同步化执行来协调内存访问。具体说,用户可以在内核(kernel)中设置同步点,块中的线程会被挂起,直到所有线程都达到同步点。
  • 线程块网格Grid of Thread Blocks)
    线程块的大小虽然有限,但是相同维度的执行相同内核的线程块能够组成线程块网格,这样单个内核能够装载的线程数量能够扩大许多。但同一网格之中的不同块不能相互通信。
虽然没有看后面的硬件实现,如果没有理解错的话,一个线程应该是一个硬件执行单元的抽象。线程块则是共享内存的硬件执行单元集合的抽象。对于之间没有直接通信方式的集合,用Grid来表示。

图3. 是理解CUDA编程模型的关键。实际情况下,这里的Host指的是CPU和内存环境,Device是指GPU和显存环境。在CUDA中编写的类C语言程序会被编译成能在GPU上运行的指令,送入GPU中。CUDA把GPU中的单个运算元件抽象成一个小线程,真个并行环境再进一步组织称Block和Grid。Block之内能够通信,进行同步操作,而Block之间不行。

图4. CUDA内存访问
CUDA的内存访问结构如上,和线程分批模型结合起来理解正好。Thread单独有自己的寄存器和本地内存(local memory),此外,还能读写全局内存(Global memory)。Block之内则有一个共享内存,用于同步等操作。纹理内存和持久内存对于Thread而言,只能读取。
------------------
待续。

您可能感兴趣的与本文相关的镜像

PyTorch 2.5

PyTorch 2.5

PyTorch
Cuda

PyTorch 是一个开源的 Python 机器学习库,基于 Torch 库,底层由 C++ 实现,应用于人工智能领域,如计算机视觉和自然语言处理

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值