Can 1 CUDA-core to process more than 1 float-point-instruction per clock (Maxwell)?
Nvidia GPU列表-GeForce 900系列-写道:
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 = 3494 GFlops峰值(3494400 MFlops)
我们可以在"处理能力(峰值)GFLOPS-单精度"列中看到此值。
但是为什么我们必须乘以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核心包含两个单位:FP32单位和INT单位。但是INT单位与GFlops(每秒浮点运算)无关。
即一个SMM包含:
- 128 FP32单元
- 128 INT单位
- 32 SFU单位
- 32 LD / ST单元
要获得GFlops的性能,我们应该仅使用:128个FP32单元和32个SFU单元。
即如果同时使用128个FP32单元和32个SFU单元,则每1 SM的每个时钟可以获得160条带浮点运算的指令。
即我们必须乘以1,2 =(160/132)instad 2。
1664内核* 1050 MHz * 1,2 = 2096 Glops峰值
为什么在Wiki中写到我们必须将Cores * MHz乘以2?
CUDA"核心"(也称为SP)最通常是指SM(流式多处理器)中的单精度浮点单元。 CUDA内核可以在每个时钟周期启动一个单精度浮点指令。 (该单元是流水线的,因此它可以每个时钟启动一条指令,并且可以每个时钟退役一条指令,但是无法在给定的时钟周期内完全处理给定的指令。)
例如,如果该指令是单精度加法或单精度乘法,则该内核可以每个时钟贡献一个浮点运算,因为加法或乘法算作一个浮点运算。另一方面,如果该指令是FMA指令(浮点乘法加法),则内核将在同一时间段内执行浮点乘法和浮点加法运算。这意味着一条指令实际上可以执行两项操作。在计算峰值理论吞吐量时,FMA的这种用法会导致2倍增。
因此,一个内核只能在每个时钟上处理(即启动,退出)一条指令,但是如果该指令是FMA,则算作两个浮点运算。