Each Grid of Blocks executes on a single device. (e.g Device has 9 MP)
是的!
Each Block of Threads executes on a single MultiProcessor. (e.g 1 MP has 8 SP/Cores).
是的!
Each Group of Threads (called warps) executes on a SP/Core.
不!通常,一个 warp(所有当前硬件上的 32 个线程)分布在内核之间。
Now, if I assume that
I have a total of 72 Cores (9*8) ,
I call kernel with 9 blocks and 8 threads,total 72 threads.
All the 72 threads will run in parallel ?
是的!但不会很快……
However, If I call more than that, then they will not run in parallel ?
它们将并行运行。 GPU 通过超额订阅获得良好的性能。一个核心不能在一个周期内完成一条指令,并且需要许多周期才能返回(这被称为latency)。通过拥有比内核更多的线程,您可以在正在启动的指令和它执行之间的间隙中发出另一条指令。这是您从 GPU 中获得最佳性能的唯一方法 - 通过每个内核拥有多个线程 - 并且是 GPU 编程的基础。一个 SM 可以拥有多少线程是有限制的,但通常您需要尽可能多的线程,是内核数量的几倍。
从程序员的角度来看,网格中的所有线程都是并行运行的。从硬件的角度来看,每个 SM 都与其他每个 SM 并行运行。每个 SM 可以有多个 warp,每个周期执行指令。每条指令在 SM 的内核上并行执行。每个核心在其管道中可以有许多操作。
程序员的观点和硬件的观点之间的细微差别在于硬件中存在基于资源的依赖关系。程序员看不到这些依赖项。