我试图验证参考GT200卡的单精度峰值性能。
从http://www.realworldtech.com/gt200/9/开始,我们有两个关于GT200的事实 -
现在,每个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的一半。那么我哪里出错?
编辑:在罗伯特指向CUDA编程指南的指针表明8MADs /着色器时钟可以在GT200 SM中执行之后,我将不得不质疑延迟和吞吐量在这个特定的情况下如何相互关联SM。
有一个OP / 4 SP周期的延迟(如前所述),因此每4个SP周期就有一个MAD,对吧?我们有8个SP,因此在SM中每4个SP周期变为8个MAD。
由于2个SP循环形成一个着色器循环,因此我们留下=>每2个着色器时钟周期8MAD =>每个着色器时钟4个MAD。
这与编程指南中的8MAD /着色器时钟不匹配。 那么,我又做错了什么?
答案 0 :(得分:4)
延迟和吞吐量不是一回事。
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> not 单个SP上单个MAD操作的延迟。每个SP中的FPU可以在每个时钟生成一个MAD结果,并且在一个SM中有8个SP,因此每个SM可以在每个时钟生成8个MAD结果。由于warp(32个线程)MAD指令需要32个MAD结果,因此需要4个总时钟来完成warp指令,如发给SM中的SP。
SP中的FPU可以为每个时钟生成一个新的MAD结果。从指令问题的角度来看,基本单位是扭曲。因此,warp MAD指令需要4个时钟才能完成。
EDIT2:回答以下问题。
前言:SFU中的FPU不能独立调度。它们仅在向SFU安排指令时才起作用。每个SFU有4个FPU,SFU指令需要16个周期(因为有2个SFU / SM)才能完成转换。如果两个SFU中的所有4个FPU都被充分利用,那么在SFU指令计算期间产生的128(16x4x2)个触发器将在16个周期内产生。这被添加到256个(16x2x8)总触发器中,这些触发器可以在同一时间(16个周期)内由SM中的“常规”MAD FPU生成。
您的问题似乎是在文本中解释观察到的基准测试结果和此声明:
表III还显示了单精度的吞吐量 浮点乘法是11.2 ops / clock,这意味着 该乘法可以发给SP和SFU 单位。这表明每个SFU单元都能够做到 每个循环2次乘法,是其他循环的两倍 映射到此单元的(更复杂的)指令。
表示SFU中FPU的吞吐量或SFU中的FPU数量。但是,您将基准数据与理论数字混为一谈。 SFU有4个FPU,但这并不意味着所有4个都可以独立调度任意算术或指令流。看到所有4个FPU在给定周期中采用新的浮点指令可能需要作者未使用的特定指令序列。