最大工作组大小与翘曲大小之间的关系是什么?假设我的设备有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占用率(线程布局和共享内存要求).我希望这个解释有所帮助!
| 归档时间: |
|
| 查看次数: |
32488 次 |
| 最近记录: |