x86 - Core i3/5/7 CPU 是否提供测量 IPC 的机制?

标签 x86 intel performancecounter

过去十年(至少)中的所有 Intel CPU 都包含一组计算各种事件的性能监视器。最新的 Intel CPU、Core i3、i5 和 i7(又名 Nehalem)是否提供了一种计算每时钟指令数 (IPC) 的机制?如果是这样,它们是如何使用的?

如果可能,我可能会在 Assembly 中为此编写代码,但 Windows 或 Linux 系统调用也可能有用。

最佳答案

是的,来自 Intel(linux 和 windows)的 Vtune 可以测量 IPC。

如果你想自己用精确的计数器来衡量代码的某些部分,你需要使用一些性能 api,比如 PAPI 或 perfctr(都适用于 linux)。

它们使用硬件性能计数器,在英特尔手册 http://www.intel.com/products/processor/manuals/ 中有所描述。

第 3D 卷,第 30 章和附录 A。
http://www.intel.com/Assets/PDF/manual/253669.pdf

Vtune 使用“Instructions Retired”和“Non-sleep clockticks”的比率来计算 CPI(“每个指令退休的周期数”)。对于 Core2,使用的性能计数器是:“CPU_CLK_UNHALTED.CORE”、“INST_RETIRED.ANY”

此计数器对于所有 Core* CPU 都是相同的:
第 3B 卷附录 A1,第 384 页:

Table A-1. Architectural Performance Events

Event | Event Mask Mnemonic | Umask | Description
num.  
3CH   | UnHalted Core Cycles| 00H   | Unhalted core cycles
C0H   | Instruction Retired | 00H   | Instruction retired

关于x86 - Core i3/5/7 CPU 是否提供测量 IPC 的机制?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4018936/

相关文章:

assembly - 为什么 `call dword 0x12345678` 会编译成 [66,E8,72,56,34,12]?

c++ - 当数据隐藏在对象中时如何使用 intel prefetch pragma?

c - 包括正确的内在 header

c++ - 查询性能计数器状态?

.net - 根据引用应用程序的位数适当加载 x64 或 x86 版本的程序集

c++ - 原子操作、std::atomic<> 和写入顺序

linux - 在汇编中查找数字是偶数/奇数

c - Intel Intrinsics 代码优化

asp.net - 如何检测 ASP.net 应用程序中的 SqlServer 连接泄漏?

azure - 性能计数器:\Processor(_Total)\% Processor : Time Azure WAD Performance Counter