在调查使用%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无法从特殊寄存器存储,还是错过了优化机会?
答案 0 :(得分:2)
您不能直接从特殊注册簿存储;需要特殊操作(S2R
)来读取特殊寄存器的值。
基本原理:给出所有寻址模式以访问特殊寄存器的指令都会对抗RISC哲学,并且(根据我的拙见)不会很好地花费指令位,考虑到这种操作在实践中会发生的可能性