cuda编程笔记记录

1. SM 中的 Warp 和 Block
  CUDA 的 device 实际在执行的时候,会以 Block 为单位,把一个个的 block 分配给 SM 进行运算;而 block 中的 thread,又会以「warp」为单位,把 thread 来做分组计算。目前 CUDA 的 warp 大小都是 32,也就是 32 个 thread 会被群组成一个 warp 来一起执行;同一个 warp 里的 thread,会以不同的数据,执行同样的指令。
  基本上 warp 分组的动作是由 SM 自动进行的,会以连续的方式来做分组。比如说如果有一个 block 里有 128 个 thread 的话,就会被分成四组 warp,第 0-31 个 thread 会是 warp 1、32-63 是 warp 2、64-95 是 warp 3、96-127 是 warp 4。
  而如果 block 里面的 thread 数量不是 32 的倍数,那他会把剩下的 thread 独立成一个 warp;比如说 thread 数目是 66 的话,就会有三个 warp:0-31、32-63、64-65。由于最后一个 warp 里只剩下两个 thread,所以其实在计算时,就相当于浪费了 30 个 thread 的计算能力;这点是在设定 block 中 thread 数量一定要注意的事!
  一个 SM 一次只会执行一个 block 里的一个 warp!warp 也是每一个 SM 执行的最小单位,

在 block 的方面,一个 SM 可以同时处理多个 thread block,当其中有 block 的所有 thread 都处理完后,他就会再去找其他还没处理的 block 来处理。假设有 16 个 SM、64 个 block、每个 SM 可以同时处理三个 block 的话,那一开始执行时,device 就会同时处理 48 个 block;而剩下的 16 个 block 则会等 SM 有处理完 block 后,再进到 SM 中处理,直到所有 block 都处理结束。

每一个块内线程数应该首先是32的倍数,因为这样的话可以适应每一个warp包含32个线程的要求,所以,在函数不是很复杂的情况下,可以适当的增加线程数目,线程中不要加入循环。在函数比较复杂的情况下,每一个块中分配32或是64个线程比较合适。每一个SM同时处理一个块。

https://blog.csdn.net/GH234505/article/details/51115994?utm_medium=distribute.pc_relevant_right.none-task-blog-BlogCommendFromMachineLearnPai2-4.channel_param_right&depth_1-utm_source=distribute.pc_relevant_right.none-task-blog-BlogCommendFromMachineLearnPai2-4.channel_param_right

 

在执行 CUDA 程序的时候,每个 stream processor 就是对应一个 thread。 每个 multiprocessor
则对应一个 block。从之前的文章中,可以注意到一个 block 经常有很多个 thread(例如 256
个),远超过一个 multiprocessor 所有的 stream processor 数目。这又是怎么回事呢?
实际上,虽然一个 multiprocessor 只有八个 stream processor,但是由于 stream processor 进行
各种运算都有 latency,更不用提内存存取的 latency,因此 CUDA 在执行程序的时候,是以
warp 为单位。目前的 CUDA 装置,一个 warp 里面有 32 个 threads,分成两组 16 threads
的 half-warp。由于 stream processor 的运算至少有 4 cycles 的 latency,因此对一个 4D 的
stream processors 来说,一次至少执行 16 个 threads(即 half-warp)才能有效隐藏各种运算
的 latency。
由于 multiprocessor 中并没有太多别的内存,因此每个 thread 的状态都是直接保存在
multiprocessor 的寄存器中。所以,如果一个 multiprocessor 同时有愈多的 thread 要执行,就
会需要愈多的寄存器空间。例如,假设一个 block 里面有 256 个 threads,每个 thread 用到
20 个寄存器,那么总共就需要 256x20 = 5,120 个寄存器才能保存每个 thread 的状态。
目前 CUDA 装置中每个 multiprocessor 有 8,192 个寄存器,因此,如果每个 thread 使用到
16 个寄存器,那就表示一个 multiprocessor 同时最多只能维持 512 个 thread 的执行。如果
同时进行的 thread 数目超过这个数字,那么就会需要把一部份的数据储存在显卡内存中,就
会降低执行的效率了。

 

你可能感兴趣的:(cuda图像处理)