_mm_shuffle_epi8内在的用法

Pet*_*Lee 2 optimization performance x86 sse simd

有人可以解释_mm_shuffle_epi8SSSE3内在吗?我知道它可以将16个8位整数混合在一起__m128i但不确定如何使用它.

我基本上想用来_mm_shuffle_epi8修改下面的函数以获得更好的性能.

while(not done)
    dest[i+0] = (src+j).a;
    dest[i+1] = (src+j).b;
    dest[i+2] = (src+j).c;
    dest[i+3] = (src+j+1).a;
    dest[i+4] = (src+j+1).b;
    dest[i+5] = (src+j+1).c;
    i+=6;
    j+=2;
Run Code Online (Sandbox Code Playgroud)

jco*_*ctx 6

这是使用内在的一个例子; 你必须找到如何将它应用于你的特定情况.此代码endian-teaps一次交换4个32位整数:

unsigned int *bswap(unsigned int *destination, unsigned int *source, int length) {
    int i;
    __m128i mask = _mm_set_epi8(12, 13, 14, 15, 8, 9, 10, 11, 4, 5, 6, 7, 0, 1, 2, 3);
    for (i = 0; i < length; i += 4) {
        _mm_storeu_si128((__m128i *)&destination[i],
        _mm_shuffle_epi8(_mm_loadu_si128((__m128i *)&source[i]), mask));
    }
    return destination;
}
Run Code Online (Sandbox Code Playgroud)


har*_*old 5

_mm_shuffle_epi8(更为人所知pshufb),基本上是这样的:

temp = dst;
for (int i = 0; i < 16; i++)
    dst[i] = (src[i] & 0x80) == 0 ? temp[src[i] & 15] : 0;
Run Code Online (Sandbox Code Playgroud)

至于你是否可以在这里使用它,不知道所涉及的类型是不可能的.它无论如何都不会"好",因为目标是一个6字节的块(或单词?或dwords?).你可以通过展开和进行大量的转移和定位来实现这一目标.