1 个 CUDA 内核能否在每个时钟(Maxwell)中处理超过 1 个浮点指令?

Can 1 CUDA-core to process more than 1 float-point-instruction per clock (Maxwell)?

List of Nvidia GPU - GeForce 900 Series - 上面写着:

4 Single precision performance is calculated as 2 times the number of shaders multiplied by the base core clock speed.

即例如,对于 GeForce GTX 970,我们可以计算性能:

1664 核 * 1050 MHz * 2 = 3 494 GFlops 峰值(3 494 400 MFlops)

我们可以在列 - Processing Power (peak) GFLOPS - Single Precision 中看到这个值。

但为什么我们必须 乘以 2

里面写着:http://devblogs.nvidia.com/parallelforall/maxwell-most-advanced-cuda-gpu-ever-made/

SMM uses a quadrant-based design with four 32-core processing blocks each with a dedicated warp scheduler capable of dispatching two instructions per clock.

好的,nVidia Maxwell 是超标量架构,每个时钟分派两条指令,但是 1 个 CUDA 核心 (FP32-ALU) 每个时钟可以处理多于 1 条指令吗?

我们知道1个CUDA-Core包含两个单元:FP32-unit和INT-unit。但是 INT 单位与 GFlops(FLoating-point 每秒操作数)无关。

即一个 SMM 包含:

要获得 GFlops 的性能,我们应该只使用:128 个 FP32 单元和 32 个 SFU 单元。

即如果我们同时使用 128 个 FP32 单元和 32 个 SFU 单元,那么每 1 个 SM 每个时钟可以获得 160 个浮点运算指令。

即我们必须将 乘以 1,2 =(160/132) 而不是 2.

1664 核 * 1050 MHz * 1,2 = 2 096 GFlops 峰值

为什么在 wiki 中写到我们必须将 Cores*MHz 乘以 2?

总结:1 个 FMA 算作 2 个 FLOPs in the standard accounting of FP throughput, even on machines that do it in a single instruction for a single execution unit (which is how it avoids intermediate rounding, the fused part of FMA)。


CUDA“核心”(也称为 SP - 流式处理器)最常指的是 SM(流式多处理器)中的单精度浮点单元。 CUDA 核心可以在每个时钟周期启动一条单精度浮点指令。 (该单元是流水线的,因此它每个时钟可以启动一条指令,每个时钟可以退出一条指令,但它不能在给定的时钟周期内完全处理给定的指令。)

例如,如果该指令是单精度加法或单精度乘法,则该内核每个时钟可以贡献一个浮点操作,因为加法或乘法计数作为一个浮点运算。另一方面,如果指令是 FMA 指令(浮点乘加),则内核将同时执行浮点乘法 浮点加法运算时期。这意味着实际上两个 操作 是由单个 指令 执行的。在计算峰值理论吞吐量时,FMA 的这种用法会产生 2 个乘数。

因此一个内核每个时钟只能处理(即启动、退出)一条指令,但如果该指令是 FMA,则它算作两个浮点运算。