CUDA:共有多less个并发线程?

我有一个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内核并不是真的并行运行?

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

不要混淆并发和吞吐量。 上面的数字是可以同时在片上存储资源的线程的最大数量 – 可以驻留的数量。 在CUDA方面,我们也称这个最大的入住率 。 硬件之间的硬件切换不断地帮助掩盖或“隐藏”存储器访问的(大)延迟以及算术stream水线的(小)延迟。

虽然每个SM可以有48个常驻程序,但是在每个时钟周期,它只能从less量的程序指令(GTX 580的平均值在1到2之间,但取决于程序指令组合)。

因此,比较吞吐量可能更好,这是由可用执行单元确定的,以及硬件如何能够执行多重问题。 在GTX580上,有512个FMA执行单元,也可以是各种组合,可以双发(即同时发出两个经线的独立指令)的整数单元,特殊function单元,存储指令单元等。

考虑到上面的所有这些太困难了,所以大多数人比较两个指标:

  1. 峰值GFLOP / s(对于GTX 580是512 FMA单位* 2个触发器/ FMA * 1544e6个周期/秒= 1581.1 GFLOP / s(单精度))
  2. 在您感兴趣的应用程序上测量吞吐量。

最重要的比较是在实际的应用程序上测量挂钟时间。

通过与2或4核CPU进行比较,您可能会遇到某些陷阱:

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

  • 2或4核CPU可以有任意多个并发线程! 与GPU类似,从某种意义上讲,添加更多的线程不会有帮助,甚至可能会减慢速度。

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

  • CPU支持超线程,允许单个内核轻松并发地处理2个线程。 因此,操作系统实际上可能比硬件核心多出两倍的“逻辑核心”。

综上所述:为公平比较,由于SIMD和超线程,您的4核CPU实际上可以同时运行32个“标量线程”。

我意识到这有点迟,但我想我会帮忙的。 从第10页开始,CUDA 费米架构白皮书:

每个SM具有两个warp调度器和两个指令调度单元,允许同时发布和执行两个warp。

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