我在使用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。
答案 0 :(得分:55)
您应该查看NVIDIA网站上的webinars,您可以加入实时会话或查看预先录制的会话。下面是一个快速概述,但我强烈建议您观看网络研讨会,它们将真正有所帮助,因为您可以看到图表并同时进行解释。
当您在GPU上执行某个函数(内核)时,它将作为块 线程的 grid 执行。
这是逻辑层次结构。您真的只需要了解逻辑层次结构以在GPU上实现一个功能,但是为了获得性能,您还需要了解SMs和SP的硬件。
GPU由SM组成,每个SM包含许多SP。目前每个SM有8个SP,每个GPU有1到30个SM,但实际数字并不是一个主要问题,直到你真正进步。
要考虑性能的第一点是 warps 。 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中)将帮助您确定随时可以执行的块数。
抱歉大脑转储,观看网络研讨会 - 它会更容易!
答案 1 :(得分:2)
起初有点令人困惑,但有助于知道每个SP都执行类似4路SMT的操作 - 它循环通过4个线程,每个时钟发出一条指令,每条指令有4个周期的延迟。这就是你如何在8个SP上运行每个warp 32个线程。
我不会通过经线,块,线程等来完成所有剩余的东西,而是会引导您到nVidia CUDA Forums,这类问题会定期出现,并且已经有了一些很好的解释