天天看點

多媒體指令集與大小端位元組序轉換

17年參與實體層研發時,發現X86體系一個大的困難是與FPGA交換資料,最後要轉換為大端位元組序。

時間的開銷是相當可觀的。

Intel的FlexRan裡面,也有許多相關的代碼,例如:

// Reverse in byte (used in scramble)
static inline uint64_t reverse_in_byte(const uint64_t x)
{
    const auto bytes = _mm512_movm_epi8(x);

    const auto mask = _mm512_set_epi8 (8,9,10,11,12,13,14,15,0,1,2,3,4,5,6,7,
                                       8,9,10,11,12,13,14,15,0,1,2,3,4,5,6,7,
                                       8,9,10,11,12,13,14,15,0,1,2,3,4,5,6,7,
                                       8,9,10,11,12,13,14,15,0,1,2,3,4,5,6,7);

    const auto rev_bytes = _mm512_shuffle_epi8(bytes, mask);

    return _mm512_movepi8_mask (rev_bytes);
}
           

是以,花一些時間,學習多媒體指令集。将一些相關的資訊放在這裡

1。 大小端位元組轉換

Efficient Algorithm for Bit Reversal (from MSB->LSB to LSB->MSB) in C - Stack Overflow

2。 epi8這類尾注的含義;

這一篇是我最喜歡的。這位同仁,喜歡研究最基本的含義。 

What are the names and meanings of the intrinsic vector element types, like epi64x or pi32?

3。         AVX-512指令_mm512_shuffle_epi8分析

AVX-512指令_mm512_shuffle_epi8分析_zzokest的部落格-CSDN部落格

繼續閱讀