c++ 性能计数器pcm c++如何使用intel pcm监控cpu性能

陌敏酱_2389

陌敏酱_2389

2026-03-26

608人浏览

原创

intel pcm需手动编译安装,编译时需指定-i./cpp -l./build并链接-lpcm,运行前设ld_library_path=./build;须sudo权限、加载msr模块、禁用虚拟化,且需用pcm-core.x验证硬件支持。

c++ 性能计数器pcm c++如何使用intel pcm监控cpu性能

pcm-core.cpp 编译失败:找不到 pcm-core.h 或链接 libpcm.so

Intel PCM 不是系统自带库,必须手动编译安装后才能在 C++ 项目中调用。常见错误是直接 #include <pcm-core.h></pcm-core.h> 就编译,结果报“no such file”或“undefined reference to PCM::getInstance”。

  • 先去 GitHub opcm/pcm 克隆最新代码,进入目录后运行 make(需装好 g++、make、cmake)
  • make 成功后,头文件在 ./cpp/ 下,动态库生成在 ./build/libpcm.so(不是系统路径)
  • 编译你的程序时得显式指定路径:g++ -I./cpp -L./build your_app.cpp -lpcm -o your_app
  • 运行前要设 LD_LIBRARY_PATH=./build,否则 libpcm.so 找不到

初始化 PCM::getInstance() 返回 nullptr:权限或内核模块问题

Intel PCM 需要读取 MSR 寄存器,普通用户默认无权访问。即使编译通过,PCM::getInstance() 也可能返回 nullptr,且不报错——这是最隐蔽的坑。

C++14
C++14

C++14 对 C++11 的修正与增强版本,适合旧系统维护和较老工具链兼容。

下载
  • 确认已加载 msr 内核模块:lsmod | grep msr;没输出就运行 sudo modprobe msr
  • 运行你的程序必须加 sudo,否则 PCM::getInstance() 内部检测到权限不足会静默失败
  • 某些发行版(如 Ubuntu 22.04+)默认禁用 MSR 访问,需检查 /sys/module/msr/parameters/enabled 是否为 Y
  • 虚拟机里基本不可用——KVM/VirtualBox 默认屏蔽 MSR 读取,别白费时间调试

systemCounter->program() 失败:CPU 型号不支持或计数器被占用

调用 program() 是启动采样的关键一步,失败常表现为返回值非 0,但错误码含义模糊。

  • 先用 ./pcm-core.x -v(PCM 自带工具)验证硬件支持:它能跑通,说明 CPU 型号在 PCM 支持列表内(如 Skylake 及更新架构基本 OK,老 Atom 可能不行)
  • 同一台机器上不能多个进程同时调用 program()——PCM 占用固定性能计数器资源,第二个调用会因资源冲突失败
  • 部分笔记本 CPU 在降频/节能状态下可能拒绝编程计数器,可尝试插电 + BIOS 关闭 C-states 测试
  • 返回 -1 通常是权限或模块问题;返回 -2 多为 CPU 不支持或计数器被占;返回 -3 往往是内核版本太旧(PCM 要求 Linux ≥ 3.10)

采样间隔不准、数据跳变:没调用 sleep() 或忽略 getNumOnlineCores()

PCM 本身不提供定时循环,你得自己控制采样节奏。新手常写成“采集一次就退出”,或用 std::this_thread::sleep_for() 但单位搞错,导致数据毫无规律。

  • 采样周期建议 ≥ 100ms,太短会导致计数器溢出或系统开销反超观测目标
  • 别直接用 sleep(1)——sleep() 是秒级,usleep() 已废弃,推荐 std::this_thread::sleep_for(std::chrono::milliseconds(500))
  • 多核场景下,getNumOnlineCores() 返回的是当前在线逻辑核数,不是物理核数;遍历 core ID 时务必用它做上界,硬写 0..31 在笔记本上大概率越界
  • 每次 update() 后,记得用 getCoreCounterState(i) 拿对应核的数据,别复用同一个对象——不同核状态独立
PCM 的核心限制不在 API 复杂度,而在它和硬件、内核、权限的强耦合。哪怕代码完全照文档抄,只要少一个 sudo、漏载 msr 模块、或在 VM 里试,就卡在第一步不动。真要用,先跑通 pcm-core.x,再动自己的 C++ 程序。

C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!

相关文章

数码产品性能查询
数码产品性能查询

该软件包括了市面上所有手机CPU,手机跑分情况,电脑CPU,电脑产品信息等等,方便需要大家查阅数码产品最新情况,了解产品特性,能够进行对比选择最具性价比的商品。

下载

相关标签:

c++

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
undefined是什么
undefined是什么

undefined是代表一个值或变量不存在或未定义的状态。它可以作为默认值来判断一个变量是否已经被赋值,也可以用于设置默认参数值。尽管在不同的编程语言中,undefined可能具有不同的含义和用法,但理解undefined的概念可以帮助我们更好地理解和编写程序。本专题为大家提供undefined相关的各种文章、以及下载和课程。

2023.07.31

11985

4

网页undefined是什么意思
网页undefined是什么意思

网页undefined是指页面出现了未知错误的意思,提示undefined一般是在开发网站的时候定义不正确或是转换不正确,或是找不到定义才会提示undefined未定义这个错误。想了解更多的相关内容,可以阅读本专题下面的文章。

2024.08.14

5507

7

网页undefined啥意思
网页undefined啥意思

本专题整合了undefined相关内容,阅读下面的文章了解更多详细内容。后续继续更新。

2025.12.25

2516

7

github中文官网入口 github中文版官网网页进入
github中文官网入口 github中文版官网网页进入

github中文官网入口https://docs.github.com/zh/get-started,GitHub 是一种基于云的平台,可在其中存储、共享并与他人一起编写代码。 通过将代码存储在GitHub 上的“存储库”中,你可以: “展示或共享”你的工作。 持续“跟踪和管理”对代码的更改。

2026.01.21

8585

27

GitHub官网入口版本汇总
GitHub官网入口版本汇总

本专题整合了GitHub入口版本地址汇总,阅读专题下面的文章了解更多详细内容。

2026.04.02

898

19

磁盘配额是什么
磁盘配额是什么

磁盘配额是计算机中指定磁盘的储存限制,就是管理员可以为用户所能使用的磁盘空间进行配额限制,每一用户只能使用最大配额范围内的磁盘空间。php中文网为大家提供各种磁盘配额相关的内容,教程,供大家免费下载安装。

2023.06.21

4190

4

如何安装LINUX
如何安装LINUX

本站专题提供如何安装LINUX的相关教程文章,还有相关的下载、课程,大家可以免费体验。

2023.06.29

3533

10

linux find
linux find

find是linux命令,它将档案系统内符合 expression 的档案列出来。可以指要档案的名称、类别、时间、大小、权限等不同资讯的组合,只有完全相符的才会被列出来。find根据下列规则判断 path 和 expression,在命令列上第一个 - ( ) , ! 之前的部分为 path,之后的是 expression。还有指DOS 命令 find,Excel 函数 find等。本站专题提供linux find相关教程文章,还有相关

2023.06.30

2773

5

linux修改文件名
linux修改文件名

本专题为大家提供linux修改文件名相关的文章,这些文章可以帮助用户快速轻松地完成文件名的修改工作,大家可以免费体验。

2023.07.05

6770

7

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C++ Core Guidelines
C++ Core Guidelines

共0课时 | 0人学习

C++ Reference
C++ Reference

共0课时 | 0人学习

C++ 官方标准说明
C++ 官方标准说明

共0课时 | 0人学习