![](/img/trans.png)
[英]Is there a more efficient way to get the length of a 32bit integer in bytes?
[英]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.