19

i am having some troubles understanding threads in NVIDIA gpu architecture with cuda.

please could anybody clarify these info: an 8800 gpu has 16 SMs with 8 SPs each. so we have 128 SPs.

i was viewing stanford's video presentation and it was saying that every SP is capable of running 96 threads cuncurrently. does this mean that it (SP) can run 96/32=3 warps concurrently?

moreover, since every SP can run 96 threads and we have 8 SPs in every SM. does this mean that every SM can run 96*8=768 threads concurrently?? but if every SM can run a single Block at a time, and the maximum number of threads in a block is 512, so what is the purpose of running 768 threads concurrently and have a max of 512 threads?

a more general question is:how are blocks,threads,and warps distributed to SMs and SPs? i read that every SM gets a single block to execute at a time and threads in a block is divided into warps (32 threads), and SPs execute warps.

4

2 回答 2

68

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

当您在 GPU 上执行函数(内核)时,它会作为线程网格执行。

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

这就是逻辑层次结构。您实际上只需要了解在 GPU 上实现功能的逻辑层次结构,但是要获得性能,您还需要了解硬件,即 SM 和 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 个线程都将沿着两侧向下。功能上没有问题,那些不应该采取分支的线程被禁用,所以你总是会得到正确的结果,但如果双方都很长,那么性能损失很重要。
  • 经线中的线程(实际上是半经线,但如果您将其正确用于经线,那么您在下一代也很安全)从内存中获取数据,因此如果您可以确保所有线程都在同一个内获取数据'segment' 那么你只需支付一笔内存交易,如果它们都从随机地址中获取,那么你将支付 32 笔内存交易。有关详细信息,请参阅Advanced CUDA C演示文稿,但前提是您已准备好!
  • Warp 中的线程(在当前 GPU 上也是半 Warp)一起访问共享内存,如果您不小心,您将遇到“银行冲突”,其中线程必须彼此排队才能访问内存。

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

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

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

很抱歉脑残,观看网络研讨会 - 会更容易!

于 2010-02-06T16:19:05.373 回答
3

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

与其用扭曲、块、线程等来处理所有其他的东西,我会推荐你​​到nVidia CUDA 论坛,这类问题经常出现,并且已经有一些很好的解释。

于 2010-02-05T13:48:44.367 回答