我们如何知道内置CPU的硬件性能计数器的确切数量?

时间:2017-03-28 18:56:52

标签: linux cpu intel papi

在我对硬件性能计数器进行了多次阅读之后,我可以声称所有英特尔处理器都支持硬件性能计数器。因此,为了访问这些额外的硬件寄存器,即。硬件性能计数器,我使用了经常用于访问和配置这些计数器的PAPI基础设施。

当我使用papi_avail实用程序报告有关数字硬件计数器的信息时,查看了意外值,即相对于图,数字硬件计数器:0可能是吗?

关于我的处理器型号(英特尔酷睿i7),我认为这是不正确的价值。

我非常感谢您提供的任何帮助。

3 个答案:

答案 0 :(得分:2)

如果您需要知道英特尔支持多少个性能计数器 CPU,您可以使用 cpuid 命令(参见man 1 cpuid)。

它很冗长,因为它触发了x86 cpuid 指令,该指令返回有关处理器的许多信息。其中,有细节 有关性能监控单元( PMU )的信息。默认情况下,该命令启动 所有CPU内核上的 cpuid 指令。但是如果核心是相同的 您可以将显示限制为一个核心。 例如,这是我们在第一个CPU上列出信息的方式:

$ cpuid -1
[...]
   Architecture Performance Monitoring Features (0xa/eax):
      version ID                               = 0x3 (3)
      number of counters per logical processor = 0x4 (4)
      bit width of counter                     = 0x30 (48)
      length of EBX bit vector                 = 0x7 (7)
   Architecture Performance Monitoring Features (0xa/ebx):
      core cycle event not available           = false
      instruction retired event not available  = false
      reference cycles event not available     = false
      last-level cache ref event not available = false
      last-level cache miss event not avail    = false
      branch inst retired event not available  = false
      branch mispred retired event not avail   = false
   Architecture Performance Monitoring Features (0xa/edx):
      number of fixed counters    = 0x3 (3)
      bit width of fixed counters = 0x30 (48)
      anythread deprecation       = false
[...]

在上面的显示中,我们看到 PMU 版本是3:

 version ID = 0x3 (3)

每个内核有4个可编程计数器:

number of counters per logical processor = 0x4 (4)

每个内核有3个固定计数器:

number of fixed counters = 0x3 (3)

计数器均为48位长:

bit width of counter        = 0x30 (48)
bit width of fixed counters = 0x30 (48)

PMU的功能特定于体系结构。如果您需要英特尔PC /主板的其他详细信息,则上一条命令显示的第一行将提供CPU /架构标识。 例如:

   [...]
   vendor_id = "GenuineIntel"
   version information (1/eax):
      processor type  = primary processor (0)
      family          = 0x6 (6)
      model           = 0xa (10)
      stepping id     = 0x9 (9)
      extended family = 0x0 (0)
      extended model  = 0x3 (3)
      (family synth)  = 0x6 (6)
      (model synth)   = 0x3a (58)
      (simple synth)  = Intel Core (unknown type) (Ivy Bridge E1/N0/L1/P0) {Sandy Bridge}, 22nm
      [...]

使用这些信息,您可以参考Intel documentation

答案 1 :(得分:0)

查看第18章 "性能监控" 和19 "性能监控事件&#34 ; 部分Intel® 64 and IA-32 Architectures Software Developer Manuals卷3B(latest version here)。

答案 2 :(得分:0)

所有您需要的就是尝试:

sudo sh -c 'echo 1 >/proc/sys/kernel/perf_event_paranoid'

所有最新的Linux内核均配备有perf实用程序,用于访问硬件性能计数器。但是,出于安全问题,默认情况下,我们无权访问这些计数器。存储在文件“ perf_event_paranoid”中的默认值为3,这意味着我们无法访问计数器。通过将该值修改为1(允许访问),我们可以获得有关可用性能计数器的信息,并可以使用perf或任何可用工具(如PAPI)对其进行访问。