【问题标题】:Is it worth using rdtsc() for speed measurements?是否值得使用 rdtsc() 进行速度测量?
【发布时间】:2020-08-19 20:30:43
【问题描述】:

我有 4 个测试函数 - foo1()、foo2()、foo3() 和 foo4()。 对于测量,我使用以下程序:

unsigned __int64 start;
unsigned __int64 stop;
unsigned __int64 sum;
unsigned __int64 orig;

sum = 0;
for (int i = 0; i < 10000; i++)
{
    start = __rdtsc();
    foo1();
    stop = __rdtsc();
    sum += (stop - start);
}
orig=sum;
cout << "foo1() \taverage: " << (sum / 10000.0) << ", \tratio: " << ((double)orig / sum) << endl << endl;

sum = 0;
for (int i = 0; i < 10000; i++)
{
    start = __rdtsc();
    foo2();
    stop = __rdtsc();
    sum += (stop - start);
}
cout << "foo2() \taverage: " << (sum / 10000.0) << ", \tratio: " << ((double)orig / sum) << endl << endl;

等等,对于 foo3() 和 foo4()。

我在控制台上有这个日志:

foo1()      average: 401495,        ratio: 1
foo2()      average: 24251.2,       ratio: 16.5557
foo3()      average: 11497.7,       ratio: 34.9195
foo4()      average: 7439.06,       ratio: 53.9713

这是否意味着使用 foo4 () 比使用 foo1 () 快约 50 倍(实时)?

或者这是否意味着 foo4() 的性能肯定比 foo1() 好?

【问题讨论】:

  • 进行基准测试时,是否确保 CPU 频率保持恒定?
  • 如果您以交错方式(即在同一个循环中)执行foo 函数会产生什么结果?我还建议您放弃第一次迭代以减少可能的偏差(例如,内存/缓存延迟对第一次调用的影响)。此外,计算时间的标准偏差(而不仅仅是平均值)可以帮助您跟踪可能的基准测试/性能问题,还可以提供有关您是否可以安全地比较平均值的提示。

标签: c++ performance tsc measurement rdtsc


【解决方案1】:

更快(实时)”和“性能更好”在单线程、无竞争的上下文中是等效的,前提是测量正确。 p>

从外观上看,50 倍加速测量是该函数比基线更快、因此更好的肯定信号。

但在你得出结论之前:

  1. 将您的代码包装到另一个外部循环中,并循环至少几百毫秒,丢弃前 200 毫秒的结果,然后取剩余测量值的平均值 .如果被测函数访问内存,这一点尤其重要。内存缓存效果可以解释 100 倍以上的经过时间差。

  2. 在每次调用 foo 后添加对 _mm_lfence() 的调用,以确保在进行时钟测量之前其所有指令都已退出。

微基准测试很难;这通常意味着某些功能只有结合起来才能有意义地衡量,而且处理的数据量应该大致相当于现实生活中的场景。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-11-25
    • 1970-01-01
    • 1970-01-01
    • 2020-05-02
    • 1970-01-01
    • 2014-01-15
    • 2017-07-01
    • 2013-09-14
    相关资源
    最近更新 更多