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 と、このカーネル拡張機能を使用してハイパースレッディングをオフにし、ベンチマーク時にターミナル以外のアプリケーションを実行していません。より安定したタイミングを得る方法について何か提案はありますか?