2013-02-10 55 views
2

我試圖通過生成一系列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
+0

'loop'的值是什麼? – Mikhail 2013-02-10 01:15:04

+0

@Mikhail:'loop'是一個浮點內核參數。我一直在傳遞100.0f的值。 – 2013-02-10 01:17:31

+0

我用cuda 5.0和一個非常簡單的內核在cc2.0上生成fma指令並不困難。也許你可以發佈一個完整的,可編輯的例子。這是我做過的[例子](http://pastebin.com/2ZAQmGa8),雖然在linux上。 – 2013-02-10 01:21:48

回答

2

薪火-G開關NVCC影響代碼生成和也生成要添加到輸出文件的附加調試信息(符號)。根據nvcc documentation-G交換機的說明不是「生成設備調試信息」,而是實際上「生成可調試設備代碼」。

會有很多情況下使用-G開關會導致設備代碼生成大不相同。在這種情況下,它似乎抑制了FMA指令的產生,有利於單獨的MUL/ADD序列。

+0

我爲此提交了一個低優先級的錯誤報告,因爲Nsight for Visual Studio中的開關描述只說「生成GPU調試信息」和「指定GPU調試信息是否由CUDA編譯器生成」。 – 2013-02-10 07:02:58