簡體   English   中英

CUDA組裝說明

[英]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組合!P0PT (= true)。 似乎該指令也支持鏈接,在這種情況下,使用ANDPT 您對您的示例表示邏輯取反P0 = !P0似乎是正確的。 ISETP ,我不確定第三PT的含義是什么。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM