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

Esk*_*kil 44 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
Run Code Online (Sandbox Code Playgroud)

我想我听说每个CUDA核心都可以并行运行warp,并且warp是32个线程.说卡可以并行运行512*32 = 16384个线程,或者我离开了,CUDA内核是不是真的并行运行?

har*_*ism 61

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

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

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

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

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

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

最重要的比较总是在实际应用中测量挂钟时间.


Cyg*_*sX1 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个"标量线程".

  • @ CygnusX1,说一个CPU可以拥有任意并发线程,这与24,576个线程的GPU占用率计算不公平.原因是GPU在片上有足够的资源来实际同时驻留24,576个线程.这意味着它可以在这些驻留warp之间切换,而无需在片外或片上移动任何数据.CPU在片上的资源有限; 因此,虽然它们可能支持任意数量的"并发"线程,但这些线程并非全部驻留在芯片上; 每个核心超过2个需要移入和移出寄存器. (4认同)