2

我正在尝试通过生成一系列 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;

计算_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;  

计算_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_mathand --fmad=true。我使用 CUDA 4.2 和 5.0 向导创建了项目,并且没有更改默认设置。

环境:

  • Windows 7 64 位
  • 视觉工作室 2010
  • CUDA 4.2 + CUDA 5.0(5.0 安装在 4.2 之上)
  • GPU:单GTX660
  • Nsight 3.0 RC1

  • Windows 7 64 位
  • 视觉工作室 2010
  • CUDA 4.2
  • Nsight 2.2
  • GPU:单GTX570
4

1 回答 1

2

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

在许多情况下,使用 -G 开关会导致设备代码生成大不相同。在这种情况下,它似乎抑制了 FMA 指令的生成,以支持单独的 MUL/ADD 序列。

于 2013-02-10T04:32:54.020 回答