C++ _mm_store_si128引发异常

C++ _mm_store_si128引发异常,c++,sse,simd,C++,Sse,Simd,因此,我一直在尝试自己学习SEE优化,但我不太明白,我认为一个简单的函数,只需将内存归零就很容易实现,所以我继续尝试自己实现它 下面是零内存函数,它从缓冲区开始循环到缓冲区结束,并使用\u mm\u store\u si128将其归零 bool zeromem( byte * _dest, uint _sz ) { if ( _dest == nullptr ) return false; __m128i zero = _mm_setzero_si128( );

因此,我一直在尝试自己学习SEE优化,但我不太明白,我认为一个简单的函数,只需将内存归零就很容易实现,所以我继续尝试自己实现它

下面是零内存函数,它从缓冲区开始循环到缓冲区结束,并使用\u mm\u store\u si128将其归零

bool zeromem( byte * _dest, uint _sz )
{
    if ( _dest == nullptr )
        return false;
    __m128i zero = _mm_setzero_si128( );

    for ( auto i = rcast<__m128i*>( _dest ),
          end = rcast<__m128i*>( _dest + _sz );
          i < end; ++i )
    {
        _mm_store_si128( i, zero );
    }
    return true;
}
boolzeromem(字节*\u dest,uint\u sz)
{
如果(_dest==nullptr)
返回false;
__m128i零=_mm_setzero_si128();
对于(自动i=RCAT(_dest),
结束=RCAT(_dest+_sz);
i<结束;++i)
{
_mm_store_si128(i,零);
}
返回true;
}
引发异常: 访问冲突(0x00000),即使指针不是0x00000。

我做的测试只是分配1024字节的内存,然后调用zeromem


在第一次迭代时引发异常。

\u mm\u store\u si128
转换为并要求操作数在16字节边界上对齐,这可能导致异常。例如,IIRC,Windows没有实现显式对齐异常,因此它会导致访问冲突。关于您可能感兴趣的memset实现。

您在_dest上有正确的内存对齐方式吗?另外,了解引发了什么异常也会有帮助。@drescherjm添加了更多信息几乎肯定是对齐错误发布整个错误消息有多困难?还要添加一个。请注意,使用
\u mm\u storeu\u si128
而不是
\u mm\u store\u si128
可以解决眼前的问题。此外,您还可以在使用32位体系结构(x86和ARM)分配的内存上保持对齐版本。堆分配仅为8字节对齐,而不是16字节对齐。DirectXMath库可能会因为同样的原因遇到同样的问题。看见