У меня есть две функции умножения 2d массивов. Один из них с SSE. Другая функция без какой-либо оптимизации. Обе функции работают хорошо. Но результаты несколько отличаются. Например, 20.333334 и 20.333332.
Можете ли вы объяснить, почему результаты разные? И что я могу сделать с функциями, чтобы иметь тот же результат?
с SSE
float** sse_multiplication(float** array1, float** array2, float** arraycheck)
{
    int i, j, k;
    float *ms1, *ms2, result;
    float *end_loop;
    for( i = 0; i < rows1; i++)
    {
        for( j = 0; j < columns2; j++)
        {
            result = 0;
            ms1 = array1[i];
            ms2 = array2[j];
            end_loop = &array1[i][columns1];
            __asm{
                     mov rax, ms1
                     mov rbx, ms2
                     mov rdx, end_loop
                     xorps xmm2, xmm2
                loop:
                     movups xmm0, [rax]
                     movups xmm1, [rbx]
                     movups xmm3, [rax+16]
                     movups xmm4, [rbx+16]
                     mulps xmm0, xmm1
                     mulps xmm3, xmm4
                     addps xmm2, xmm0
                     add rax, 32
                     add rbx, 32
                     cmp rdx, rax
                     jne loop
                     haddps xmm2, xmm2
                     haddps xmm2, xmm2
                     movups result, xmm2
               }
             arraycheck[i][j] = result;
        }
    }
    return arraycheck;
}
без какой-либо оптимизации
float** multiplication(float** array1, float** array2, float** arraycheck)
{
    for (int i = 0; i < rows1; i++)
        for (int j = 0; j < columns2; j++)
            for (int k = 0; k < rows1; k++)
                arraycheck[i][j] += array1[i][k] * array2[k][j];
    return arraycheck;
}
