0

Accelerate Mac OS X フレームワークから cblas_dgemm 関数を何度も繰り返して、平均 MFLOPS/S レートを取得しようとしています。これは私が使用しているコードです (関数ポインター afp を介して cblas_dgemm を呼び出します):

double benchmark_cblas_matmul(dgemm_fp afp,
   const CBLAS_ORDER Order,
   const CBLAS_TRANSPOSE TransA,
   const CBLAS_TRANSPOSE TransB,
   const int M,
   const int N,
   const int K,
   const double alpha,
   const double *A,
   const int lda,
   const double *B,
   const int ldb,
   const double beta,
   double *C,
   const int ldc)
{
    double mflops_s,seconds = -1.0;
    for(int n_iterations = 1; seconds < 0.1;  n_iterations *= 2)
    {
        seconds = read_timer(); 
        for(int i = 0; i < n_iterations; ++i) 
        {
            (*afp)(Order,TransA,TransB,M,N,K,alpha,A,lda,B,ldb,beta,C,ldc); 
        }
        seconds = read_timer() - seconds;
        mflops_s = (2e-6*n_iterations*N*N*N)/seconds;
    }
    return mflops_s;
}

タイマー ルーチンは次のとおりです。

double read_timer( )
{
    static bool initialized = false;
    static struct timeval start;
    struct timeval end;
    if( !initialized )
    {
        gettimeofday( &start, NULL );
        initialized = true;
    }

    gettimeofday( &end, NULL );

    return (end.tv_sec - start.tv_sec) + 1.0e-6 * (end.tv_usec - start.tv_usec);
}

コードは通常、2 つの 1000x1000 行列の乗算を実行します。私の問題は、このコードの連続したタイミングが非常に信頼できないことです。外側のループのタイミング制限を 5 秒に増やしても、最終的な速度は 20000 ~ 30000 mflops/s の間で変動します。私は、OS X 10.8.2 を搭載した 2011 Macbook Pro を使用しています。クアッド コア i5 と、このカーネル拡張機能を使用してハイパースレッディングをオフにし、ベンチマーク時にターミナル以外のアプリケーションを実行していません。より安定したタイミングを得る方法について何か提案はありますか?

4

2 に答える 2

2

あなたが制御していないいくつかの混乱があります。

問題のプロセッサには、熱的に制約されない限り、公称クロック レートよりも高速に実行できるターボ モードがあります。ただし、持続的な GEMM ベンチマークを実行すると、コアはほぼピークの演算スループットに固定されたままになり、最終的にはコアが熱エンベロープの限界に達し、クロックは公称速度まで減速され、さらに低い周波数まで減速されます。

測定されたパフォーマンスが下降傾向にあると仮定すると、これが原因である可能性があります。

于 2012-12-22T22:03:38.330 に答える
0

スティーブンキャノンからの答えはおそらく正しいです。したがって、安定した答えに到達するまでテスト時間を延長することは、おそらく良い考えです。また、Accelerateのドキュメントには、Mflopsのテストに使用するコードが含まれているため、テストを実行する前にCPUで調整する他のことに関する手がかりを見つけることができます。

于 2012-12-23T14:04:03.080 に答える