簡體   English   中英

我在理解AVX隨機播放內建函數如何在8位上工作時遇到一些問題

[英]I've some problems understanding how AVX shuffle intrinsics are working for 8 bits

我正在嘗試通過使用_mm256_shuffle_epi8將16位數據打包為8位,但是我得到的結果不是我期望的。


auto srcData = _mm256_setr_epi8(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 
                               17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32);

__m256i vperm = _mm256_setr_epi8( 0,  2,  4,  6,  8, 10, 12, 14,
                                 16, 18, 20, 22, 24, 26, 28, 30,
                                 -1, -1, -1, -1, -1, -1, -1, -1,
                                 -1, -1, -1, -1, -1, -1, -1, -1);

auto result = _mm256_shuffle_epi8(srcData, vperm);

我期望該結果包含:

 1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29, 31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 

但是我有:

 1, 3, 5, 7, 9, 11, 13, 15, 1, 3, 5, 7, 9, 11, 13, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 

我肯定誤解了Shuffle的工作原理。 如果有人能啟發我,將不勝感激:)

是的,意料之中。 查看_mm_shuffle_epi8的文檔。 256位avx版本僅對YMM寄存器中的兩個16字節值復制了該128位指令的行為。

因此,您可以隨機播放前16個值或后16個值; 但是,您不能在16字節邊界上混洗值。 (您會注意到,所有超過16的數字都是相同的數字減去16。例如19-> 3、31-> 15等)。

您需要執行額外的步驟。

__m256i vperm = _mm256_setr_epi8( 0,  2,  4,  6,  8, 10, 12, 14,
                                 -1, -1, -1, -1, -1, -1, -1, -1,
                                  0,  2,  4,  6,  8, 10, 12, 14,
                                 -1, -1, -1, -1, -1, -1, -1, -1);

然后使用_mm256_permute2f128_si256將第0和第2個字節拉入前128位。

暫無
暫無

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

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