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

语境:

在大约同一时间,桌面处理器引入了排序执行,使性能难以预测,也许并非偶然地引入了特殊说明,以获得非常精确的时间。这些说明的示例是 rdtsc 在x86和 rftb 在PowerPC上。这些说明给出了比系统呼叫所允许的更精确的时机,使程序员能够将自己的心微不分,无论好坏。

在一个更现代的处理器上,有几个核心,其中有些在某些时候睡觉,柜台之间没有同步。我们被告知 rdtsc 不再安全地用于基准测试,但是当我们被解释替代解决方案时,我一定会打zing。

问题:

某些系统可以保存和恢复性能计数器,并提供API调用以读取适当的总和。如果您知道任何操作系统的调用是什么,请在答案中告诉我们。

某些系统可能允许关闭内核,仅保留一个运行。我知道Mac OS X Leopard在从开发人员工具中安装正确的首选项窗格时会这样做。你认为这使 rdtsc 安全使用吗?

更多上下文:

请假设我知道尝试进行微基准时在做什么。如果您认为,如果无法通过计时整个应用程序来衡量优化的收益,那么我不值得优化,我同意您的看法,但是

  1. 在替代数据结构完成之前,我无法计时整个应用程序,这将需要很长时间。实际上,如果微基准不是有希望的,我可以决定立即放弃实施。

  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( ) 在多核(和多插座)环境中提供均值的结果。

其他提示

核心正在返回“ RTDSC”的正确同步值。如果您有多功能机器,则必须将进程修复到一个插座。这不是问题。

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

我不确定OSX,但是AFAIK“ MACH_ABSOLUTE_TIME”不会调整计划的时间。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top