在单独的文件中编写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指令?
答案 0 :(得分:3)
如果我是你,我不会太担心那些移动操作。
请记住,PTX不是最终的汇编代码。
在内核启动之前,PTX会进一步编译为CUBIN。其中,最后一步执行寄存器分配,并将删除所有不必要的mov
操作。
特别是,如果您从%r1
移至%r2
,然后根本不使用%r1
,则该算法可能会分配%r1
和{{1} }到相同的硬件寄存器并删除移动。