SSE: разница между _mm_load/store и использованием прямого доступа по указателю

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

Таким образом, вопрос заключается в том, является ли второй пример правильным или может иметь какие-либо побочные эффекты, и когда использовать загрузку/сохранение является обязательным.

Спасибо.

16
задан Peter 2 August 2017 в 15:39
поделиться