[英]CUDA assembly instructions
在某些情況下,反匯編CUDA代碼似乎是一個非常有用的工具,即使不是唯一的工具,它也可以用來理解編譯器的行為以及性能指標。
我要說的是,不幸的是,通過CUDA BINARY UTILITIES應用說明提供的文檔無法為用戶提供解釋CUDA匯編指令所需的所有工具,或者至少我無法從該文檔中推斷出所有需要的信息。 除了“ CUDA BINARY UTILITIES”指南以外,“ CUDA手冊”書沒有提供更多信息。 例如,我應該如何解釋說明
ISETP.LT.AND P0, PT, R3, RZ, PT;
和
PSETP.AND.AND P0, PT, !P0, PT, PT;
@P0
在指令前做什么? 它是指令標簽,以便在謂詞寄存器P0
為true時執行跳轉到該標簽? 有什么通用的方法可以解釋CUDA組裝說明?
非常感謝你。
根據NJUFFA的評論進行編輯
我已經編譯了以下簡單內核
__global__ void test_kernel(float *a, float *b)
{
int tid = threadIdx.x + blockIdx.x * blockDim.x;
if ((tid > 5) & (tid < 10)) a[tid] = tid;
else b[tid] = tid;
}
導致
/*0000*/ MOV R1, c[0x1][0x100]; /* 0x2800440400005de4 */
/*0008*/ S2R R0, SR_CTAID.X; /* 0x2c00000094001c04 */
/*0010*/ S2R R2, SR_TID.X; /* 0x2c00000084009c04 */
/*0018*/ IMAD R2, R0, c[0x0][0x8], R2; /* 0x2004400020009ca3 */
/*0020*/ IADD R0, R2, -0x6; /* 0x4800ffffe8201c03 */
/*0028*/ ISETP.LT.U32.AND P0, PT, R0, 0x4, PT; /* 0x188ec0001001dc03 */
/*0030*/ I2F.F32.S32 R0, R2; /* 0x1800000009201e04 */
/*0038*/ @!P0 ISCADD R3, R2, c[0x0][0x24], 0x2; /* 0x400040009020e043 */
/*0040*/ @P0 ISCADD R2, R2, c[0x0][0x20], 0x2; /* 0x4000400080208043 */
/*0048*/ @!P0 ST [R3], R0; /* 0x9000000000302085 */
/*0050*/ @P0 ST [R2], R0; /* 0x9000000000200085 */
/*0058*/ EXIT ; /* 0x8000000000001de7 */
編譯器已將條件((tid > 5) & (tid < 10))
重鑄為((i < 4) & (i >= 0))
,條件為i = tid - 6
,因此現在涉及的指令為
ISETP.LT.U32.AND P0, PT, R0, 0x4, PT;
如果謂詞寄存器0為true,則指令之前的@P0
有條件地執行該指令。 同樣,指令前的@!P0
表示如果謂詞寄存器0為假,則該指令有條件地執行。 在分解更復雜的機器代碼時,您將看到通常使用多個謂詞寄存器。 通過謂詞BRA
指令,此謂詞機制還用於條件分支。
ISETP
是一個整數比較(這里: LT
=小於),結果被寫入謂詞寄存器。 它允許謂詞鏈接,這對於復合分支有用。 在您的示例中,未使用鏈接,因為編譯器使用了巧妙的轉換,該轉換允許使用單個ISETP
評估復合條件。 在此,鏈接運算符為AND
,並且ISETP
生成的謂詞與PT
(= true)鏈接。 我不確定PT
的第二個實例的意義是什么,您可能可以通過研究其他用法示例來找出。
PSETP
沿着類似的路線作為工作ISETP
,但它只是對謂詞而不是整數。 我不需要仔細查看此指令,因為它似乎很少發生。 據我所知, PSETP
組合了兩個謂詞寄存器並將結果存儲到謂詞寄存器中。 在這里,它通過AND
組合!P0
和PT
(= true)。 似乎該指令也支持鏈接,在這種情況下,使用AND
與PT
。 您對您的示例表示邏輯取反P0 = !P0
似乎是正確的。 與ISETP
,我不確定第三PT
的含義是什么。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.