ホーム 道しるべ 憩いの広場 濃緑空間 濃緑研の日記

処理時間を測ろう
ホーム ] 上へ ] 逆数(除算) ] 逆数平方根と平方根 ] [ 処理時間を測ろう ] 配列の扱い・最適化1 ] 最適化2 ]

 


まずは、以下のプログラムを実行して下さい。

#include "amd3d.h"
#include <windows.h>
#include <math.h>
#include <stdio.h>

main()
{
long    n;
    float    a,b,c;
    char    buf[80];
    DWORD    dt1,dt2;
    double    ddt;

    b = 3;

    dt1 = GetTickCount();

    _asm{
        femms
    }
    for(n=0;n<100000000;n++)
    {
    _asm{
//        femms
        movd         mm0,b

        pfrsqrt         (m1,m0)             ;mm1     ???        | 1/sqrt(b) 15ビット精度
        movq         mm2,mm1
        pfmul         (m1,m1)
        pfrsqit1    (m1,m0)
        pfrcpit2    (m1,m2)             ;mm1     ???        | 1/sqrt(b)     24ビット精度   
        pfmul         (m0,m1)             ;mm0     ???        | sqrt(b)

        movd         a,mm0
        movd         c,mm1
//        femms
        }
    }
    _asm{
        femms
    }
    dt2 = GetTickCount();
    ddt = (double)(dt2-dt1)/1000.0;
    sprintf(buf,"%f %f\n3DNow!による処理時間は %.3f 秒です",a,c,ddt);
    MessageBox(GetDesktopWindow(), buf,"Test 3DNow!",MB_OK);

    dt1 = GetTickCount();
    for(n=0;n<100000000;n++)
    {
    _asm{
        fld             b
        fsqrt
        fstp         a
    }
    }
    dt2 = GetTickCount();
    ddt = (double)(dt2-dt1)/1000.0;
    sprintf(buf,"%f %f\nFPUによる処理時間は %.3f 秒です",a,1/a,ddt);
    MessageBox(GetDesktopWindow(), buf,"Test 3DNow!",MB_OK);
}

これが、3DNow!とFPUの処理速度差です。
これでも平方根は、K6-FPUの方がP6-FPUより速いんですけど、この差です。