简而言之,我试图在用户级基准测试流程(伪代码,假设x86_64和UNIX系统)中实现以下目标:
results[] = ...
for (iteration = 0; iteration < num_iterations; iteration++) {
pctr_start = sample_pctr();
the_benchmark();
pctr_stop = sample_pctr();
results[iteration] = pctr_stop - pctr_start;
}
FWIW,我正在考虑使用的性能计数器是CPU_CLK_UNHALTED.THREAD_ALL
,用于读取独立于时钟频率变化的核心周期数(在先前的问题中,我曾计划为此使用TSC寄存器,但是可惜的是,这不是该寄存器的功能措施)。
我最初的意图是使用内联汇编程序首先使用来配置计数器WRMSR
,然后使用RDPMC
inside来读取计数器sample_pctr()
。
我偶然发现了第一个障碍,因为编写MSR需要内核特权。看来实际上您可以从用户空间读取计数器(如果配置正确),但是配置计数器(使用MSR)的操作需要由内核执行。
有谁知道一种轻巧的方法来请求内核从用户空间配置性能计数器,以便随后可以RDPMC
在基准测试工具中使用?
我研究/考虑过的东西:
perf_event_open
。看起来计数器值仅会定期更新(使用采样率)或在计数器超过阈值后更新。我问的那一刻,我确实需要对价。这就是为什么RDPMC
看起来如此吸引人的原因。我认为频繁采样本身会使性能计数器的读数产生偏差。理想情况下,我想要一个适用于OpenBSD和Linux的解决方案,但是我认为这是一个很高的要求。也许目前仅适用于Linux。
任何帮助深表感谢。谢谢。
编辑:我刚刚发现Linux msr设备节点,这可能就足够了。如果出现更好的答案,我将保留该问题。
似乎最好的方法-至少对于Linux-是使用msr设备节点。
您只需打开设备节点,查找所需的MSR地址,然后读取或写入8个字节。
OpenBSD更加困难,因为(在撰写本文时)没有MSR的用户空间代理。因此,您需要手工编写内核模块或实现sysctl。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句