关于cuda的问题

时间:2009-12-30 16:26:38

标签: architecture cuda gpu

我正在研究GPU编程,并希望了解有关CUDA的更多信息。我已经阅读了很多关于它的内容(来自维基百科,Nvidia和其他参考文献),但我仍然有一些问题:

  1. 以下对架构的描述是否准确?:GPU具有多处理器,每个多处理器都有流处理器,每个流处理器可以同时运行线程块。

  2. 所有引用都声明在一个块中创建的最小线程数是32 ...为什么会这样?

  3. 我有一张ATI Radeon显卡。我能够在没有仿真模式的情况下编译一个简单的CUDA程序!!我以为我只能在支持的Nvidia VGA上编译和运行CUDA程序。有人可以解释一下吗?

3 个答案:

答案 0 :(得分:6)

1 - 对于NVIDIA gpus来说也是如此。

2 - 这是硬件设计的约束。

3 - 编译在CPU上完成,因此您可以编译程序,就像在x86上交叉编译PPC一样。

如果你想在ATI卡上运行gpu程序,我建议你看一下OpenCL或AMD Stream。

答案 1 :(得分:6)

CUDA线程非常轻量级,可以安排/停止,只需要很少的惩罚。这与CPU线程不同,后者在执行时切换有很多开销。因此,CPU非常适合任务并行,而GPU在数据并行性方面表现优异。

  1. 在CUDA架构中,(NVIDIA)GPU具有“流式多处理器”(SM),每个处理器将执行一个线程块。每个SM都有一组流处理器(SP),每个流处理器将在任何给定时刻(周期)执行一个线程的指令。

  2. 实际上块内的最小线程数是1。如果每个块只有一个线程,则代码将正确执行。但是,设置块使其具有32个线程的倍数要高效得多。这是由于硬件在“warp”(32个线程)上安排操作的方式。

  3. 您可以交叉编译您的程序。您可以在仿真模式下运行它,即CPU正在“模拟”CUDA GPU,但要在硬件上运行,您需要一个NVIDIA GPU(启用CUDA,最近,2006年左右之后的任何事情都可以)。

  4. 高端当前一代GPU有240个核心(SP),您可以将其视为在任何给定时刻执行240个线程,但将GPU视为执行数千个线程非常有用同时,因为加载了多个线程的状态(上下文)。

    我认为认识到CPU线程和GPU线程之间存在差异非常重要。它们具有相同的名称,但GPU线程是轻量级的,通常在一小部分数据上运行。也许这将有助于考虑一组(一组)CPU线程做非并行工作,然后每个CPU线程分成数千个GPU线程进行数据并行工作,然后它们连接回CPU线程。显然,如果你能让CPU线程与GPU同时工作,那就更好了。

    请记住,与CPU不同,GPU是一种吞吐量架构,这意味着代替缓存来隐藏延迟,程序应该创建许多线程,以便当一些线程等待数据从内存返回时,其他线程可以执行。我建议您从GPU Technology Conference观看“CUDA高级C”演讲,了解更多信息。

答案 2 :(得分:2)

  1. 是。每个GPU都是矢量处理器 SIMD (单指令多数据)处理器的阵列。在单个线程向量中 - 可以是32,64或其他数字,具体取决于GPU - 每个线程在锁定步骤中执行内核的相同指令。该基本单元有时被称为“扭曲”或“波前”或有时称为“SIMD”。

    对于NVIDia芯片来说,32似乎是典型的,ATI是64。 IIRC,Itel的Larrabee芯片的数量应该更高,如果该芯片是制造出来的话。

  2. 在硬件级别,线程以这些单位执行,但编程模型允许您拥有任意数量的线程。如果您的硬件实现了32位波前,并且您的程序只请求1个线程,则该硬件单元的31/32将处于空闲状态。因此,以32(或其他)的倍数创建线程是最有效的方法(假设您可以对其进行编程,以便所有线程都可以正常工作)。

    硬件实际发生的是每个线程至少有一位。表示线程是否“活着”。波前32的额外未使用线程实际上将进行计算,但是无法将任何结果写入任何内存位置,因此就好像它们从未执行过一样。

    当GPU为某些游戏渲染图形时,每个线程都在计算单个像素(如果打开了抗锯齿,则为子像素),并且每个渲染的三角形可以具有任意数量的像素,对吧?如果GPU只能渲染包含32个像素的精确倍数的三角形,那么效果不会很好。

  3. goger的回答说明了一切。

  4. 虽然您没有特别提出要求,但GPU内核避免分支也非常重要。由于wavefront中的所有32个线程必须同时执行相同的指令,所以当代码中有if .. then .. else时会发生什么?如果warp中的某些线程想执行“then”部分而某些线程想要执行“else”部分?答案是所有32个线程都执行这两个部分!这显然需要两倍的时间,因此你的内核将以半速运行。