在内联PTX中避免不必要的mov操作

时间:2012-03-31 14:51:12

标签: cuda inline-assembly ptxas

在单独的文件中编写PTX时,可以将内核参数加载到寄存器中:

.reg .u32 test;
ld.param.u32 test, [test_param];

但是,在使用内联PTX时,在CUDA中使用内联PTX程序集(版本01)应用程序说明描述了一种语法,其中加载参数与另一个操作紧密相关。它提供了这个例子:

asm("add.s32 %0, %1, %2;" : "=r"(i) : "r"(j), "r"(k));

生成:

ld.s32 r1, [j];
ld.s32 r2, [k];
add.s32 r3, r1, r2;
st.s32 [i], r3;

在许多情况下,有必要将这两项操作分开。例如,可能希望将参数存储在循环外的寄存器中,然后重用并修改循环内的寄存器。我发现这样做的唯一方法是使用额外的mov指令,将参数从隐式加载的寄存器移动到我以后可以使用的另一个寄存器。

当从单独的文件中的PTX移动到内联PTX时,有没有办法避免这个额外的mov指令?

1 个答案:

答案 0 :(得分:3)

如果我是你,我不会太担心那些移动操作。

请记住,PTX不是最终的汇编代码。 在内核启动之前,PTX会进一步编译为CUBIN。其中,最后一步执行寄存器分配,并将删除所有不必要的mov操作。

特别是,如果您从%r1移至%r2,然后根本不使用%r1,则该算法可能会分配%r1和{{1} }到相同的硬件寄存器并删除移动。