_mm_store_si128抛出异常

use*_*769 2 c++ sse simd

所以我一直在尝试自己学习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.

在第一次迭代时抛出异常.

zx4*_*485 5

_mm_store_si128转换为MOVDQA并要求操作数在16字节边界上对齐,这可能导致异常.IIRC,例如,Windows未实现显式对齐异常,因此会导致访问冲突.关于memset实现,您可能会对这篇文章感兴趣,比较用字节填充内存块的不同方法.