C++ 正确使用加载/存储

C++ 正确使用加载/存储,c++,windows,visual-studio,sse,simd,C++,Windows,Visual Studio,Sse,Simd,如何使用加载/存储正确执行对齐的int16\t字节交换 void byte_swapping(uint16_t* dest, const uint16_t* src, size_t count) { __m128i _s, _d; for (uint16_t const * end(dest + count); dest != end; dest += 8, src += 8) { _s = _m

如何使用加载/存储正确执行对齐的
int16\t
字节交换

void byte_swapping(uint16_t* dest, const uint16_t* src,
                              size_t count) {
    __m128i _s, _d;
    for (uint16_t const * end(dest + count); dest != end; dest += 8, src += 8)
    {
        _s = _mm_load_si128((__m128i*)src);
        _d = _mm_or_si128(_mm_slli_epi16(_s, 8), _mm_srli_epi16(_s, 8));
        _mm_store_si128((__m128i*) dest, _d);
    }
}

count
不是8的倍数,或者
src
dest
不是16字节对齐时,代码将失败

以下是您的代码的固定(并经过测试)版本:

void byte_swapping(uint16_t* dest, const uint16_t* src, size_t count)
{
    size_t i;
    for (i = 0; i + 8 <= count; i += 8)
    {
        __m128i s = _mm_loadu_si128((__m128i*)&src[i]);
        __m128i d = _mm_or_si128(_mm_slli_epi16(s, 8), _mm_srli_epi16(s, 8));
        _mm_storeu_si128((__m128i*)&dest[i], d);
    }
    for ( ; i < count; ++i) // handle residual elements
    {
        uint16_t w = src[i];
        w = (w >> 8) | (w << 8);
        dest[i] = w;
    }
}
无效字节交换(uint16\u t*dest,const uint16\u t*src,size\u t count)
{
尺寸i;

对于(i=0;i+8>8)|(w)你有什么具体问题?如果只是缓冲区没有正确对齐,那么要么修复对齐,要么使用
\u mm\u loadu\u si128
/
\u mm\u storeu\u si128
。我试过了{u mm\u loadu\u si128/\u mm\u storeu\u si128,它在VS 2015中也崩溃了。或者使用任何其他方法来编写这个16字节交换的SSE内部函数?代码看起来K从你展示给我们的-你能发布一个吗?那么从VS 2015休息,你认为问题是什么?如果没有MCVE,几乎不可能帮助你。我看到的唯一明显的错误是,如果
count
不是8的倍数,你的例程将失败-这似乎就是你的特定示例崩溃的原因,因为172不是一个multiple of 8.谢谢Paul.今晚让我试试。事实上,我们正在开发一款xbox 360模拟器,进展非常顺利。它很接近,看起来更好,但不知怎么的,它像这样断开了好吧-我怀疑漏洞在别处-你可以通过replacin来证明这一点g
byte_swapping
使用简单的标量实现-我希望您会看到相同的结果。好的-您能在问题中包括标量版本吗?对于(size_t I=0;I>8)和0xff)|((src[I]