CUDA如何安排其线程

时间:2012-04-30 20:08:06

标签: cuda

我有一些关于cuda调度系统的问题。

答:当我使用foo<<<<<<<<<<<<<<<<<<<&#25525>>我知道每个SM从上层接收一个要调度的块,每个SM负责调度其传入的BLOCK,但是哪个部分可以执行?例如,如果我有8个SM,当每个包含8个小CPU时,上层负责安排剩余的255 * 255 - (8 * 8)个线程吗?

B.可以定义的最大线程数限制是多少?我的意思是foo<<<X, Y>>>(); x,y =?

℃。关于最后一个例子,一个块内可以有多少个线程?我们可以说我们拥有的块/线程越多,执行的速度就越快吗?

感谢您的帮助

2 个答案:

答案 0 :(得分:3)

一个。计算工作分配器将块从网格分发到SM。 SM将在warp中转换块(所有NVIDIA GPU上的WARP_SIZE = 32)。 Fermi 2.0 GPU每个SM都有两个warp调度器,它们共享一组数据路径。每个循环,每个warp调度程序选择一个warp并向一个数据路径发出指令(请不要考虑CUDA核心)。在Fermi 2.1 GPU上,每个warp调度程序都有独立的数据路径以及一组共享数据路径。在2.1每个周期​​,每个warp调度程序将选择一个warp并尝试为每个warp执行双重发布指令。

warp调度程序尝试优化数据路径的使用。这意味着单个warp可能会在背靠背循环中执行多个指令,或者warp调度程序可以选择在每个循环中从不同的warp发出。

每个SM可以处理的warp /线程数在CUDA编程指南v.4.2表F-1中指定。这可以从768个线程扩展到2048个线程(24-64个warp)。

B中。每次启动的最大线程数由最大GridDims *每个块的最大线程数定义。请参阅表F-1或参阅cudaGetDeviceProperties的文档。

℃。查看与(B)相同的资源。线程/块的最佳分布由您的算法分区定义,并受占用率计算的影响。基于SM上的扭曲的问题集大小以及在指令障碍(以及其他事项)中阻塞的时间量,存在可观察到的性能影响。对于初学者,我建议每个SM至少2个街区,占用率约为50%。

答案 1 :(得分:0)

B中。这取决于您的设备。您可以使用cuda函数cudaGetDeviceProperties查看设备的规格。常见的最大数量是每个块y = 1024个线程,每个网格维度x = 65535个块。

C.常见的做法是拥有2(128,256,512等)个线程/块的权力。减少大型数组非常有效(参见Reduction)。块和线程的最佳分布实际上取决于您的应用程序和硬件。我个人在TeslaM2050上使用512个线程/块进行大型稀疏线性代数计算,因为它对我的应用程序来说效率最高。