【发布时间】:2015-07-01 15:27:46
【问题描述】:
如何使用加载/存储来正确进行对齐的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);
}
}
【问题讨论】:
-
您遇到了什么具体问题?如果只是缓冲区没有正确对齐,那么要么修复对齐,要么使用
_mm_loadu_si128/_mm_storeu_si128。 -
我试过 _mm_loadu_si128/_mm_storeu_si128 ,它在 VS 2015 中也崩溃了。或者任何其他方式来编写这个 16 字节交换 uisng SSE 内在函数?
-
从您向我们展示的内容来看,该代码看起来不错 - 您可以发布 MCVE 吗?
-
那么从 VS 2015 break 开始,你认为问题是什么?
-
如果没有 MCVE,几乎不可能为您提供帮助。我看到的唯一明显错误是,如果
count不是 8 的倍数,您的例程将失败 - 这似乎就是您的特定示例崩溃的原因,因为 172 不是 8 的倍数。
标签: c++ windows visual-studio sse simd