帮我理解cuda

时间:2010-02-05 12:37:40

标签: cuda gpu parallel-processing

我在使用cuda了解NVIDIA gpu架构中的线程时遇到了一些麻烦。

请任何人澄清这些信息: 一个8800 gpu有16个SM,每个有8个SP。所以我们有128个SP。

我正在观看斯坦福的视频演示,并且说每个SP都能够在当前运行96个线程。这是否意味着它(SP)可以同时运行96/32 = 3个warp?

此外,由于每个SP可以运行96个线程,并且每个SM都有8个SP。这是否意味着每个SM可以同时运行96 * 8 = 768个线程?但是如果每个SM一次只能运行一个Block,并且一个块中的最大线程数是512,那么同时运行768个线程并且最多有512个线程的目的是什么?

更普遍的问题是:如何将块,线程和warp分配给SM和SP?我读到每个SM一次只执行一个块,块中的线程分为warp(32个线程),SP执行warp。

2 个答案:

答案 0 :(得分:55)

您应该查看NVIDIA网站上的webinars,您可以加入实时会话或查看预先录制的会话。下面是一个快速概述,但我强烈建议您观看网络研讨会,它们将真正有所帮助,因为您可以看到图表并同时进行解释。

当您在GPU上执行某个函数(内核)时,它将作为 线程 grid 执行。

  • 线程是最精细的粒度,每个线程在块(threadIdx)中都有唯一的标识符,用于选择要操作的数据。该线程可以有相对大量的寄存器,还有一个称为本地存储器的私有存储区,用于寄存器文件溢出和任何大型自动变量。
  • 是一组在批处理中一起执行的线程。这种粒度级别的主要原因是块中的线程可以通过使用快速共享内存进行通信来协作。每个块都有一个唯一标识符(blockIdx),它与threadIdx一起用于选择数据。
  • 网格是一组共同执行GPU操作的块。

这是逻辑层次结构。您真的只需要了解逻辑层次结构以在GPU上实现一个功能,但是为了获得性能,您还需要了解SMs和SP的硬件。

GPU由SM组成,每个SM包含许多SP。目前每个SM有8个SP,每个GPU有1到30个SM,但实际数字并不是一个主要问题,直到你真正进步。

要考虑性能的第一点是 warps 。 warp是一组32个线程(如果你在一个块中有128个线程(例如),那么线程0-31将在一个warp中,32-63在下一个中,依此类推。由于一些原因,warp非常重要,最重要的是:

  • warp中的线程被绑定在一起,如果warp中的一个线程沿着if-else块的'if'侧下移而其他线程沿着'else'下移,那么实际上所有32个线程都会向下移动。在功能上没有问题,那些不应该使用分支的线程被禁用,因此你总能得到正确的结果,但如果双方都很长,那么性能损失很重要。
  • warp中的线程(实际上是半warp,但是如果你适合warp那么你对下一代也是安全的)同时从内存中获取数据,所以如果你能确保所有线程都获取数据在同一个“段”内,您只需支付一个内存事务,如果它们都是从随机地址获取,那么您将支付32个内存事务。有关详细信息,请参阅Advanced CUDA C演示文稿,但仅在您准备就绪后才能看到!
  • warp中的线程(再次是当前GPU上的半warp)一起访问共享内存,如果你不小心,你将会遇到“银行冲突”,线程必须排在队列后面才能访问存储器。 / LI>

因此,了解了扭曲是什么,最后一点是块和网格如何映射到GPU上。

每个块将从一个SM开始,并将保持在那里直到它完成。一旦完成,它将退出,并且可以在SM上启动另一个块。正是这种动态调度为GPU提供了可扩展性 - 如果你有一个SM,那么所有块都在一个大队列上的同一个SM上运行,如果你有30个SM,那么这些块将在SM上动态调度。因此,您应该确保在启动GPU功能时,网格由大量块(至少数百个)组成,以确保它可以跨任何GPU进行扩展。

要做的最后一点是SM可以在任何给定时间执行多个块。这解释了为什么SM可以处理768个线程(或某些GPU中的更多线程),而块只能处理512个线程(当前)。实质上,如果SM具有可用资源(寄存器和共享存储器),那么它将占用额外的块(最多8个)。占用计算器电子表格(包含在SDK中)将帮助您确定随时可以执行的块数。

抱歉大脑转储,观看网络研讨会 - 它会更容易!

答案 1 :(得分:2)

起初有点令人困惑,但有助于知道每个SP都执行类似4路SMT的操作 - 它循环通过4个线程,每个时钟发出一条指令,每条指令有4个周期的延迟。这就是你如何在8个SP上运行每个warp 32个线程。

我不会通过经线,块,线程等来完成所有剩余的东西,而是会引导您到nVidia CUDA Forums,这类问题会定期出现,并且已经有了一些很好的解释