Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Performance _mm_shuffle_epi8的用法_Performance_Optimization_X86_Sse_Simd - Fatal编程技术网

Performance _mm_shuffle_epi8的用法

Performance _mm_shuffle_epi8的用法,performance,optimization,x86,sse,simd,Performance,Optimization,X86,Sse,Simd,有人能解释一下SSSE3的本质吗? 我知道它在\uu m128i中洗牌16个8位整数,但我不知道如何使用它 我基本上想使用\u mm\u shuffle\u 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)

有人能解释一下SSSE3的本质吗? 我知道它在
\uu m128i
中洗牌16个8位整数,但我不知道如何使用它

我基本上想使用
\u mm\u shuffle\u 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;

\u mm\u shuffle\u epi8
(俗称
pshufb
),基本上是这样做的:

temp = dst;
for (int i = 0; i < 16; i++)
    dst[i] = (src[i] & 0x80) == 0 ? temp[src[i] & 15] : 0;
temp=dst;
对于(int i=0;i<16;i++)
dst[i]=(src[i]&0x80)==0?温度[src[i]&15]:0;

至于您是否可以在这里使用它,如果不知道所涉及的类型,就无法判断。它无论如何都不会“好”,因为目标是一个6字节的块(或单词?或dwords?)。您可以通过展开并执行大量的移位和/或调整来实现这一点。

下面是一个使用内部函数的示例;你必须找出如何将它应用于你的特殊情况。此代码endian一次交换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;
}
unsigned int*bswap(unsigned int*目的地,unsigned int*源,int长度){
int i;
__m128i掩码=_mm_set_epi8(12,13,14,15,8,9,10,11,4,5,6,7,0,1,2,3);
对于(i=0;i
是,
pshufb
最有可能用于此场景。但如果没有确切的相关类型信息,就不可能知道如何进行。