CUDA 中每个 SM 的核心数和每个块的线程数
Amount of cores per SM and threads per block in CUDA
随着 NVIDIA GPU 的发展,每个 SM 的核心数量也会发生变化:根据白皮书,在 Fermi 中我们有 32 个,但在 Maxwell 中这个数字是 128。所以,我的问题如下:
- 用块创建网格是否更好,每个块包含 128 个线程?这样的代码会不会运行更快?
- 术语"warp"是否保持不变,32 个线程?
- 在 Cliff Woolley 的一个名为 "CUDA overview" 的演讲中,我读到每个 Fermi SM 都拥有 2 个能够维持 "up to 1536 threads concurrently" 的扭曲调度器。鉴于我们有 32 个内核,这怎么可能?他的意思是最多48个blocks 32个thread每个都可以排队等候以占用cores,所以它的32*48 = 1536?
Is that better to create grids with blocks, containing 128 threads each? Will such code run faster?
最佳块大小取决于问题。您的块大小是 warp 大小的倍数是一个想法。其他因素是占用注意事项和共享内存使用。
Does the term "warp" remain the same, 32 threads?
到目前为止,NVIDIA 指定的每个架构都有 32 个线程的 warp 大小,尽管编程模型不能保证这一点。
In a presentation called "CUDA overview" by Cliff Woolley I read that each Fermi SM posses 2 warp schedulers which are able to maintain "up to 1536 threads concurrently". How is that possible given that we have 32 cores? He means that up 48 blocks 32 thread each can wait in queue in order to occupy the cores, so its 32*48 = 1536?
GPU 通过超额订阅工作。它们需要每个内核有多个线程才能高效运行。 GPU 可以零开销在线程之间切换,因此通过超额订阅内核,您可以通过在下一个时钟周期从不同线程向同一内核发出指令来保持内核忙碌。
随着 NVIDIA GPU 的发展,每个 SM 的核心数量也会发生变化:根据白皮书,在 Fermi 中我们有 32 个,但在 Maxwell 中这个数字是 128。所以,我的问题如下:
- 用块创建网格是否更好,每个块包含 128 个线程?这样的代码会不会运行更快?
- 术语"warp"是否保持不变,32 个线程?
- 在 Cliff Woolley 的一个名为 "CUDA overview" 的演讲中,我读到每个 Fermi SM 都拥有 2 个能够维持 "up to 1536 threads concurrently" 的扭曲调度器。鉴于我们有 32 个内核,这怎么可能?他的意思是最多48个blocks 32个thread每个都可以排队等候以占用cores,所以它的32*48 = 1536?
Is that better to create grids with blocks, containing 128 threads each? Will such code run faster?
最佳块大小取决于问题。您的块大小是 warp 大小的倍数是一个想法。其他因素是占用注意事项和共享内存使用。
Does the term "warp" remain the same, 32 threads?
到目前为止,NVIDIA 指定的每个架构都有 32 个线程的 warp 大小,尽管编程模型不能保证这一点。
In a presentation called "CUDA overview" by Cliff Woolley I read that each Fermi SM posses 2 warp schedulers which are able to maintain "up to 1536 threads concurrently". How is that possible given that we have 32 cores? He means that up 48 blocks 32 thread each can wait in queue in order to occupy the cores, so its 32*48 = 1536?
GPU 通过超额订阅工作。它们需要每个内核有多个线程才能高效运行。 GPU 可以零开销在线程之间切换,因此通过超额订阅内核,您可以通过在下一个时钟周期从不同线程向同一内核发出指令来保持内核忙碌。