分析计时不稳定
Unstable Profiling Timings
本文关键字:不稳定 更新时间:2023-10-16
我正在尝试从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,在此内核扩展中关闭了超线程的四核i5,并且在基准测试时除了终端之外没有运行任何应用程序。有没有人对如何获得更稳定的时间有任何建议?
有一些你无法控制的混淆。
有问题的处理器具有涡轮增压模式,只要不受热约束,就可以以比标称时钟速率更快的速度运行。 然而,运行持续的GEMM基准测试会使内核保持在接近峰值的算术吞吐量,这最终将导致内核达到其热包络的极限,时钟将被限制到标称速率,然后是更慢的频率。
假设您看到测量的性能呈下降趋势,这可能是原因。
斯蒂芬·卡农的答案可能是正确的。 因此,延长测试时间直到获得稳定的答案可能是个好主意。 此外,加速文档有一些代码,他们用来测试 Mflops,它比你的做得多,所以也许你可以在运行测试之前找到一些关于在 CPU 上调整的其他事情的线索。
相关文章:
- Arduino Nano:A4988 使用串行输入时通过定时器进行步进控制不稳定
- 我不知道为什么复制构造函数的调用在 c++ 中不稳定
- ArUco姿态估计中的不稳定值
- 当我使用 fstream 与 for 一起使用时值不稳定,C++
- 不稳定的C :每行适应性变化多变量初始化
- 加入向量的所有线程后,程序不稳定,而不是退出
- clEnqueueWriteImage 在执行时间上不稳定
- 不稳定:如何设置初始化器列表和函数参数的凹痕
- 图形场景中的方位角公式计算会产生不稳定的结果
- 配置不稳定以添加括号
- 向量中的项目的指针不稳定
- C++ 今天的多线程,C++ 11 的不稳定情况 - 书籍建议
- 分析计时不稳定
- 格式化构造构件成员初始化,不稳定
- 可以不稳定和/或通用的GUI划分字符串文字
- C++11 中不稳定 - 随访
- 为什么这个模拟中的摩擦力会使物体的行为不稳定
- 构建 Z3 不稳定分支时出错
- C++中不稳定的类成员
- Android-NDK 的 GGC/C++ 对于 std::string::find/std::getline(...) 来说似乎不稳定