一連の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