簡體   English   中英

將 4 個字節擴展為 8 個字節的最快方法(32 位 -> 64 位)

[英]Fastest way to spread 4 bytes into 8 bytes (32bit -> 64bit)

假設您有一個 32 位無符號整數,其中字節的組織方式如下: abcd 以這種方式將這些字節擴展為 64 位無符號整數的最快方法是什么: 0 a 0 b 0 c 0 d 它適用於x86-64架構。 我想知道不使用特殊內在函數的最快方法,盡管這也很有趣。 (我說'最快',但具有合理性能的緊湊解決方案也很好)。

為需要上下文的人編輯。 這似乎是一項非常簡單的工作,只需移動一些字節,但它需要的指令比您想象的要多( 檢查這個帶優化的神箭)。 因此,我只是想知道是否有人知道一種可以用更少的指令解決問題的方法。

uint64_t x = ...;
// 0 0 0 0 a b c d
x |= x << 16;
// 0 0 a b ? ? c d
x = x << 8 & 0x00ff000000ff0000 | x & 0x000000ff000000ff;
// 0 a 0 b 0 c 0 d

為了完整起見,現代 x86 處理器可以通過一條快速指令完成此操作:

x = _pdep_u64(x, 0xff00ff00ff00ff)

像這樣的東西?

_mm256_cvtepu8_epi16(eight_bit_numbers):將16個8位數字的128位向量轉換為16個16位有符號整數的256位向量。 例如:

 __m128i value1 = _mm_setr_epi8(0x11, 0x22, 0x33, 0x44, 
    0x55, 0x66, 0x77, 0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff, 0x00);
 __m256i value2 = _mm256_cvtepu8_epi16(value1);

或者對於 32 位 -> 64 位:

https://software.intel.com/sites/landingpage/IntrinsicsGuide/#text=_mm256_cvtepu32_epi64

暫無
暫無

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

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