所以我一直在尝试自己学习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;
}
抛出异常: 访问冲突(0x00000),即使指针不是0x00000。
我做的测试只是分配1024字节的内存,然后调用zeromem。
第一次迭代时会抛出异常。
答案 0 :(得分:5)
_mm_store_si128
转换为MOVDQA并要求操作数在16字节边界上对齐,这可能导致异常。 IIRC,例如,Windows未实现显式对齐异常,因此会导致访问冲突。关于memset实现,您可能对this post comparing different approaches to filling a memory block with bytes感兴趣。