cuda - 1 个 CUDA 内核能否在每个时钟(麦克斯韦)处理超过 1 个浮点指令?

标签 cuda benchmarking gpgpu nvidia 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.



IE。例如对于 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 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 无关( 浮点 每秒操作数)。

IE。一个 SMM 包含:
  • 128 FP32 单元
  • 128 INT单元
  • 32 SFU-单元
  • 32 LD/ST 单元

  • 中获得演出GFlops 我们应该只使用:128 个 FP32 单元和 32 个 SFU 单元。

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

    IE。我们必须多个 由 1,2 =(160/132) 等于 2。

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

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

    enter image description here

    enter image description here

    最佳答案

    摘要:一个 FMA 算作 2 FLOP s 在 FP 吞吐量的标准核算中,即使在为单个执行单元在单个指令中执行此操作的机器上(这是它避免中间舍入的方式,fused part of FMA)。

    CUDA“核心”(也称为 SP - 流式处理器)最常指的是 SM(流式多处理器)中的单精度浮点单元。一个 CUDA 内核可以在每个时钟周期启动一条单精度浮点指令。 (该单元是流水线的,因此它可以在每个时钟启动一条指令,并且可以在每个时钟退出一条指令,但它不能在给定的时钟周期内完全处理给定的指令。)
    例如,如果该指令是单精度加法或单精度乘法,则该内核可以贡献一个浮点 操作每个时钟,因为加法或乘法算作一个浮点运算。另一方面,如果指令是 FMA 指令(浮点乘加),那么内核将在同一时间段内执行浮点乘法和浮点加法运算。这意味着实际上两个 运营 由单个 执行指令 .在计算峰值理论吞吐量时,这种 FMA 的使用会产生 2 乘数。
    因此,一个内核每个时钟只能处理(即启动、退出)一条指令,但如果该指令是 FMA,则它算作两个浮点操作。

    关于cuda - 1 个 CUDA 内核能否在每个时钟(麦克斯韦)处理超过 1 个浮点指令?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32908892/

    相关文章:

    cuda - CUDA 扭曲中的线程是否在多处理器上并行执行?

    c++ - 如何分配指针数组并为cuda中的多个内核调用保留它们

    c++11 - 谷歌/基准 : BENCHMARK_TEMPLATE syntax

    cuda - 如何在根本不优化的情况下编译cuda内核?

    python - C++ 程序字符串搜索的速度可以和 python 一样快吗?

    c++ - 在 C(也许是 C++)中寻找数值/多媒体/信号处理基准

    c++ - 在OpenCL中以编程方式选择最佳GPU的最佳方法是什么?

    c - 为什么我的 cuda C 代码在单精度下没有变得更快?

    cuda - 为什么使用少于最大线程数会使我的内核运行得更快?

    cuda - 机器上的多个 CUDA 版本 nvcc -V 混淆