微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

用代码中的turboboost测量CPU频率

我正在用三种不同的频率在三台不同的计算机上分析一些代码。 我需要测量GFLOPs / s的频率。 我有一些代码这样做,但它不占Turboboost。 例如,在我的2600k cpu上,它报告的是3.4 GHz,但我可以看到当我运行cpuz时,我的cpu在4.3 GHz(超频)下运行,用于使用所有内核的代码

#include "stdint.h" #include "stdio.h" #include "omp.h" int main() { int64_t cycles = rdtsc(); double dtime = omp_get_wtime(); //run some code which uses all cores for a while (few ms) dtime = omp_get_wtime() - dtime; cycles = rdtsc() - cycles; double freq = (double)cycles/dtime*1E-9; printf("freq %.2f GHzn",freq); } __int64 rdtsc() { #ifdef _WIN32 return __rdtsc(); #else uint64_t t; asm volatile ("rdtsc" : "=A"(t)); return t; #endif }

我知道这个问题已经被各种各样的答案问过了,但是如果能做到这一点还不清楚。 我不在乎黑客试图改变计时器。 这段代码只适用于我自己。 是否有可能获得代码中的实际频率? 这在Linux上如何完成? 我在Linux上find的每个例子都给出了基频(或者说最大值),但并不像cpuz那样负载下的工作频率。

编辑:我发现一个程序,Powertop,Linux似乎显示实际的运行频率。 由于源代码可用,也许有可能找出如何获得我自己的代码中的实际频率。

Linux inotify API的效率如何?

在Linux中存储和访问多达1000万个文件

pthread互斥量的开销?

我在一个2MBPS的互联网连接,但我想检查一个网站,就像我在同一台PC上的256 KBPS连接?

Tomcat进程在交换空间不足后被Linux内核杀死; 不要得到任何JVM OutOfMemory错误

如何限制Python进程的I / O消耗(可能使用ionice)?

perf-stat结果是否可以从perf.data文件生成

Windows(Vista):在程序快捷方式上设置进程优先级

32位应用程序如何在64位Linux上进行系统调用

Windows fsync(Flushfilebuffers)性能与大文件

我终于解决了这个问题。 可以用代码测量实际工作频率,而不需要设备驱动程序或读取特殊计数器。

基本上你需要一个循环来执行一个带有循环依赖的操作,这个操作总是需要相同的延迟。 例如

for(int i=0; i<spinCount; i++) { x = _mm_add_ps(x,_mm_set1_ps(1.0f)); }

您在绑定到每个物理核心(不是逻辑)核心的线程中运行此循环。 这就要求系统中没有其他的线程,那么这些线程需要很长的cpu时间,所以这种方法并不总是给出正确的答案,但在我的情况下,它工作得很好。 我得到的结果偏离正确的涡轮频率的一个螺纹和Nahalem,Ivy桥,和Haswell单线路系统和多插座系统上的许多线程的小于0.5%。 我详细地描述了这个问题, 我怎样才能以编程的方式找到cpu-frequency-with-c,所以我不会在这里重复所有的细节。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐