4

我正在寻找在多核处理器上执行微基准测试的方法。如何在多核处理器上进行基准测试

语境:

大约在介绍的同时桌面处理器乱序执行的是做出业绩很难预测,他们,也许不是巧合,还推出了特殊的指令来得到非常精确的计时。这些指令的示例是x86上的rdtsc和PowerPC上的rftb。这些指令给出了比系统调用所允许的更精确的时序,允许程序员将他们的心微观化,无论好坏。

在具有多个内核的更现代的处理器上,其中一些内核会休眠,但内核之间的计数器不会同步。我们被告知,rdtsc已不再适用于基准测试,但是当我们解释替代解决方案时,我一定会打瞌睡。

问:

一些系统可以保存和恢复的性能计数器,并提供一个API调用来读取正确的总和。如果您知道此通话适用于任何操作系统,请在回答中告诉我们。

某些系统可能允许关闭核心,只剩下一个正在运行。我知道Mac OS X Leopard会在开发人员工具中安装正确的首选项窗格时执行此操作。你认为这使得rdtsc再次安全使用?

更多背景:

请假设我知道努力做一个微基准当我在做什么。如果你认为,如果一个优化的涨势无法通过定时整个应用程序进行测量,这是不值得的优化,我同意你的看法,但

  1. 我不能一次全部应用程序,直到替代数据结构完成,这将需要很长时间。事实上,如果微基准不是很有希望的话,我现在可以决定放弃实施;

  2. 我需要一个数字来提供出版物的截止日期,我无法控制。

回答

2

在OSX(ARM,Intel和PowerPC),要使用mach_absolute_time()

#include <mach/mach_time.h> 
#include <stdint.h>  

// Utility function for getting timings in nanoseconds. 
double machTimeUnitsToNanoseconds(uint64_t mtu) { 
    static double mtusPerNanosecond = 0.0; 
    if (0.0 == mtusPerNanosecond) { 
     mach_timebase_info_data_t info; 
     if (mach_timebase_info(&info)) { 
      // Handle an error gracefully here, whatever that means to you. 
      // If you do get an error, something is seriously wrong, so 
      // I generally just report it and exit(). 
     } 
     mtusPerNanosecond = (double)info.numer/info.denom; 
    } 
    return mtu * mtusPerNanosecond; 
} 

// In your code: 
uint64_t startTime = mach_absolute_time(); 
// Stuff that you want to time. 
uint64_t endTime = mach_absolute_time(); 
double elapsedNanoseconds = machTimeUnitsToNanoseconds(endTime - startTime); 

注意,有没有必要限制到一个核心这一点。操作系统在后台处理mach_absolute_time()所需的修复,以在多核(和多插座)环境中提供有意义的结果。

+0

谢谢,我应该可以从http://developer.apple.com/mac/library/qa/qa2004/qa1398.html中找到它,尽管我对'man mach_absolute_time'的结果非常失望。 – 2010-05-08 16:09:09

+0

@帕斯卡尔:这将是一个很好的错误报告。我发布了一些示例代码,以避免在该笔记中投射指针。 – 2010-05-08 16:11:05

+0

请注意,此解决方案将受到探测效应的影响,远远超过将进程固定到单个内核并使用两次rtdsc(在x86上,不能用于PowerPC)。编译器可能不会内联你的函数,他们会占用更多的指令缓存,并且你正在做乘法和除法,我相信他们可以根据它们的操作数完成多长时间。 'rtdsc'只是读取一个寄存器,因此便宜得多,并且会减少您的结果。 – 2012-08-22 01:31:13

1

内核正在返回“rtdsc”的正确同步值。如果你有一个多插口机器,你必须将这个进程固定到一个插座上。这不是问题。

主要问题是调度程序使数据不可靠。 Linux Kernel> 2.6.31有一些性能API,但我没有看过它。 Windows> Vista在这里做得很好,使用QueryThreadCycleTime和QueryProcessCycleTime。

我不确定OSX,但AFAIK“mach_absolute_time”不调整预定时间。

相关问题