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执行功能(内核)是执行一个网格的块的线程.
这是逻辑层次结构.您真的只需要了解逻辑层次结构以在GPU上实现一个功能,但是为了获得性能,您需要了解硬件,即SM和SP.
GPU由SM组成,每个SM包含许多SP.目前每个SM有8个SP,每个GPU有1到30个SM,但实际数字确实不是主要问题,直到你真正进步.
性能考虑的第一点是warp.warp是一组32个线程(如果你在一个块中有128个线程(例如),那么线程0-31将在一个warp中,32-63在下一个中,依此类推.由于一些原因,warp非常重要,最重要的是:
因此,了解了扭曲是什么,最后一点是块和网格如何映射到GPU上.
每个块将从一个SM开始,并将保持在那里直到它完成.一旦完成,它将退出,并且可以在SM上启动另一个块.正是这种动态调度为GPU提供了可扩展性 - 如果你有一个SM,那么所有块都在一个大队列上的同一个SM上运行,如果你有30个SM,那么这些块将在SM上动态调度.因此,您应该确保在启动GPU功能时,网格由大量块(至少数百个)组成,以确保它可以跨任何GPU进行扩展.
最后要说明的是,SM可以在任何给定时间执行多个块.这解释了为什么SM可以处理768个线程(或某些GPU中的更多线程),而块只能处理512个线程(当前).实质上,如果SM具有可用资源(寄存器和共享存储器),那么它将占用额外的块(最多8个).占用计算器电子表格(包含在SDK中)将帮助您确定随时可以执行的块数.
对不起大脑转储,观看网络研讨会 - 它会更容易!
一开始有点令人困惑,但了解每个 SP 执行类似于 4 路 SMT 的操作会有所帮助 - 它循环通过 4 个线程,每个时钟发出一条指令,每条指令有 4 个周期的延迟。这就是如何在 8 个 SP 上运行每个 warp 32 个线程。
我将向您推荐nVidia CUDA 论坛,而不是通过扭曲、块、线程等来讨论所有其余的内容,其中此类问题经常出现,并且已经有一些很好的解释。