Cuda PTX注册申报和使用

时间:2015-03-27 10:02:21

标签: c++ cuda gpgpu nvidia ptx

我正在尝试减少内核中使用寄存器的次数,因此我决定尝试使用内联PTX。

这个内核:

#define Feedback(a, b, c, d, e) d^e^(a&c)^(a&e)^(b&c)^(b&e)^(c&d)^(d&e)^(a&d&e)^(a&c&e)^(a&b&d)^(a&b&c)

__global__ void Test(unsigned long a, unsigned long b, unsigned long c, unsigned long d, unsigned long e, unsigned long f, unsigned long j, unsigned long h, unsigned long* res)
{
    res[0] = Feedback( a, b, c, d, e );  
    res[1] = Feedback( b, c, d, e, f );
    res[2] = Feedback( c, d, e, f, j );  
    res[3] = Feedback( d, e, f, j, h );
}  

使用14个寄存器,我认为这不仅仅是需要,所以我写的是Inline PTX:

    __global__ void Feedback_ASM(unsigned long a, unsigned long b, unsigned long c, unsigned long d, unsigned long e, unsigned long f, unsigned long j, unsigned long h, unsigned long* res)
{
asm(".reg .u32 %r<10>;\n");

// 1
asm("ld.param.u32   %r1, [__cudaparm__Z7Feedback_ASMmmmmmmmmPm_a];\n"
    "ld.param.u32   %r2, [__cudaparm__Z7Feedback_ASMmmmmmmmmPm_b];\n"
    "ld.param.u32   %r3, [__cudaparm__Z7Feedback_ASMmmmmmmmmPm_c];\n"
    "ld.param.u32   %r4, [__cudaparm__Z7Feedback_ASMmmmmmmmmPm_d];\n"
    "ld.param.u32   %r5, [__cudaparm__Z7Feedback_ASMmmmmmmmmPm_e];\n");

asm("and.b32 %r7, %r1, %r3;\n"
    "xor.b32 %r8, %r7, %r4;\n"
    "xor.b32 %r7, %r8, %r5;\n"
    "and.b32 %r8, %r1, %r5;\n"
    "xor.b32 %r9, %r7, %r8;\n"
    .............................
    "xor.b32 %r8, %r7, %r9;\n"
    "and.b32 %r6, %r1, %r2;\n"
    "and.b32 %r7, %r6, %r3;\n"
    "xor.b32 %r9, %r7, %r8;\n");

asm("ld.param.u32   %r8, [__cudaparm__Z7Feedback_ASMmmmmmmmmPm_res];\n"
    "st.global.u32  [%r8+0], %r9;");     
// 2
...
// 3
...
// 4
...
}     

但是这个内核也使用了14个寄存器!我有点困惑。我只声明了10个寄存器,在ptx文件中没有其他变量。我怎么能解决这个问题呢?

1 个答案:

答案 0 :(得分:2)

如前所述,PTX是一个中间代码。 PTX&#34;注册&#34;是虚拟寄存器,并不一定反映实际的设备寄存器使用情况。

要了解实际的设备寄存器使用情况,请使用ptxas verbose选项进行编译:

nvcc -Xptxas -v ...

或使用其中一个分析器。您还可以使用以下方法直接检查机器代码:

cuobjdump -sass myexe

(其中myexe被可执行文件的名称替换。)

要控制寄存器的使用,可以使用nvcc编译选项:

nvcc -maxrregcount 10 ...

(其中10被替换为您想要将代码中的所有内核限制为每个线程的寄存器数量),或者您可以在代码中使用launch bounds指令,该指令可以控制内核上的寄存器使用情况 - by-kernel basis。