C++ _mm_store_si128引发异常
因此,我一直在尝试自己学习SEE优化,但我不太明白,我认为一个简单的函数,只需将内存归零就很容易实现,所以我继续尝试自己实现它 下面是零内存函数,它从缓冲区开始循环到缓冲区结束,并使用\u mm\u store\u 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( );
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库可能会因为同样的原因遇到同样的问题。看见