我正在用三种不同的频率在三台不同的计算机上分析一些代码。 我需要测量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] 举报,一经查实,本站将立刻删除。