CUDA变形和每个块的最佳线程数

时间:2015-09-30 00:04:06

标签: c++ cuda gpgpu nvidia

根据我对Kepler GPU和CUDA的理解,当单个SMX单元在块上工作时,它会启动经线,这些经线是32个线程的组。现在我的问题是:

1)如果SMX单元可以在64个warp上工作,这意味着每个SMX单元的限制为32x64 = 2048个线程。但是Kepler GPU有4个warp调度程序,这是否意味着在GPU内核中只能同时处理4个warp?如果是这样,这是否意味着我应该真正寻找具有128个线程倍数的块(假设线程没有分歧)而不是推荐的32个?这当然是忽略了任何分歧,甚至是像全局内存访问这样的情况会导致warp停顿并让调度程序切换到另一个的情况。

2)如果上述情况正确,单个SMX设备同时处理128个线程的最佳结果是什么?对于像GTX Titan那样有14个SMX单元,总共128x14 = 1792个线程?我看到网上的数字说不然。 Titan可以运行14x64(每个SMX的最大warp)x32(每个SMX的线程数)= 28,672个。怎么可能是SMX单位推出warp,只有4个warp调度程序?他们无法同时为每个SMX启动所有2048个线程?也许我对GPU可以同时启动的最大线程数的定义感到困惑,你可以排队什么?

我很感激答案和澄清。

1 个答案:

答案 0 :(得分:3)

  

这是否意味着在GPU内核中只能同时处理4个warp?

可以在kepler SMX上的任何给定时钟周期中安排最多4个warp的指令。但是由于执行单元中的管道,在任何给定的时钟周期,指令可能处于从当前驻留在SMX上的任何和最多所有warp的管道执行的各个阶段。

  

如果是这样,这是否意味着我应该真正寻找具有128个线程倍数的块(假设线程没有分歧)而不是推荐的32?

我不确定你是如何从前一点跳到这一点的。由于指令混合可能从warp变为warp(因为不同的warp可能在指令流中的不同点)并且指令混合在指令流中从一个地方到另一个地方不同,所以我看不到4个warp之间的任何逻辑连接在给定的时钟周期中可调度,并且需要具有4个warp的组。给定的warp可能处于其指令高度可调度的点(可能是SP FMA的序列,需要SP内核,这是很多),另外3个warp可能在指令流的另一个点,其指令是& #34;更难安排" (可能需要SFU,其数量较少)。因此,任意将warp分组成4组都没有多大意义。请注意,我们不要求warp的分歧与彼此不同步。调度程序的自然行为与执行资源的不同可用性相结合,可能会创建最初在一起的warp,位于指令流的不同位置。

对于您的第二个问题,我认为您的基本知识差距在于理解GPU如何隐藏延迟。假设GPU有一组3条指令可以在warp中发出:

LD R0, a[idx]
LD R1, b[idx]
MPY R2, R0, R1

第一条指令是来自全局内存的LD,它可以被发出并且不会使warp停顿。同样可以发布第二条指令。然而,由于全局存储器的延迟,warp将在第3条指令停止。在R0和R1正确填充之前,不能调度乘法指令。主存储器的延迟会阻止它。 GPU通过(希望)准备好提供其他工作来处理这个问题"它可以转向,即处于未安装状态的其他扭曲(即具有可以发出的指令)。促进此延迟隐藏过程的最佳方法是让SMX可以使用许多 warp。没有任何粒度(例如需要4个warp)。一般来说,网格中的线程/ warp /块越多,GPU就越有可能隐藏延迟。

所以GPU确实无法启动" 2048个线程(即从2048个线程发出指令)在一个时钟周期。但是当一个经线停转时,它会被置于一个等待的队列中,直到失速状态被解除为止,直到那时,在下一个时钟周期内有其他经线准备好了#34;是有帮助的。

GPU延迟隐藏是一个经常被误解的主题。如果您搜索它们,有许多可用的资源可供学习。