CUDA:总共有多少并发线程?

时间:2011-06-27 08:58:02

标签: cuda gpgpu

我有一台GeForce GTX 580,我想说明一下可以(理想情况下)实际并行运行的线程总数,以便与2或4个多核CPU进行比较。

deviceQuery为我提供了以下可能相关的信息:

CUDA Capability Major/Minor version number:    2.0
(16) Multiprocessors x (32) CUDA Cores/MP:     512 CUDA 
Maximum number of threads per block:           1024

我想我听说每个CUDA核心都可以并行运行warp,并且warp是32个线程。如果卡可以并行运行512 * 32 = 16384个线程,或者我是否已经关闭并且CUDA核心在某种程度上并不真正并行运行,这是正确的吗?

3 个答案:

答案 0 :(得分:57)

GTX 580可以同时运行16 * 48个并发warp(每个32个线程)。这是16个多处理器(SM)* 48个驻留warp每个SM * 32个线程每个warp = 24,576个线程。

不要混淆并发和吞吐量。上面的数字是其资源可以同时存储在芯片上的最大线程数 - 可以驻留的数字。在CUDA术语中,我们也将此最大占用称为。硬件在warp之间不断切换,以帮助覆盖或“隐藏”内存访问的(大)延迟以及算术流水线的(小)延迟。

虽然每个SM可以有48个驻留扭曲,但它只能在每个时钟周期发出一小部分指令(GTX 580的平均值介于1和2之间,但这取决于程序指令组合)。

因此,您可能最好比较吞吐量,吞吐量取决于可用的执行单元以及硬件如何执行多个问题。在GTX580上,有512个FMA执行单元,但也有整数单元,特殊功能单元,存储器指令单元等,它们可以以各种组合双重发布(即同时发出来自2个经线的独立指令)。

考虑到以上所有因素太难了,所以大多数人都会对两个指标进行比较:

  1. 峰值GFLOP / s(GTX 580为512 FMA单位*每FMA 2个触发* 1544e6周期/秒= 1581.1 GFLOP / s(单精度))
  2. 您感兴趣的应用程序的测量吞吐量。
  3. 最重要的比较总是在实际应用中测量挂钟时间。

答案 1 :(得分:9)

通过与2核或4核CPU进行比较,您可以陷入某些陷阱:

  • 并发线程数与实际并行运行的线程数不匹配。当然,您可以在GTX 580上同时启动24576个线程,但最佳值在大多数情况下会降低。

  • 2核或4核CPU可以拥有任意多个并发线程!与GPU类似,从某些方面来说,添加更多线程无济于事,甚至可能会减慢速度。

  • “CUDA核心”是单个标量处理单元,而CPU核心通常是更大的东西,包含例如4宽SIMD单元。要比较苹果,你应该将公布的CPU核心数乘以4,以匹配NVIDIA称之为核心的内核。

  • CPU支持超线程,它允许单个内核以轻微的方式同时处理2个线程。因此,操作系统实际上可能会看到比硬件核心多2倍的“逻辑核心”。

总结一下:为了公平比较,由于SIMD和超线程,你的4核CPU实际上可以同时运行32个“标量线程”。

答案 2 :(得分:0)

我意识到这有点晚了但我觉得无论如何我都会帮帮忙。从第10页开始,CUDA Fermi架构白皮书:

  

每个SM都有两个   warp调度程序和两个指令调度单元,允许同时发出和执行两个warp。

对我来说,这意味着每个SM可以同时运行2 * 32 = 64个线程。我不知道这是否意味着GPU可以同时运行16 * 64 = 1024个线程。