帮我理解cuda

sca*_*man 16 parallel-processing cuda gpu

我在使用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.

Tom*_*Tom 57

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

当您在GPU执行功能(内核)是执行一个网格线程.

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

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

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

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

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

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

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

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

对不起大脑转储,观看网络研讨会 - 它会更容易!

  • **Advanced CUDA C** 链接不再指向任何内容。请更新链接。 (3认同)
  • @Tom:自 2010 年以来,有些事情发生了变化,您能否更新答案中的各个数字(特别是最后一段)。这对我们来说真的很有帮助。 (2认同)

Pau*_*l R 3

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

我将向您推荐nVidia CUDA 论坛,而不是通过扭曲、块、线程等来讨论所有其余的内容,其中此类问题经常出现,并且已经有一些很好的解释。