如何基准多

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

语境:

大约与此同时,台式机处理器引入乱序执行,导致性能难以预测,它们可能并非巧合地引入了特殊指令来获得非常精确的时序。 这些指令的rdtsc是x86上的rftb和PowerPC上的rftb 。 这些指令给出了比系统调用所允许的更精确的时序,允许程序员将他们的心微观化,无论好坏。

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

题:

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

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

更多上下文:

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

  • 在替代数据结构完成之前,我无法对整个应用程序进行计时,这需要很长时间。 事实上,如果微基准不是很有希望的话,我现在可以决定放弃实施;

  • 我需要在一份我无法控制的截止日期的出版物中提供数字。


  • 在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 Kernel> 2.6.31有一些性能API,但我没有看过它。 Windows> Vista在这里做得很好,使用QueryThreadCycleTime和QueryProcessCycleTime。

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

    链接地址: http://www.djcxy.com/p/86519.html

    上一篇: How to benchmark on multi

    下一篇: sbrk system call in unix