如何对多核处理器进行基准测试
-
04-10-2019 - |
题
我正在寻找在多核处理器上执行微基准测试的方法。
语境:
在大约同一时间,桌面处理器引入了排序执行,使性能难以预测,也许并非偶然地引入了特殊说明,以获得非常精确的时间。这些说明的示例是 rdtsc
在x86和 rftb
在PowerPC上。这些说明给出了比系统呼叫所允许的更精确的时机,使程序员能够将自己的心微不分,无论好坏。
在一个更现代的处理器上,有几个核心,其中有些在某些时候睡觉,柜台之间没有同步。我们被告知 rdtsc
不再安全地用于基准测试,但是当我们被解释替代解决方案时,我一定会打zing。
问题:
某些系统可以保存和恢复性能计数器,并提供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内核有一些性能API> 2.6.31,但我没有看过它。 Windows> Vista在这里做得很好,使用QueryThreadCycletime和QueryProcessCycletime。
我不确定OSX,但是AFAIK“ MACH_ABSOLUTE_TIME”不会调整计划的时间。