我试图从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);
}
代码通常运行两个1000x1000矩阵的乘法。我的问题是这段代码的连续时间非常不可靠;即使外环中的时间限制增加到五秒,最终速率也会在20000到30000 mflops / s之间变化。我使用OS X 10.8.2的2011 Macbook Pro,使用this kernel extension关闭超线程的四核i5,并且在我进行基准测试时除了终端之外没有应用程序运行。有没有人对如何获得更稳定的时间有任何建议?
答案 0 :(得分:2)
有一些你没有控制的混乱。
有问题的处理器具有turbo模式,只要它不受热约束,它就能比标称时钟速率更快地运行。然而,运行持续的GEMM基准测试可将内核固定在接近峰值的算术吞吐量,这最终会导致内核达到其热包络的极限,并且时钟将被限制到标称速率,然后降低到甚至更慢的频率。
假设您在测量的表现中看到了下降趋势,这可能是负责任的。
答案 1 :(得分:0)
Stephen Canon的答案可能是正确的。因此,延长测试时间直到达到稳定的答案可能是一个好主意。此外,Accelerate documentation有一些代码用于测试Mflops它比你的更多,所以也许你可以找到一些关于在运行测试之前调整CPU的其他东西的线索。