我的内核有这样的ptx版本:
.version 2.2
.target sm_20, texmode_independent
.entry histogram(
.param .u32 .ptr .global .align 4 histogram_param_0,
.param .u32 .ptr .global .align 4 histogram_param_1
)
{
.reg .f32 %f<2>;
.reg .s32 %r<12>;
_histogram:
mov.u32 %r1, %tid.x;
mov.u32 %r2, %envreg3;
add.s32 %r3, %r1, %r2;
mov.u32 %r4, %ctaid.x;
mov.u32 %r5, %ntid.x;
mad.lo.s32 %r6, %r4, %r5, %r3;
shl.b32 %r7, %r6, 2;
ld.param.u32 %r8, [histogram_param_0];
add.s32 %r9, %r8, %r7;
ld.param.u32 %r10, [histogram_param_1];
ld.global.f32 %f1, [%r9];
add.s32 %r11, %r10, %r7;
st.global.f32 [%r11], %f1;
ret;
}
据我所知,我的内核中只有13条指令(不包括ret指令)。当我将工作项数设置为5120时,工作组大小为64.由于有16个SM,每个SM中有32个标量处理器,因此上述代码将在SM中执行10次。正如我所预期的那样,执行指令的数量应该是10 * 13 = 130.但在我分析之后,结果是:发出指令= 130,执行intructions = 100。 1.为什么发出的指令数量与执行指令的数量不同?没有分支,所以它们不应该是平等的吗? 2.为什么执行指令的数量小于预期?是否应该至少执行ptx版本中的所有指令? 3.缓存未命中(L1和L2)是否对已发出指令的数量和执行指令的数量有影响? 感谢
答案 0 :(得分:2)
PTX只是编译代码的中间表示。它不是GPU实际执行的内容。还有一个组装步骤可以发出GPU运行的代码,这可以在编译时发生,也可以在驱动程序中使用JIT编译。因此,您的指令很重要,而您从中推断的任何内容都无效。
NVIDIA推出了一款名为cuobjdump
的工具,它可以反汇编为Fermi卡生成的汇编输出,并显示在GPU上运行的实际机器代码
答案 1 :(得分:2)
请记住,PTX并不完全是在GPU上执行的操作。 PTX仅仅是一种中间表示。真正的代码是.cubin文件。 这就是为什么根据ptx源代码进行这样的累积计算毫无意义。
您可以使用CUDA 4.0提供的cuobjdump --sass
工具将.cubin文件中的GPU汇编代码提取为更易读的内容。