CUDA模型 – 什么是warp大小?

最大工作组大小和经纱大小之间的关系是什么? 假设我的设备有240个CUDAstream处理器(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

这意味着每个stream式多处理器(即计算单元)有8个SP。 现在warp size = 32与这些数字有什么关系?

直接的答案: Warp size是warp中的线程数,它是硬件实现中用于合并内存访问和指令分派的一个子分支。

推荐阅读:

正如@Matias提到的,我会阅读CUDA C最佳实践指南 (您将不得不滚动到列出的底部)。 这可能有助于您盯住第164页附录G.1中的表格。

说明:

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

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

简单的隐喻:

假装你是一个对当前高中math能力感兴趣的教育家/研究员/政治家。 你的计划是对10,240名学生进行考试,但是你不能把他们全部放在足球场或者其他什么东西上给他们考试。 对数据收集进行细分(并行化)是最容易的 – 所以你要去20所不同的高中,并要求512位老年人每个都要进行math考试。

你收集你的数据,这是你所关心的。 你不知道的(也并不在乎)是每个学校实际上都被细分为教室。 所以你们的512名老年人实际上被分成了16个32人。而且,这些学校都没有真正的所需资源 – 每个教室只有16个计算器。 因此,在任何时候,每个教室只有一半可以进行math考试。

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

回到你的问题:

使用这个隐喻,你的程序想要尽可能快地计算结果(你想收集mathtesting)。 你发出一定数量的块(学校),每个块都有一定数量的线程(学生)。 您只能同时运行这么多块(收集您的调查回复需要每个学校有一名监督)。 在CUDA中,线程块在stream式多处理器(SM)上运行。 variables: CL_DEVICE_MAX_COMPUTE_UNITS告诉你有多less个SM, 30个特定的卡。 根据硬件的不同,这个变化非常大 – 请查看CUDA C最佳实践指南附录A中的表格。 请注意,不pipe计算能力如何,每个SM只能同时运行八个块(1.X或2.X)。

线程块具有最大维度: 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个线程。 最后,variablesCL_NV_DEVICE_WARP_SIZE指定扭曲大小, 32 (每间教室的学生数量)。 在计算能力1.X设备中,内存传输和指令调度以半经向粒度(每个教室只有16个计算器)进行。 在Compute Capability 2.0中,内存传输按Warp进行分组,所以32个同时取指令,但指令分派仍然只由Half-Warp分组。 对于计算能力2.1,内存传输指令分派均由Warp发生,32个线程。 这些东西可以并将在未来的硬件中改变。

所以,我的话! 让我们来看看:

综上所述:

我已经描述了经纱/螺纹布局和其他这样的shtuff的细微差别,但这里有一些事情要记住。 首先,你的内存访问应该是16或者32的“可分组”。所以保持你的块的X维度是32的倍数。第二, 也是最重要的 ,要从特定的GPU获得最大的利益,你需要最大化占用率。 没有512个线程的5个块。 并没有1000线程的10块。 我强烈build议检查一下基于Excel的电子表格 (在OpenOffice中工作吗?我认为??),它会告诉你一个特定的内核调用(线程布局共享内存要求)的GPU占用情况。 我希望这个解释有帮助!

M. Tibbits的答案中给出的“直接答案”不是直接的。 翘曲大小是32个线程; 它是stream式多处理器(SM)执行指令的单位。 SM不能以比32更好的粒度执行指令。

由于现有的代码依赖于大小为32的warp(包括NVIDIA自己的缩减代码示例),因此NVIDIA不会改变warp大小而不会产生巨大的兼容性问题。 所以我的期望是在可以预见的将来它仍然是32,如果他们决定改变它,他们会把它作为一个selectjoin(即你将不得不要求新的经纱尺寸)。

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

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

“ CUDA C最佳实践指南”包含有关这些优化的所有技术信息。

直接的答案是简短的。 在Nvidia中,由THREADs组成的BLOCK由程序员设置,warp为32(包含32个线程),这是计算单元同时执行的最小单位。 在AMD中,它被称为波前(wave)。

在OpenCL中,WORKGROUP意味着CUDA中的BLOCK,更重要的是,CITA中的WORKITEMs意味着THREAs。

依靠经纱的概念,我无法find更好的解释。 简而言之,经线来自SIMD范例。 无论如何, 减less的例子已经澄清了这个问题对我来说。