我正在尝试通过生成一系列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向导创建了项目,并且没有对默认设置进行任何更改。
环境:
和
答案 0 :(得分:2)
将-G
开关传递给nvcc会影响代码生成,还会生成要添加到输出文件的其他调试信息(符号)。根据{{3}},-G
开关的描述不是“生成设备调试信息”,而是实际上“生成可调试的设备代码”。
在许多情况下,使用-G开关会导致设备代码生成明显不同。在这种情况下,它似乎会禁止生成FMA指令,转而采用单独的MUL / ADD序列。