2

一連のFMA命令を生成して、パフォーマンステストを実行しようとしています。ただし、CC2.0およびCC3.0コンパイラにFMA命令を生成させることができないようです。

コンパイルした場合:

for (float x = 0; x < loop; x++) {
  a += x * loop;
  a += x * loop;
  ... (6 more repetitions)
}

フロートloopもありますが、次の行ごとに次のようになりますa += x * loop;

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;  

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用にコンパイルすると、FFMAの代わりにFMUL/FADD命令が返されます。CC 1.0用にコンパイルすると、FFMA命令が返されます。

この結果は、を使用したCC 2.0コンパイラcompute_20,sm_20、およびリリースビルドとデバッグビルドの両方で得られます。

とを指定-use_fast_mathしてみました--fmad=true。CUDA 4.2および5.0ウィザードを使用してプロジェクトを作成し、デフォルト設定を変更しませんでした。

環境:

  • Windows764ビット
  • Visual Studio 2010
  • CUDA 4.2 + CUDA 5.0(4.2の上に5.0がインストールされています)
  • GPU:シングルGTX660
  • Nsight 3.0 RC1

  • Windows764ビット
  • Visual Studio 2010
  • CUDA 4.2
  • Nsight 2.2
  • GPU:シングルGTX570
4

1 に答える 1

2

スイッチをnvccに渡すと、-Gコード生成に影響し、出力ファイルに追加される追加のデバッグ情報(シンボル)も生成されます。nvccのドキュメントによると、スイッチの説明は-G「デバイスデバッグ情報の生成」ではなく、実際には「デバッグ可能なデバイスコードの生成」です。

-Gスイッチを使用すると、デバイスコードの生成が大幅に異なる場合が多くあります。この場合、個別のMUL / ADDシーケンスを優先して、FMA命令の生成を禁止しているように見えます。

于 2013-02-10T04:32:54.020 に答える