Предположим, я хочу добавить два буфера и сохранить результат. Оба буфера уже распределены по 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 );
}
}
Таким образом, вопрос заключается в том, является ли второй пример правильным или может иметь какие-либо побочные эффекты, и когда использовать загрузку/сохранение является обязательным.
Спасибо.