如何让CC 2.0和3.0编译器生成FMA指令?

时间:2013-02-10 00:57:41

标签: cuda

我正在尝试通过生成一系列FMA指令来运行性能测试。但是,我似乎无法让CC 2.0和CC 3.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时,我得到FMUL / FADD指令而不是FFMA。在编译CC 1.0时,我得到一条FFMA指令。

我也在带有compute_20,sm_20的CC 2.0编译器以及发布和调试版本上得到了这个结果。

我尝试指定-use_fast_math--fmad=true。我使用CUDA 4.2和5.0向导创建了项目,并且没有对默认设置进行任何更改。

环境:

  • Windows 7 64位
  • Visual Studio 2010
  • CUDA 4.2 + CUDA 5.0(5.0安装在4.2之上)
  • GPU:单台GTX660
  • Nsight 3.0 RC1

  • Windows 7 64位
  • Visual Studio 2010
  • CUDA 4.2
  • Nsight 2.2
  • GPU:单个GTX570

1 个答案:

答案 0 :(得分:2)

-G开关传递给nvcc会影响代码生成,还会生成要添加到输出文件的其他调试信息(符号)。根据{{​​3}},-G开关的描述不是“生成设备调试信息”,而是实际上“生成可调试的设备代码”。

在许多情况下,使用-G开关会导致设备代码生成明显不同。在这种情况下,它似乎会禁止生成FMA指令,转而采用单独的MUL / ADD序列。