我試圖通過生成一系列FMA指令來運行性能測試。但是,我似乎無法獲得CC 2.0和CC 3.0編譯器生成FMA指令。如何獲取CC 2.0和3.0編譯器以生成FMA指令?
如果我編譯:
compute_10,sm_10:
a += x * loop;
0x0001ffa0 [0103] mov.f32 %f11, %f2;
0x0001ffa0 MOV R3, R2;
0x0001ffa8 [0104] ld.param.f32 %f12, [__cudaparm__Z6kernelPfifS__loop];
0x0001ffa8 MOV32I R2, 0x28;
0x0001ffb0 LDC R2, c[0x0][R2];
0x0001ffb8 [0105] mov.f32 %f13, %f4;
0x0001ffb8 MOV R0, R0;
0x0001ffc0 [0106] mad.f32 %f14, %f12, %f13, %f11;
0x0001ffc0 FFMA.FTZ R2, R2, R0, R3;
0x0001ffc8 [0107] mov.f32 %f2, %f14;
0x0001ffc8 MOV R2, R2;
for (float x = 0; x < loop; x++) {
a += x * loop;
a += x * loop;
... (6 more repetitions)
}
哪裏loop
也是浮動的,我得到了爲a += x * loop;
每條線以下compute_30,sm_30:
a += x * loop;
0x00044688 [0101] mul.f32 %f14, %f30, %f7;
0x00044688 FMUL R5, R4, R0;
0x00044690 [0102] add.f32 %f15, %f13, %f14;
0x00044690 FADD R3, R3, R5;
也就是說,編譯CC 3.0時,我得到FMUL/FADD指令而不是FFMA。編譯CC 1.0時,我得到一個FFMA指令。
我還在CC 2.0編譯器上用compute_20,sm_20
得到了這個結果,並且在發佈和調試版本上都得到了這個結果。
我試圖指定-use_fast_math
和--fmad=true
。我使用CUDA 4.2和5.0嚮導創建了項目,並且未對默認設置進行更改。
環境:
- 視窗7 64位
- 的Visual Studio 2010
- CUDA 4.2 + CUDA 5.0(安裝在4.2頂部5.0)
- GPU:單GTX660
- Nsight 3.0 RC1
and
- 的Windows 7 64位
- Visual Studio 2010中
- CUDA 4.2
- Nsight 2.2
- GPU:單GTX570
'loop'的值是什麼? – Mikhail 2013-02-10 01:15:04
@Mikhail:'loop'是一個浮點內核參數。我一直在傳遞100.0f的值。 – 2013-02-10 01:17:31
我用cuda 5.0和一個非常簡單的內核在cc2.0上生成fma指令並不困難。也許你可以發佈一個完整的,可編輯的例子。這是我做過的[例子](http://pastebin.com/2ZAQmGa8),雖然在linux上。 – 2013-02-10 01:21:48