代码之家  ›  专栏  ›  技术社区  ›  Pascal Cuoq

如何在多核处理器上进行基准测试

  •  4
  • Pascal Cuoq  · 技术社区  · 14 年前

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

    上下文:

    大约在桌面处理器引入无序执行(使性能难以预测)的同时,它们也引入了特殊指令,以获得非常精确的计时。这些说明的示例如下 rdtsc 在x86和 rftb 在PowerPC上。这些指令给出的计时比系统调用所允许的更精确,允许程序员对自己的心进行微基准测试,无论好坏。

    在一个更为现代的处理器上,有几个内核,其中一些内核有时会休眠,而计数器在内核之间是不同步的。我们被告知 rdtsc公司

    问题:

    有些系统可以保存和恢复性能计数器,并提供API调用来读取正确的总和。如果你知道这个电话是什么操作系统,请让我们知道在一个答案。

    一些系统可能允许关闭核心,只留下一个运行。我知道MacOSXLeopard在开发者工具中安装了正确的首选项窗格时会这样做。你认为这是 rdtsc公司 再次使用安全吗?

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

    1. 我无法计时整个应用程序,直到替代数据结构完成,这将需要很长时间。事实上,如果微观基准不被看好,我现在可以决定放弃实施;

    2 回复  |  直到 10 年前
        1
  •  2
  •   Stephen Canon    14 年前

    在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);
    

    马赫绝对时间() 在多核(和多套接字)环境中给出有意义的结果。

        2
  •  1
  •   Lothar    14 年前

    核心正在为“rtdsc”返回正确的同步值。如果你有一个多插槽的机器,你必须把进程固定在一个插槽上。这不是问题所在。

    主要问题是调度器使得数据不可靠。 Windows>Vista在这里做得很好,使用QueryThreadCycleTime和QueryProcessCycleTime。

    我不确定OSX,但AFAIK“马赫绝对时间”不会调整计划时间。