У меня есть два массива типа double
и я хочу выполнить vecA += vecB
. Пока что я делаю vecA = vecA + vecB
и, насколько мне известно, например, Запись целых чисел i = i + 5
выполняется медленнее, чем i += 5
. Поэтому мне интересно, есть ли какая-то функция SSE, которая просто operator+=
на __m128d. Я искал и ничего не нашел. Мое приложение тратит около 60% времени на эту vecA = vecA + vecB
операцию, поэтому любой прирост производительности будет заметен.
Все массивы в приведенных ниже фрагментах кода выровнены по 16 байт, а len
всегда четный.
Исходный код просто
inline void addToDoubleVectorSSE(
const double * what, const double * toWhat, double * dest, const unsigned int len)
{
__m128d * _what = (__m128d*)what;
__m128d * _toWhat = (__m128d*)toWhat;
for ( register unsigned int i = 0; i < len; i+= 2 )
{
*_toWhat = _mm_add_pd( *_what, *_toWhat );
_what++;
_toWhat++;
}
}
После прочтения http://fastcpp.blogspot.cz/2011/04/how-to-process-stl-vector-using-sse.html, где автор увеличивает производительность, не записывая сразу в то, что он только что прочитал, я пробовал
__m128d * _what = (__m128d*)what;
__m128d * _toWhat = (__m128d*)toWhat;
__m128d * _toWhatBase = (__m128d*)toWhat;
__m128d _dest1;
__m128d _dest2;
for ( register unsigned int i = 0; i < len; i+= 4 )
{
_toWhatBase = _toWhat;
_dest1 = _mm_add_pd( *_what++, *_toWhat++ );
_dest2 = _mm_add_pd( *_what++, *_toWhat++ );
*_toWhatBase++ = _dest1;
*_toWhatBase++ = _dest2;
}
но по скорости никаких улучшений не происходит. Итак, есть ли operator+=
для __m128d
? Или есть другой способ, которым я могу использовать оператор + = для массивов двойников? Целевой платформой всегда будет Windows (XP и 7) на процессорах Intel i7 с использованием MSVC.
i = i + 5
медленнее, чемi += 5
? - person Carl Norum   schedule 28.02.2013