雖然仔細查看了NVIDIA sm_20架構的SASS輸出,但觀察到ThreadID是從特殊寄存器加載的,旋轉分兩步執行。通過旋轉 獲得的值NVIDIA GPU彙編代碼(SASS)中的線程ID旋轉
- 負載MSB寄存器線程ID通過2
- 負載左LSB右30
一起但這32位旋轉通過旋轉線程ID獲得 寄存器的值並且寄存器對將如下所示:
此外,該寄存器對用於SASS,其中threadID用於代碼中。該SASS代碼
code for sm_20
Function : _Z3addPiS_S_
.headerflags @"EF_CUDA_SM20 EF_CUDA_PTX_SM(EF_CUDA_SM20)"
/*0000*/ MOV R1, c[0x1][0x100]; /* 0x2800440400005de4 */
/*0008*/ S2R R2, SR_TID.X; /* 0x2c00000084009c04 */---Getting thread ID
/*0010*/ IMAD.U32.U32 RZ, R1, RZ, RZ; /* 0x207e0000fc1fdc03 */
/*0018*/ SHL.W R3, R2, 0x2; /* 0x6000c0000820de03 */---Rotating Step 1
/*0020*/ SHR.U32 R4, R2, 0x1e; /* 0x5800c00078211c03 */---Rotating Step 2
/*0028*/ IADD R6.CC, R3, c[0x0][0x20]; /* 0x4801400080319c03 */
/*0030*/ IADD.X R7, R4, c[0x0][0x24]; /* 0x480040009041dc43 */
/*0038*/ LD.E R0, [R6]; /* 0x8400000000601c85 */
/*0040*/ STS [R3], R0; /* 0xc900000000301c85 */---Shared mem access with ThreadID
什麼會做這種方式,而不是使用從特殊寄存器加載的線程ID的目的是什麼?
什麼是整個內核函數在做什麼?也許你可以從更高層面得到線索。人們通常會在給出threadIdx.x的情況下計算出某些內容,然後將其用作訪問共享/全局內存的偏移量。 – kangshiyin