0

SSE コードのパフォーマンスに問題があります。私は円周率を計算しようとして、http://en.wikipedia.org/wiki/Leibniz_formula_for_%CF%80を使用します。したがって、1*10^11 の反復を行うと、SSE を使用しないコードよりもパフォーマンスが低下します (-100%)。1*10^10 回の反復を行うと、SSE を使用しないコードよりもパフォーマンスが向上します。

Visual Studio C++ コンパイラと Intel コンパイラを使用しています (最適化なし!)。もちろん、コンパイラを最適化して使用することもできます (そして完璧な結果が得られます) が、何が問題なのかを理解したいと思います。

データを整列しようとしました (ご覧のとおり)。VS C++ コンパイラでパフォーマンスが向上しました (-100% ではなく -40%)が、インテル コンパイラでのパフォーマンスは -100 ではなく -85% でした :) getTickCount を使用します時間を測定します。

私のプロセッサは AMD Turon X2 Dual-Core Mobile-RM74 です。それは理にかなっているかもしれません:)

SSEを使用した私のコード

    double *a = (double*) _mm_malloc(4 * sizeof(double  ), 16);
double *i = (double*) _mm_malloc(sizeof(double), 64); //good point
double *k = (double*) _mm_malloc(sizeof(double), 64);
double *result = (double*) _mm_malloc(sizeof(double), 64);
double *temp = (double*) _mm_malloc(sizeof(double), 64);
*temp = 0.0;
*result = 0.0;
*k = 1.0;
a[0] = 1;
a[1] = -1;
for (*i = 1; *i < 100000000000; *i += 2, *k += 4.0) {
        a[2] = *k;
        a[3] = *k + 2;
    __asm {
        mov eax, dword ptr a

        movapd XMM0, xmmword ptr [eax ]
        movapd XMM1, xmmword ptr [eax + 16]

        divpd XMM0, XMM1

        movapd XMM1, XMM0

        psrldq XMM1,8

        addpd   XMM0,XMM1  
        mov eax, dword ptr temp;

        movsd [eax], XMM0
    }

    *result += *temp;
}

*result = *result * 4.0;

タイミングgetTickcount。MS。

intel + O       | 942901
intel - O       | 1273139
intel + sse + O | 948096 
intel + sse - O | 2354382 |(unaligned data)
VS + O          | 949079
VS - O          | 1106749
VS + SSE + O    | 968189
VS + SSE - O    | 2180067 | (unaligned data)
VS + SSE - O    | 1674201 | (aligned data)
intel + sse - O | 1921437 |(aligned data)
4

0 に答える 0