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);
}

该代码通常运行两个 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

Stephen Canon 的回答可能是正确的。所以延长测试时间直到你得到一个稳定的答案可能是一个好主意。此外,Accelerate文档中有一些用于测试 Mflops 的代码,它比你的要多得多,所以也许你可以在运行测试之前找到一些关于在 CPU 上调整其他事情的线索。

于 2012-12-23T14:04:03.080 回答