Я написал вычисление точечного произведения двух больших векторов с плавающей точкой, используя SSE2. Но позже я заметил, что результат неправильный, но разница невелика. Ниже приведен пример странного поведения
srand(static_cast<unsigned int>(time(NULL)));
const int size = 1000;
float array[size];
int i = 0;
for (; i < size; ++i)
array[i] = rand() % 1000 / 100.;
float sum = 0.0f, ps[4];
__m128 p = _mm_setzero_ps();
for (i = 0; i < size; i += 4)
{
__m128 p0 = _mm_loadu_ps(array + i);
p = _mm_add_ps(p, _mm_mul_ps(p0, p0));
}
assert(i == size);
_mm_storeu_ps(ps, p);
sum = ps[0] + ps[1] + ps[2] + ps[3];
for (i = 0; i < size; ++i)
sum -= array[i] * array[i];
std::cout << sum << std::endl;
return 0;
Почему так?
Задача ещё не решена.
Других решений пока нет …