nVIDIA GPU可以从特殊寄存器存储到内存吗?

时间:2017-06-02 23:31:17

标签: cuda ptx nvidia-sass

在调查使用%laneid的方式时,我正在摆弄一些SASS。在一个人的生命浪费了一分钟的失误之后(对不起 - 你知道你是谁),我现在有了以下内容:

CUDA代码:

__forceinline__ __device__ unsigned lane_id()
{
    unsigned ret;
    asm volatile ("mov.u32 %0, %laneid;" : "=r"(ret));
    return ret;
}

__global__ void dummy(unsigned *C)
{
    C[0] = lane_id();
}

SASS(适用于SM 6.1):

    /*0008*/                   MOV R1, c[0x0][0x20];            /* 0x4c98078000870001 */
    /*0010*/         {         MOV R2, c[0x0][0x140];           /* 0x4c98078005070002 */
    /*0018*/                   S2R R0, SR_LANEID;        }      /* 0xf0c8000000070000 */
                                                                /* 0x001ffc011e2007ff */
    /*0028*/                   MOV R3, c[0x0][0x144];           /* 0x4c98078005170003 */
    /*0030*/                   STG.E [R2], R0;                  /* 0xeedc200000070200 */
    /*0038*/                   EXIT;                            /* 0xe30000000007000f */
                                                                /* 0x001f8000fc0007ff */
    /*0048*/                   BRA 0x40;                        /* 0xe2400fffff07000f */
    /*0050*/                   NOP;                             /* 0x50b0000000070f00 */
    /*0058*/                   NOP;                             /* 0x50b0000000070f00 */
                                                                /* 0x001f8000fc0007e0 */
    /*0068*/                   NOP;                             /* 0x50b0000000070f00 */
    /*0070*/                   NOP;                             /* 0x50b0000000070f00 */
    /*0078*/                   NOP;                             /* 0x50b0000000070f00 */

因此,STG指令 - 存储到全局存储器我猜 - 不会立即采用SR_LANEID,而是由内联PTX将其放置到的寄存器。这是因为(Pascal)GPU无法从特殊寄存器存储,还是错过了优化机会?

1 个答案:

答案 0 :(得分:2)

您不能直接从特殊注册簿存储;需要特殊操作(S2R)来读取特殊寄存器的值。

基本原理:给出所有寻址模式以访问特殊寄存器的指令都会对抗RISC哲学,并且(根据我的拙见)不会很好地花费指令位,考虑到这种操作在实践中会发生的可能性