帮我理解cuda

帮我理解cuda,cuda,gpu,parallel-processing,Cuda,Gpu,Parallel Processing,我在使用cuda理解NVIDIA gpu体系结构中的线程时遇到一些问题 请任何人澄清这些信息: 8800 gpu有16条短信,每条短信有8个SP。所以我们有128个SP 我正在观看斯坦福大学的视频演示,它说每个SP目前都能运行96个线程。这是否意味着它(SP)可以同时运行96/32=3个扭曲 此外,由于每个SP可以运行96个线程,并且每个SM中有8个SP。这是否意味着每个SM可以同时运行96*8=768个线程??但是,如果每个SM一次可以运行一个块,并且一个块中的最大线程数是512,那么并发运行

我在使用cuda理解NVIDIA gpu体系结构中的线程时遇到一些问题

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

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

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


一个更普遍的问题是:如何将块、线程和扭曲分布到SMs和SP?我了解到,每个SM一次执行一个块,块中的线程被分为多个线程(32个线程),SP执行多个线程。

一开始有点让人困惑,但知道每个SP执行类似于4路SMT的操作很有帮助-它在4个线程中循环,每个时钟发出一条指令,每条指令上有4个周期的延迟。这就是为什么在8个SP上运行每个扭曲32个线程的原因

不要用经纱、方块、线段等来浏览所有的东西,我会向你推荐,这种问题经常出现,已经有一些很好的解释。

< P>你应该在英伟达网站上查看一下,你可以参加现场会议或查看预先录制的会议。下面是一个快速的概述,但我强烈建议您观看网络研讨会,它们将非常有帮助,因为您可以看到图表并同时对其进行解释

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

  • 线程是最精细的粒度,每个线程在块中都有一个唯一的标识符(threadIdx),用于选择要对哪些数据进行操作。线程可以有相对大量的寄存器,也可以有一个称为本地内存的私有内存区域,用于寄存器文件溢出和任何大型自动变量
  • 块是一组在批处理中一起执行的线程。这种粒度级别的主要原因是块中的线程可以通过使用快速共享内存进行通信进行协作。每个块都有一个唯一的标识符(blockIdx),它与threadIdx一起用于选择数据
  • 网格是一起执行GPU操作的一组块
这就是逻辑层次。在GPU上实现功能只需要了解逻辑层次结构,但是要获得性能,还需要了解硬件,即SMs和SPs

GPU由SMs组成,每个SM包含多个SP。目前,每个SM有8个SP,每个GPU有1到30个SMs,但在您真正进步之前,实际数量并不是主要问题

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

  • 一条经线内的线被绑定在一起,如果一条经线内的一条线沿着if-else块的“if”侧走,而其他的线沿着“else”侧走,那么实际上所有32条线都会沿着两边走。从功能上来说,没有问题,那些不应该走分支的线被禁用,因此您将始终得到正确的结果,但如果双方都是多头,那么表现惩罚就很重要
  • 扭曲内的线程(实际上是半扭曲,但如果你对扭曲正确,那么你在下一代上也是安全的)从内存一起获取数据,因此,如果您可以确保所有线程获取同一“段”内的数据,那么您将只支付一个内存事务,如果它们都从随机地址获取数据,那么您将支付32个内存事务。有关此方面的详细信息,请参阅演示文稿,但仅当您准备好时
  • 扭曲内的线程(在当前GPU上也是半扭曲)一起访问共享内存,如果您不小心,就会出现“银行冲突”,线程必须排在后面才能访问内存
因此,了解了扭曲是什么之后,最后一点是如何将块和网格映射到GPU上

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

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


很抱歉让人脑筋急转弯,请观看网络研讨会-这会更容易!

希望我在回答中已经解释过,但重要的一点是,每个SM在任何给定时间都可以执行多个块。此外,数字96是一条红鲱鱼,不必担心每个SP的线程数,只需担心每个SM的线程数,并让硬件处理fi详细信息。@Tom:Sever