_mm_store_si128 抛出异常
_mm_store_si128 throws exception
所以我一直在尝试自己学习 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。
第一次迭代时抛出异常。
_mm_store_si128
转换为 MOVDQA and requires operands to be aligned on a 16-byte boundary which could cause the exception. IIRC, For example Windows doesn't implement an explicit alignment exception, so it causes an access violation. Concerning the memset implementation you might be interested in .
所以我一直在尝试自己学习 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。
第一次迭代时抛出异常。
_mm_store_si128
转换为 MOVDQA and requires operands to be aligned on a 16-byte boundary which could cause the exception. IIRC, For example Windows doesn't implement an explicit alignment exception, so it causes an access violation. Concerning the memset implementation you might be interested in