测量CPU时钟速度
Measuing CPU clock speed
我正在尝试测量CPU的速度。我不确定我的方法是准确的。基本上,我尝试了一个带有诸如UINT_MAX
之类的值的空for
循环,但是程序很快终止了,因此我尝试了UINT_MAX * 3,等等...
然后我意识到编译器正在优化循环,因此我添加了一个volatile
变量以防止优化。以下程序大约需要1.5秒才能完成。我想知道该算法用于测量时钟速度的准确性。另外,我怎么知道该过程中涉及多少核心?
#include <iostream>
#include <limits.h>
#include <time.h>
using namespace std;
int main(void)
{
volatile int v_obj = 0;
unsigned long A, B = 0, C = UINT32_MAX;
clock_t t1, t2;
t1 = clock();
for (A = 0; A < C; A++) {
(void)v_obj;
}
t2 = clock();
std::cout << (double)(t2 - t1) / CLOCKS_PER_SEC << std::endl;
double t = (double)(t2 - t1) / CLOCKS_PER_SEC;
unsigned long clock_speed = (unsigned long)(C / t);
std::cout << "Clock speed : " << clock_speed << std::endl;
return 0;
}
这根本无法测量时钟速度,它可以测量每秒可以进行多少次循环迭代。没有规则说一个迭代将每个时钟周期运行。 May 是这种情况,您实际上可能发现情况是如此 - 当然,具有优化的代码和合理的CPU,无用的循环不应慢得多。但是,它可能以一半的速度运行,有些处理器每2个周期都无法退休超过1个分支。在深奥的目标上,所有赌注都关闭了。
所以不,这不会测量时钟周期,除了意外。通常,很难获得经验时钟速度(您可以询问您的操作系统,因为
>如果测量循环所需的壁时钟时间,则必须知道(至少)每次迭代的循环次数。这是一个足够严重的组装问题,需要对预期的微体系结构的相当详细的了解(也许每个依赖的指令链也许只有一个只能合理地进行1个周期,例如
add eax, 1
?一个足够长的链条,在测试/分支吞吐量上差异很小足以忽略),因此显然您在那里所做的任何事情都不是便携式的,并且内置的假设可能会变成false(实际上还有其他答案,因此可以做到这一点,并假设addps
的延迟为3,而它不't在Skylake上不再存在,并且没有旧的AMD)。在C中?现在放弃。编译器可能正在滚动一些随机代码生成器,并且依靠它是合理的,就像对熊一样做同样的事情。猜测您既不能控制,甚至不知道的迭代的循环数量只是愚蠢的。如果仅在您自己的计算机上,则可以检查代码,但是您也可以手动检查时钟速度。如果您测量在给定数量的壁时钟时间中经过的时钟周期的数量..但这很棘手。因为
rdtsc
不测量时钟周期(不再),因此没有其他任何东西更接近。您可以测量的东西,但是使用频率缩放和涡轮增压,通常不会是实际的时钟周期。您可以从性能计数器中获得实际时钟周期,但是您不能从用户模式下做到这一点。显然,您尝试这样做的任何方法都不是便携式的,因为您不能端口地索要经过的时钟周期的数量。
因此,如果您正在这样做以获取实际信息,而不仅仅是要乱七八糟,那么您应该只询问操作系统。对于Windows,请查询WMI中的CurrentClockSpeed或MaxClockSpeed,无论您想要哪个。在Linux上,/proc/cpuinfo
中有东西。仍然无法移植,但是没有解决方案是。
至于
我怎么知道该过程中涉及多少核心?
1。当然,您的线程可能会在内核之间迁移,但是由于您只有一个线程,因此随时仅在一个核心上。
良好的优化器可以删除循环,因为
for (A = 0; A < C; A++) {
(void)v_obj;
}
对程序状态具有相同的影响;
A = C;
因此,优化器完全可以自由放松您的循环。
因此,您不能以这种方式测量CPU速度,因为它取决于编译器与计算机上一样多(更不用说可变时钟速度和已经提到的多层架构)
- 在C++/Linux中设置单调时钟的一些技巧
- 为什么在读取文件大小时文件IO速度会发生变化
- 从文本文件中读取时钟时间和事件时间并进行处理
- 为什么std::condition_variable notify_all的工作速度比notify_one快(对于随机请
- 文件系统:复制功能的速度秘诀是什么
- 学习多线程C++:添加线程不会使执行速度更快,即使它看起来应该
- this_thread::sleep_for和计时时钟之间的关系是否由C++11标准指定
- 用时钟测量程序的运行时间
- 在C++中使用并行化的预期速度是多少(不是 OpenMp,而是 <thread>)
- 两个连续的 OpenMP 并行区域会相互减慢速度
- 查找标准::hash_map与标准::矢量的速度
- 加快在C++中读取/处理日志文件的速度
- 为什么这些算法的运行速度比它们应该的要快?
- 如何提高文件的读取速度?
- 通过libpqxx提高PostgreSQL数据库的更新速度
- 使用 IMFSinkWriter 编码的视频的播放速度会根据宽度而变化
- 计算车辆之间的距离并设置速度,使距离保持不变,例如 5 米
- 如何加快大字符串的解析速度?
- 测量CPU时钟速度
- 如何以较低的时钟速度在C语言中运行程序