_mm_store_si128抛出异常

时间:2016-02-05 16:27:20

标签: 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;
}

抛出异常: 访问冲突(0x00000),即使指针不是0x00000。

我做的测试只是分配1024字节的内存,然后调用zeromem。

第一次迭代时会抛出异常。

1 个答案:

答案 0 :(得分:5)

_mm_store_si128转换为MOVDQA并要求操作数在16字节边界上对齐,这可能导致异常。 IIRC,例如,Windows未实现显式对齐异常,因此会导致访问冲突。关于memset实现,您可能对this post comparing different approaches to filling a memory block with bytes感兴趣。

相关问题