所以我一直在尝试自己学习SEE优化,我不太了解它,我认为一个简单的函数只是将内存归零很容易实现,所以我继续尝试自己实现它.
这是零内存函数,它从缓冲区开始循环到缓冲区结束,并使用_mm_store_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;
}
Run Code Online (Sandbox Code Playgroud)
抛出异常: 即使指针不是0x00000,也会发生访问冲突(0x00000).
我做的测试只是分配1024字节的内存,然后调用zeromem.
在第一次迭代时抛出异常.
_mm_store_si128转换为MOVDQA并要求操作数在16字节边界上对齐,这可能导致异常.IIRC,例如,Windows未实现显式对齐异常,因此会导致访问冲突.关于memset实现,您可能会对这篇文章感兴趣,比较用字节填充内存块的不同方法.