2 つのバッファーを追加して結果を保存するとします。両方のバッファはすでに 16 バイトでアラインされて割り当てられています。その方法の例を 2 つ見つけました。
1 つ目は、_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 );
}
}
2 番目の例では、ロード/ストア操作を行わずに、メモリ アドレスに対して直接追加操作を実行しました。両方の縫い目が正常に機能します。
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 );
}
}
したがって、問題は、2 番目の例が正しいか、または何らかの副作用があるかどうか、およびいつロード/ストアを使用するかが必須であるということです。
ありがとう。