performance - GT200 单精度峰值性能

标签 performance cuda benchmarking

我试图验证引用 GT200 卡的单精度峰值性能。

来自http://www.realworldtech.com/gt200/9/ ,我们有两个关于 GT200 的事实 –

  1. SP 内核最快操作的延迟为 4 个周期。
  2. SFU 也需要 4 个周期才能完成一次操作。

现在,每个 SM 总共有 8 个 SP 和 2 个 SFU,每个 SFU 有 4 个 FP 乘法单元,这些 SP 和 SFU 可以同时工作,因为它们位于两个不同的端口上,如 SM 级别图中所述。每个SP都可以执行MAD操作。

因此,我们正在研究每 4 个 SP 周期 8 个 MAD 操作和 8 个 MUL 操作。这使得每 4 个 SP 时钟周期有 16 + 8 = 24 次操作,因为 MAD 算作 2 次操作。由于 2 SP 时钟周期算作一个着色器时钟,因此每个着色器时钟有 24/2 = 12 次操作。 对于引用 GT200 卡,着色器时钟 = 1296 MHz/s。

因此,单精度峰值性能必须 = 1296 MHz/s * 30 SM * 每个着色器时钟 12 次操作 = 466.560 GFLOPS

这恰好是规范中报告的 GFLOPS 的一半。那么我哪里出错了?

编辑:在 Robert 指出 CUDA 编程指南说 8MAD/着色器时钟可以在 GT200 SM 中执行之后,我不得不质疑在这个特定的情况下延迟和吞吐量如何相互关联SM。

存在 1 个 OP/4 个 SP 周期的延迟(如前所述),因此每 4 个 SP 周期有 1 个 MAD,对吧?我们有 8 个 SP,因此 SM 中每 4 个 SP 周期就变成 8 个 MAD。

由于 2 个 SP 周期形成一个着色器周期,因此每 2 个着色器时钟周期我们剩下 => 8MAD => 每个着色器时钟 4 MAD。

这与编程指南中的 8MAD/着色器时钟不匹配。 那么,我又做错了什么?

最佳答案

延迟和吞吐量不是一回事。

A cc 1.x SM 可以 retire 8 single precision floating point MAD operations在每个时钟周期。

这是正确的公式:

1296 MHz(cycle/s) * 30 SM * (8 SP/SM  * 2 flop/cycle per SP + 2 SFU/SM * 4 FPU/SFU * 1 flop/cycle per FPU)

= 622080 Mflop/s + 311040 Mflop/s = 933 GFlop/s single precision

来自here

编辑:您所指的 4 周期延迟是向 SM 发出的 warp(即 32 个线程)MAD 指令的延迟,< em>不是单个 SP 上单个 MAD 操作的延迟。每个SP中的FPU每个时钟可以生成1个MAD结果,并且一个SM中有8个SP,因此每个SM每个时钟可以生成8个MAD结果。由于扭曲(32 线程)MAD 指令需要 32 个 MAD 结果,因此总共需要 4 个时钟来完成扭曲指令,如发送到 SM 中的 SP。

SP 中的 FPU 每个时钟可以生成一个新的 MAD 结果。从指令问题的角度来看,基本单位是经纱。因此,一条 warp MAD 指令需要 4 个时钟才能完成。

编辑2:回答下面的问题。

前言:交换网板中的FPU不支持独立调度。它们仅在向 SFU 调度指令时发挥作用。每个 SFU 有 4 个 FPU,一条 SFU 指令需要 16 个周期(因为有 2 个 SFU/SM)才能完成一次扭曲。如果两个 SFU 中的所有 4 个 FPU 均得到充分利用,则在 16 个周期内计算 SFU 指令期间将产生 128 (16x4x2) 个触发器。这被添加到 SM 中的“常规”MAD FPU 在同一时间(16 个周期)内可以生成的 256 (16x2x8) 总触发器中。

您的问题似乎是在解释观察到的基准测试结果和文本中的这一陈述:

表 III 还显示单精度的吞吐量 浮点乘法为 11.2 次操作/时钟,这意味着 乘法可以同时发送给 SP 和 SFU 单位。这表明每个 SFU 单元都能够执行以下操作: 每个周期 2 次乘法,吞吐量是其他的两倍 (更复杂)映射到该单元的指令。

作为 SFU 中 FPU 吞吐量或 SFU 中 FPU 数量的指示。然而,您将基准数据与理论数字混为一谈。 SFU 有 4 个 FPU,但这并不意味着所有 4 个 FPU 都可以独立调度用于任意算术或指令流。查看所有 4 个 FPU 在给定周期中执行新的浮点指令可能需要作者未使用过的特定指令序列。

关于performance - GT200 单精度峰值性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21683837/

相关文章:

mysql - 主索引与索引的查询性能

php - PHP/SQL 中的 "About a hour ago"逻辑及其如何影响性能?

c - 我们是否需要考虑 CUDA 的缓存抖动?

cuda - cufftGetSize1d 中的 CUFFT_INVALID_VALUE

c - 为什么与 Redis 的单一连接性能不佳以及如何使其更快

PHP switch 语句 VS if elseif 语句基准

java - Hibernate 为每个查询生成不同的 SQL

performance - FPDF 有很多图像,有什么办法可以加快速度吗?

java - Java 中的高性能原始数组生成器

cuda - 动态并行和 CC 2.0 代码位于同一库中