如何获取线程的 CPU 指令数?

Posted

技术标签:

【中文标题】如何获取线程的 CPU 指令数?【英文标题】:How to get CPU instruction count for a thread? 【发布时间】:2019-01-29 19:20:03 【问题描述】:

我知道getrusage() 可以提供每个线程的 CPU 利用率,但只能提供在 CPU 上花费的时间。有什么方法可以获取执行的 CPU 指令的数量?或者在 cpu 上花费的周期数? 基本上,我需要找到一个可重现的方法来衡量线程在 CPU 上的花费。有什么建议可以在 C 中执行此操作吗?

更新(响应 cmets):

理想情况下,我需要独立于平台的方式,但 Linux 将是最有用的。 可重复性对我来说是最重要的,即使这意味着实际运行时间可能会略有不同。 我知道 vTune(并且已经使用它),但我希望在我的代码运行时以编程方式获取此信息。因此,vTune 以及 Craig Estey 链接的帖子中提出的建议都已发布。 我确实看过Intel Intrinsics Guide,但没有发现任何有用的...

【问题讨论】:

这必须依赖于平台。请指定操作系统。 注意。循环数可能更有用,但不能完全重现。管道停顿、缓存未命中等。指令的数量应该是可重现的,但并不能告诉您太多关于速度的信息,因为指令延迟不统一(可能在较旧的 RISC 或嵌入式芯片上除外) 不建议在 C 中执行此操作,但如果您使用的是 Intel 处理器,请查看 en.wikipedia.org/wiki/VTune 请参阅:***.com/questions/54355631/… 这是您问题的虚拟副本,并提供了许多不同的方法 @tadman:我发现在不休眠或不等待 I/O 的 CPU 密集型代码中,查看周期计数而不是时间是在调整时考虑 CPU 频率变化的有用方法代码在时钟对时钟的基础上更有效。不过,如果等待来自其他内核的数据是一个因素,这可能不会成立。这取决于非核心时钟,而不是这个核心的时钟。 (尽管在台式机 CPU 上,所有内核和非内核都锁定在同一频率。) 【参考方案1】:

看看谷歌的灯丝引擎。他们正是这样做的。 看看他们的分析器。 https://github.com/google/filament/blob/master/libs/utils/src/Profiler.cpp 您也可以从此链接获取更多信息: https://www.youtube.com/watch?v=Lcq_fzet9Iw

【讨论】:

以上是关于如何获取线程的 CPU 指令数?的主要内容,如果未能解决你的问题,请参考以下文章

[C/C++11]_[初级]_[获取CPU支持的最合适的核心线程数]

[C/C++11]_[初级]_[获取CPU支持的最合适的核心线程数]

[C/C++11]_[初级]_[获取CPU支持的最合适的核心线程数]

[C/C++11]_[初级]_[获取CPU支持的最合适的核心线程数]

实时获取子Appdomain cpu使用、内存使用、线程数

Java如何依据cpu核数设置合适的线程数