_mm_load_si128 - 传递的内存地址不是16字节对齐的?

时间:2014-04-16 10:39:19

标签: c++ simd sse2

我在理解SSE2指令时遇到了一些麻烦。根据microsoft文档,_mm_load_si128需要一个16字节对齐的地址作为参数。在我试图理解的代码中,情况似乎并非如此:

void f(uchar* buf0, const int n)
{
    ushort* buf = (ushort*)alignPtr(buf0, 16);
    for(int i = 0; i < n; i += 16)
    {
        __m128i v0 = _mm_load_si128((__m128i*)(buf+i));   // 16-byte-aligned, since buf is 16-byte-aligned and i is divisable by 16.
        __m128i v1 = _mm_load_si128((__m128i*)(buf+i+8)); // If buf+i is 16-byte-aligned, then buf+i+8 cannot be 16-byte-aligned.
    }
}

我将代码缩减到相关部分并重命名了一些变量。原始代码来自Konoliges块匹配算法的OpenCV实现(stereobm.cpp,尤其是第313行)。我的问题是,为什么代码是正确的以及写入v1的内容是什么?

0 个答案:

没有答案