performance - _mm_shuffle_epi8 内在函数的使用

标签 performance optimization x86 sse simd

有人可以解释一下_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/

相关文章:

c++ - 现代 C/C++ 编译器能否更好地优化 header 中的代码?

linux - 动态确定流氓 AVX-512 指令的执行位置

c++ - 英特尔引脚 : Instrumentate running process

java - 使用 Java 7 的 Objects.equals 来比较字段?

java - 防止在 JPA 中进行 N+1 选择

Integer类中的Java getChars方法,为什么它使用位运算而不是算术运算?

c++ - 为什么 Clang 会添加额外的 FMA 指令?

javascript - 在 for 循环中使用 var 关键字

python - 如何使用 "requests"模块 python 进行简单的快速请求?

c++ - C++ 中的动态与静态多态性 : which is preferable?