簡體   English   中英

試圖理解 _mm256_permute2x128_si256 的英特爾內在指南解釋

[英]Trying to understand Intel Intrinsics Guide explanation for _mm256_permute2x128_si256

我試圖了解 _mm256_permute2x128_si256。 是先將寄存器 a 的所有 256 位讀入機箱,然后再將寄存器 b 的 256 位讀入機箱嗎? 還是在向量 a 和向量 b 之間交錯讀取每 32 位? 那么哪個向量的哪個 32 位被讀取對應於 imm8 中的哪個位以什么順序以及如何讀取? 謝謝!

DEFINE SELECT4(src1, src2, control) {
    CASE(control[1:0]) OF
    0:  tmp[127:0] := src1[127:0]
    1:  tmp[127:0] := src1[255:128]
    2:  tmp[127:0] := src2[127:0]
    3:  tmp[127:0] := src2[255:128]
    ESAC
    IF control[3]
        tmp[127:0] := 0
    FI
    RETURN tmp[127:0]
}
dst[127:0] := SELECT4(a[255:0], b[255:0], imm8[3:0])
dst[255:128] := SELECT4(a[255:0], b[255:0], imm8[7:4])
dst[MAX:256] := 0

請參閱此網站,它比英特爾的文檔提供更多信息:

https://www.felixcloutier.com/x86/vperm2i128

這是一個隨機播放,從 2 個輸入向量的 4 個總通道中選擇兩個 128 位通道。
控制 integer 操作數有兩個 2 位字段,每個字段索引 4 個通道之一。 您可以將其視為連接兩個輸入向量,然后索引到該 4 通道數組。

或者,如果設置了索引半字節的高位,它會將結果的該通道歸零。

沒有什么涉及 32 位粒度。 內在函數指南中的偽代碼定義了一個幫助程序 function,並將每個輸入的所有 256 位傳遞給該幫助程序 function 兩次。 所有[hi:lo]范圍都以位為單位,而不是字節。

英特爾的相應指令 ( vperm2i128 ) 的 asm 文檔具有更易於理解的偽代碼,用於分隔歸零:

CASE IMM8[1:0] of
    0: DEST[127:0]←SRC1[127:0]
    1: DEST[127:0]←SRC1[255:128]
    2: DEST[127:0]←SRC2[127:0]
    3: DEST[127:0]←SRC2[255:128]
ESAC

CASE IMM8[5:4] of
    0: DEST[255:128]←SRC1[127:0]
    1: DEST[255:128]←SRC1[255:128]
    2: DEST[255:128]←SRC2[127:0]
    3: DEST[255:128]←SRC2[255:128]
ESAC

IF (imm8[3])
    DEST[127:0] ← 0
FI
IF (imm8[7])
    DEST[255:128] ← 0
FI

暫無
暫無

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

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