CUDA模型 - 什么是扭曲尺寸?

r00*_*kie 43 cuda gpgpu

最大工作组大小与翘曲大小之间的关系是什么?假设我的设备有240个CUDA流处理器(SP),并返回以下信息 -

CL_DEVICE_MAX_COMPUTE_UNITS:30

CL_DEVICE_MAX_WORK_ITEM_SIZES:512/512/64

CL_DEVICE_MAX_WORK_GROUP_SIZE:512

CL_NV_DEVICE_WARP_SIZE:32

这意味着每个流多处理器(即计算单元)有8个SP.现在warp size = 32与这些数字有关吗?

M. *_*its 114

直接答案: Warp size是warp中的线程数,它是硬件实现中用于合并内存访问和指令调度的细分.

推荐阅读:

正如@Matias所提到的,我会去阅读CUDA C最佳实践指南(你必须滚动到它列出的底部).您可以盯着第164页的附录G.1中的表格.

说明:

CUDA是在两个层面上提供并行性的语言.你有线程,你有线程块.这在执行内核时最为明显; 您需要指定每个线程块的大小以及在内核参数之前的<<< >>>之间的线程块数.

CUDA没有告诉你的是事情实际上发生在四个层面,而不是两层.在后台,你的线程块实际上被分成称为"warps"的子块.这里有一个简短的比喻来帮助解释实际情况:

隐喻简介:

假装你是一名教育家/研究员/政治家,对高中毕业生目前的数学能力感兴趣.你的计划是对10,240名学生进行测试,但你不能把他们全部放在足球场或其他什么东西给他们测试.最简单的是细分(并行化)你的数据收集 - 所以你去了20个不同的高中,并要求他们的512个老人各自参加数学考试.

您收集数据,这就是您所关心的.你不知道(并没有真正关心的)是每所学校实际上细分为教室.所以你的512名老年人实际上被分为16组,每组32人.而且,这些学校中没有一所真正拥有所需的资源 - 每个教室只有16个计算器.因此,在任何时候,每个教室只有一半可以参加数学考试.

我可以继续伸展愚蠢的规则,因为任何一所学校只有八间教室可以同时参加考试,因为他们只有八名教师.你不能同时对超过30所学校进行抽样,因为你只有30名监狱...

回到你的问题:

使用这个比喻,你的程序想要尽可能快地计算结果(你想收集数学测试).您发出一个内核,其中包含一定数量的块(学校),每个块都有一定数量的线程(学生).您一次只能运行这么多块(收集您的调查回复需要每个学校一个监考人员).在CUDA中,线程块在流式多处理器(SM)上运行.变量:CL_DEVICE_MAX_COMPUTE_UNITS告诉你特定卡有多少个SM,30个.这根据硬件的不同而有很大差异 - 请查看" CUDA C最佳实践指南"附录A中的表格.请注意,无论计算能力如何(1.X或2.X),每个SM只能同时运行8个块.

螺纹块具有最大尺寸:CL_DEVICE_MAX_WORK_ITEM_SIZES.考虑在网格中布置线程; 你不能拥有超过512个线程的行.您不能拥有超过512个线程的列.而且你不能堆叠超过64个线程.接下来,有一个最大值:CL_DEVICE_MAX_WORK_GROUP_SIZE线程数512,可以在一个块中组合在一起.所以你的线程块的尺寸可能是:

512 x 1 x 1

1 x 512 x 1

4 x 2 x 64

64 x 8 x 1

等等...

请注意,从Compute Capability 2.X开始,您的块最多可包含1024个线程.最后,该变量CL_NV_DEVICE_WARP_SIZE指定扭曲大小,32(每个教室的学生数).在Compute Capability 1.X设备中,内存传输和指令调度以Half-Warp粒度发生(每个教室只有16个计算器).在Compute Capability 2.0中,内存传输按Warp分组,因此32个同时提取,但指令调度仍然只按Half-Warp分组.对于Compute Capability 2.1,内存传输指令调度都由Warp发生,共有 32个线程.这些东西可以并且将来会在硬件上发生变化.

所以,我的话!让我们谈谈这一点:

综上所述:

我已经描述了warp/thread布局和其他类似shtuff的细微差别,但这里有几点要记住.首先,你的内存访问应该是16组或32组的"可分组".所以保持你的块的X维度是32的倍数.其次,最重要的是从特定的gpu中获得最大的收益,你需要最大化占用率.没有5个512线程的块.而且没有1000块10个线程.我强烈建议您查看基于Excel的电子表格(在OpenOffice中也可以工作?我认为??),它将告诉您特定内核调用的GPU占用率(线程布局共享内存要求).我希望这个解释有所帮助!

  • 非常好的答案和比喻.只是想补充一点,AMD有类似的名为Wavefront的概念,目前是64线程/波前. (2认同)

Mat*_*gro 4

warp 大小是多处理器同时执行的线程数。NVIDIA 多处理器可以使用硬件多线程同时执行同一块中的多个线程。

考虑扭曲大小很重要,因为所有内存访问都合并为扭曲大小的倍数(32 字节、64 字节、128 字节),这可以提高性能。

CUDA C 最佳实践指南包含有关此类优化的所有技术信息。