我試圖從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);
}
該代碼典型地運行兩個1000×1000矩陣的乘法。我的問題是這個代碼的連續時間是非常不可靠的;即使外環中的時間限制增加到5秒,最終速率也會在20000到30000 mflops/s之間變化。我使用OS X 10.8.2搭配2011款Macbook Pro,搭配四核i5,超頻時關閉this kernel extension,除了終端外,沒有任何應用程序正在運行。有沒有人有任何建議如何獲得更穩定的時間?
什麼是'read_timer()'?你確定它可靠嗎?你有沒有嘗試與掛鐘時間比較? –
對不起,在編輯中添加。 gettimeofday()比我測試的ctime和OpenMP掛鐘更準確 –