我正在擺弄一些SASS,同時看着使用%laneid
的方式。這浪費了別人的生命一分鐘(約抱歉 - 你知道你是誰)失態後,我現在有以下幾點:nVIDIA GPU可以從特殊寄存器存儲到內存嗎?
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無法從特殊寄存器存儲,還是錯過了優化機會?
它需要一個特殊的操作('S2R')來讀取特殊寄存器。給所有指令尋址模式訪問特殊的寄存器將反擊[RISC](https://en.wikipedia.org/wiki/Reduced_instruction_set_computer)的哲學和恕我直言不會被指令位花費,考慮到這種操作可能有多大在實踐中發生。 – tera
@tera:把它變成答案? – einpoklum