1
我编流动简单的测试内核(CUDA5,SM2.0):CUDA编译器产生unoptimal汇编
__device__ void TestKernel(int *pdata)
{
int a0,b0,c0;
a0 = pdata[0];
b0 = pdata[1];
c0 = a0 + b0;
pdata[2] = c0;
}
,并希望像流淌汇编:
LD R3,[R0]
LD R4,[R0+4]
IADD R4,R4,R3
ST [R0+8],R4
但cuobjdump --dump - 我看到流动更长的结果:
/*0000*/ /*0x10001de428000000*/ MOV R0, R4;
/*0008*/ /*0x00001de428000000*/ MOV R0, R0;
/*0010*/ /*0x00001de428000000*/ MOV R0, R0;
/*0018*/ /*0x00001de428000000*/ MOV R0, R0;
/*0020*/ /*0x0000dc8580000000*/ LD R3, [R0];
/*0028*/ /*0x0c00dde428000000*/ MOV R3, R3;
/*0030*/ /*0x10011c034800c000*/ IADD R4, R0, 0x4;
/*0038*/ /*0x10011de428000000*/ MOV R4, R4;
/*0040*/ /*0x00411c8580000000*/ LD R4, [R4];
/*0048*/ /*0x10011de428000000*/ MOV R4, R4;
/*0050*/ /*0x1030dc0348000000*/ IADD R3, R3, R4;
/*0058*/ /*0x20001c034800c000*/ IADD R0, R0, 0x8;
/*0060*/ /*0x00001de428000000*/ MOV R0, R0;
/*0068*/ /*0x0000dc8590000000*/ ST [R0], R3;
/*0070*/ /*0x00001de790000000*/ RET;
/*0078*/ /*0x00001de780000000*/ EXIT;
/*0080*/ /*0x00001de780000000*/ EXIT;
对我很陌生MOVs指令在地址8,10,18,28 ,38,60 也不使用加载/存储指令中的直接偏移量。 所以反而期望4(实际上6包括RET,EXIT)指令我得到15 什么是可能的原因?
您显示的代码是设备函数,而不是内核,或者是一个错误?此外,你确定这不是一个带有调试设置的版本(当然看起来像)。请添加您使用的确切编译命令。 – talonmies
你用'-G'编译?我只会得到类似你用'-G'编译时发布的代码。如果没有,我会得到一个包含RET的5个指令的函数。 –
-G应该是调试信息,而不是禁用优化,并且它对分析有用。我将重新检查此问题,但 – BaraBashkaD