4

Nvidia GPU 列表 - GeForce 900 系列- 上面写着:

4 单精度性能计算为着色器数量乘以基本内核时钟速度的2 倍。

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

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

我们可以在列中看到这个值 - 处理能力(峰值)GFLOPS - 单精度。

但是为什么我们必须乘以 2呢?

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

SMM 使用基于象限的设计,具有四个 32 核处理块,每个处理块都有一个专用的 warp 调度程序,能够在每个时钟调度两条指令。

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

我们知道 1 个 CUDA-Core 包含两个单元:FP32-unit 和 INT-unit。但是 INT-unit 与 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) 而不是 2。

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

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

在此处输入图像描述

在此处输入图像描述

4

1 回答 1

12

总结:在 FP 吞吐量的标准计算中,一个 FMA 算作 2 FLOP,即使在为单个执行单元在单个指令中执行此操作的机器上也是如此(这是它避免中间舍入的方法,即 FMA 的融合部分)。


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

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

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

于 2015-10-03T18:17:59.823 回答