Linux中怎么精确获取cpu主频和cpu周期

likeyiyy likeyiyy 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
首先我当然知道用cat /proc/cpuinfo
我的机器得到的结果是1600Mhz
然而在用程序进行测试时,我发现不是这样。
----------------------------------------------------------------------
当然我最初的需求是想获取cpu的周期,我要根据cpu周期做一个相对精确的延时,比如说几十个ns。
我在网上找到一段程序。
static inline uint64_t get_cycle_count()
{
unsigned int lo,hi;
__asm__ __volatile__ ("rdtsc" : "=a" (lo), "=d" (hi));
return ((uint64_t)hi << 32) | lo;
}
这个函数使用rdtsc指令。
-----------------------------------------------------------------------
当然很明显,我的目的是要延时指定的ns数,所以我要在cpu周期数和ns数之间做一个转换。

要延时的cpu周期数 = 要延时的ns数 * (CPU主频(MHz) / 1000)

我想上面的公式是没有错的。(不会有错吧。)

然后我发现程序并没有延时我指定的ns数,我很奇怪,然后写了一段程序验证。

uint64_t old,new;
int i = 0;
int delayms = 700;
for(i = 0; i < 100; i++)
{
old = get_cycle_count();
usleep(delayms* 1000);
new = get_cycle_count();

printf("%d\n",(new-old)/delayms*1000);
}

上面的程序(new-old)/delayms将得到一个固定的比值,这个比值应该代表当前的CPU的主频,以Mhz为单位,没问题吧。

我以为我会得到1600,然而事实上我的到的是,2667,真是一个奇葩的数字。

我不知道到底是因为cat /proc/cpuinfo无法得到正真的频率。
还是get_cycle_count无法得到真正的时钟周期
但是无论如何,我想问一下:Linux中怎么精确获取cpu主频和cpu周期呢?

#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <stdint.h>
#include <string.h>
#include <time.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <ctype.h>

#define NS 1000000000


// Linux/GCC

static inline uint64_t get_cycle_count()
{
unsigned int lo,hi;
__asm__ __volatile__ ("rdtsc" : "=a" (lo), "=d" (hi));
return ((uint64_t)hi << 32) | lo;
}

int main(int argc,char ** argv)
{

int i = 0;
uint64_t old,new;
int delayms = 700;
for(i = 0; i < 100; i++)
{
old = get_cycle_count();
usleep(delayms * 1000);
new = get_cycle_count();
printf("%u\n",(new-old)/(delayms*1000));

}
}
...全文

相关推荐

Linux下代码运行时间的高精度测量

TSC以机器的时钟周期为单位,其快慢与机器的主频有关。每个时钟周期等于1秒除以主频(以赫兹Hz计算)。由于当前的CPU主频非常高,因此这个部件可以达到纳秒级的计时精度。

swg0803

如何获取计算机CPU主频信息:全面指南

CPU主频,也称为时钟频率,是衡量CPU处理速度的一个重要参数,它表示CPU每秒钟能够运行的最大指令数。通常以GHz(吉赫兹)为单位,1GHz等于每秒十亿次周期。CPU的性能不仅仅依赖于主频,还包括了多个关键参数,如核心数量、线程数、缓存大小、制程技术、指令集等。核心数量表示CPU处理任务的能力,线程数(超线程技术)能够提高并发处理的效率,缓存大小决定了数据处理速度的快慢,制程技术决定了CPU的功耗和发热情况,指令集则决定了CPU能够支持哪些类型的计算。

南风寺山

模拟非法指令的性能分析

通过在函数调用前后分别获取时间戳,我们可以计算出执行该操作所需的确切时钟周期数。将这些周期数转换为实际时间,再结合CPU的主频,即可得到模拟非法指令的具体耗时。

wzhou1974

完美获取 CPU 的 NUMA节点数、CPU插槽个数 、 核心数 、 逻辑处理器数(线程数)、名字、制造商、指令集、主频、等等

**主频**:CPU 的时钟频率,单位为 GHz,代表 CPU 运算速度,主频越高,理论上处理速度越快。获取这些信息的方法通常依赖于操作系统提供的工具或 API。

昵称Splendour

Linux 获取CPU和内存的大小

在Linux操作系统中,监控CPU和内存的使用情况是系统管理员日常任务的重要部分,这有助于优化系统性能、排查问题以及合理分配资源。以下是一些获取CPU和内存大小以及使用率的方法。

AjiaLJ
评论 8
收藏 已收藏
分享
返回顶部
likeyiyy
CPU和硬件区 1,025 成员 561 内容