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 */