假设我想添加两个缓冲区并存储结果。两个缓冲区都已分配 16 字节对齐。我找到了两个如何做到这一点的例子。
第一个是使用 _mm_load 将数据从缓冲区读取到 SSE 寄存器,执行加法操作并存储回结果寄存器。直到现在我都会这样做。
void _add( uint16_t * dst, uint16_t const * src, size_t n )
{
for( uint16_t const * end( dst + n ); dst != end; dst+=8, src+=8 )
{
__m128i _s = _mm_load_si128( (__m128i*) src );
__m128i _d = _mm_load_si128( (__m128i*) dst );
_d = _mm_add_epi16( _d, _s );
_mm_store_si128( (__m128i*) dst, _d );
}
}
第二个例子只是直接对内存地址进行了加法操作,没有加载/存储操作。两个接缝都可以正常工作。
void _add( uint16_t * dst, uint16_t const * src, size_t n )
{
for( uint16_t const * end( dst + n ); dst != end; dst+=8, src+=8 )
{
*(__m128i*) dst = _mm_add_epi16( *(__m128i*) dst, *(__m128i*) src );
}
}
所以问题是第二个示例是否正确或可能有任何副作用以及何时使用加载/存储是强制性的。
谢谢。