有人可以解释一下_mm_shuffle_epi8
SSSE3 内在?
我知道它在 __m128i
中混洗 16 个 8 位整数但不确定我如何使用它。
我基本上想用_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;
最佳答案
_mm_shuffle_epi8
(更好地称为 pshufb
),基本上是这样做的:
temp = dst;
for (int i = 0; i < 16; i++)
dst[i] = (src[i] & 0x80) == 0 ? temp[src[i] & 15] : 0;
至于这里能不能用,不知道涉及到的类型是无法判断的。无论如何它都不会“好”,因为目标是一个 6 字节的块(或字?或双字?)。您可以通过展开并进行大量移动和或操作来完成这项工作。
关于performance - _mm_shuffle_epi8 内在函数的使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12778620/