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

CUDA:总共有多少个并发线程?,cuda,gpgpu,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

我有一个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核心可以并行运行一个扭曲,一个扭曲是32个线程。如果说该卡可以并行运行512*32=16384个线程,是正确的,还是说我离CUDA内核的并行运行还有一段距离呢?

GTX 580可以一次运行16*48个并发线程(每个线程32个)。也就是说,16个多处理器(SMs)*48个驻留扭曲/SM*32个线程/扭曲=24576个线程

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

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

因此,比较吞吐量可能会更好,吞吐量由可用的执行单元和硬件执行多问题的能力决定。在GTX580上,有512个FMA执行单元,但也有整数单元、特殊功能单元、内存指令单元等,它们可以以不同的组合双重发出(即同时从2个扭曲发出独立指令)

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

  • 峰值GFLOP/s(GTX 580为512个FMA单元*2次/FMA*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个“标量线程”。

    我意识到这有点晚了,但我想我还是会帮忙的。CUDA体系结构白皮书第10页:

    每个SM都有两个特征 warp调度器和两个指令调度单元,允许同时发出和执行两个warp


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

    谢谢。为什么CUDA内核数(512)与并发扭曲数(16*48=768)不同?如果是512个Cuda内核*48个线程/warp=24576个线程,则更有意义。你确定不是每条经线48条吗?每条经线32条。这是目前所有cuda卡上的一个常数。@Eskil,是的,我是肯定的。您需要小心,因为我认为您混淆了并发性和吞吐量。我已经更新了我的答案…@harrism,非常感谢您的解释。如果您将可以并行化的东西(例如,数值求解偏微分方程)从单个CPU线程(即根本不并行化)上传输,您将获得大约多少倍(数量级?)的加速在一个用低级语言编写的程序中,运行在带有CUDA或OpenCL代码的GTX 580上?我记得值4,但现在,当我检查它时,似乎你是对的。我的观点是正确的。@CygnusX1,说一个CPU可以有任意的may并发线程,这与计算24576个线程的GPU占用率是不公平的。原因是GPU在芯片上有足够的资源,可以同时驻留24576个线程。这意味着它可以在这些驻留翘曲之间切换,而无需将任何数据移出芯片或在芯片上移动。CPU在芯片上的资源非常有限;因此,尽管它们可能支持任意数量的“并发”线程,但这些线程并不都驻留在芯片上;每个核心超过2个需要将上下文移入和移出寄存器。我同意额外的线程需要将上下文移入和移出寄存器,但它可能仍然会落在本地一级或二级缓存中(我相信这些都是片上缓存,对吗?)。我不知道有多少线程可以保存在那里,但肯定超过2个-如果它们很小的话。然而,我同意,所有这些线程都不能由硬件管理,这就是为什么我后来谈到SIMD和超线程。因此24576只是“存储”在芯片上的线程数,而不是实际同时运行的线程数。但实际上有多少可以同时运行呢?或者,答案是什么