Fermi GPU(GTX 580)中已执行配置指令和发布指令的奇怪结果

时间:2011-07-06 08:14:53

标签: cuda opencl gpu gpgpu ptxas

我的内核有这样的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)是否对已发出指令的数量和执行指令的数量有影响? 感谢

2 个答案:

答案 0 :(得分:2)

PTX只是编译代码的中间表示。它不是GPU实际执行的内容。还有一个组装步骤可以发出GPU运行的代码,这可以在编译时发生,也可以在驱动程序中使用JIT编译。因此,您的指令很重要,而您从中推断的任何内容都无效。

NVIDIA推出了一款名为cuobjdump的工具,它可以反汇编为Fermi卡生成的汇编输出,并显示在GPU上运行的实际机器代码

答案 1 :(得分:2)

请记住,PTX并不完全是在GPU上执行的操作。 PTX仅仅是一种中间表示。真正的代码是.cubin文件。 这就是为什么根据ptx源代码进行这样的累积计算毫无意义。

您可以使用CUDA 4.0提供的cuobjdump --sass工具将.cubin文件中的GPU汇编代码提取为更易读的内容。