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 包含:
- 128 FP32-单元
- 128 INT 单位
- 32 SFU单元
- 32 LD/ST-unit
要获得 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,则它算作两个浮点运算。
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 包含:
- 128 FP32-单元
- 128 INT 单位
- 32 SFU单元
- 32 LD/ST-unit
要获得 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,则它算作两个浮点运算。