Cuda nVIDIA GPU能否从特殊寄存器存储到内存?

Cuda nVIDIA GPU能否从特殊寄存器存储到内存?,cuda,ptx,nvidia-sass,Cuda,Ptx,Nvidia Sass,我在研究%laneid的使用方式时,正在胡乱地说些俏皮话。在一次浪费了某人一分钟生命的失态之后(很抱歉,你知道你是谁),我现在有以下几点: CUDA代码: __forceinline__ __device__ unsigned lane_id() { unsigned ret; asm volatile ("mov.u32 %0, %laneid;" : "=r"(ret)); return ret; } __global__ void dummy(unsigned *

我在研究
%laneid
的使用方式时,正在胡乱地说些俏皮话。在一次浪费了某人一分钟生命的失态之后(很抱歉,你知道你是谁),我现在有以下几点:

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):


因此,STG指令(我猜是存储到全局内存)不会立即获取SR_LANEID,而是由内联PTX放入的寄存器。这是因为(Pascal)GPU不能从特殊寄存器存储,还是错过了优化机会?

您不能直接从特殊寄存器存储;读取特殊寄存器的值需要特殊操作(
S2R


理由:给出访问特殊寄存器的所有指令寻址模式将与原理背道而驰,而且(以我的拙见)鉴于这种操作在实践中发生的可能性,指令位不会得到很好的利用。

您不能直接从特殊寄存器存储;读取特殊寄存器的值需要特殊操作(
S2R


理由:给出访问特殊寄存器的所有指令寻址模式将与原理背道而驰,而且(在我看来)指令位不会得到很好的利用,因为这种操作在实践中很可能发生。

从特殊寄存器读取数据需要特殊操作(
S2R
)。给出访问特殊寄存器的所有指令寻址模式将违背这一原理,并且IMHO不会很好地使用指令位,因为这种操作在实践中发生的可能性有多大。@tera:将其转化为答案?从特殊寄存器读取指令需要特殊操作(
S2R
)。给出所有指令寻址模式以访问特殊寄存器将违背这一原理,并且IMHO不会很好地使用指令位,因为这样的操作在实践中发生的可能性有多大。@tera:把它变成一个答案?你知道这是事实吗?我的意思是,你不是在写你认为有意义的东西?我只是在写我认为有意义的东西。我不知道这是事实,因为SASS除了a之外没有文档记录,每个都有一些描述。所以我加了1,但在我得到一些佐证之前我不会接受…足够公平-这本来是一个评论…;-)你知道这是事实吗?我的意思是,你不是在写你认为有意义的东西?我只是在写我认为有意义的东西。我不知道这是事实,因为SASS除了a之外没有文档记录,每个都有一些描述。所以我加了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 */