我有一个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 回答
GTX 580可以同时运行16 * 48个并发warp(每个32个线程) . 那就是16个多处理器(SM)* 48个驻留warp每个SM * 32个线程每个warp = 24,576个线程 .
不要混淆并发和吞吐量 . 上面的数字是其资源可以同时存储在芯片上的最大线程数 - 可以驻留的数量 . 在CUDA术语中,我们也将此称为最大占用率 . 硬件在warp之间不断切换,以帮助覆盖或(16)内存访问的(大)延迟以及算术流水线的(小)延迟 .
虽然每个SM可以有48个常驻warp,但它只能在每个时钟周期发出一小部分指令(GTX 580的平均值介于1和2之间,但这取决于程序指令组合) .
因此,您可能最好比较吞吐量,这是由可用的执行单元以及硬件如何执行多个问题决定的 . 在GTX580上,有512个FMA执行单元,但也有整数单元,特殊功能单元,存储器指令单元等,它们可以以各种组合双重发布(即同时发出来自2个经线的独立指令) .
考虑到以上所有因素太难了,所以大多数人都会对两个指标进行比较:
峰值GFLOP / s(GTX 580为512 FMA单位每个FMA 2个触发 1544e6个周期/秒= 1581.1 GFLOP / s(单精度))
您感兴趣的应用程序的测量吞吐量 .
最重要的比较总是在实际应用中测量挂钟时间 .
通过与2核或4核CPU进行比较,您可以陷入某些陷阱:
并发线程数与实际并行运行的线程数不匹配 . 当然,您可以在GTX 580上同时启动24576个线程,但最佳值在大多数情况下会降低 .
2或4核CPU可以拥有任意多个并发线程!与GPU类似,从某些方面添加更多线程无济于事,甚至可能会减慢速度 .
“CUDA核心”是单个标量处理单元,而CPU核心通常是更大的东西,包含例如4宽SIMD单元 . 要比较苹果与苹果,您应该将公布的CPU核心数乘以4以匹配NVIDIA称之为核心的数据 .
CPU支持超线程,它允许单个内核以轻微的方式同时处理2个线程 . 因此,操作系统实际上可能会看到比硬件核心多2倍的“逻辑核心” .
总结一下:为了公平比较,由于SIMD和超线程,你的4核CPU实际上可以同时运行32个“标量线程” .
我意识到这有点晚了但我觉得无论如何我都会帮忙 . 从第10页开始,CUDA Fermi架构白皮书:
对我来说,这意味着每个SM可以同时运行2 * 32 = 64个线程 . 我不知道这是否意味着GPU可以同时运行16 * 64 = 1024个线程 .