【问题标题】:How can we know the exact number of the hardware performance counters built-in CPU?我们如何知道 CPU 内置的硬件性能计数器的确切数量?
【发布时间】:2017-08-22 00:12:34
【问题描述】:

在我读了几篇关于硬件性能计数器的文章后,我可以声称所有的英特尔处理器都支持硬件性能计数器。因此,为了访问这些额外的硬件寄存器,即硬件性能计数器,我使用了 PAPI 基础架构,经常用于访问和配置这些计数器。

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

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

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

【问题讨论】:

    标签: linux cpu intel papi intel-pmu


    【解决方案1】:

    如果您需要了解您的英特尔支持多少性能计数器 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

    【讨论】:

    • 它触发 x86 cpuid 指令 - 不幸的是不是直接的;它尝试从/dev/cpu/0/cpuid 读取,这需要内核驱动程序来提供该接口。我想这可以确保它在异构系统的情况下分别从每个内核读取 CPUID 信息?
    • @PeterCordes:cpuid 接受多个选项来使用或不使用 cpuid 驱动程序。该驱动程序不一定需要加载(因此,/dev/cpu/x/cpuid 不一定存在)。例如,当与 -1 选项一起使用时,程序直接在其运行的当前 cpu 上调用 cpuid 汇编指令。 strace,在命令上不会显示任何带有 -1 选项的 open(/dev/cpu/X/cpuid),因为调用了 cpuid 汇编指令。
    • msr-tools 版本 1.3-3 (Arch GNU/Linux) 的版本不是这样的。 strace cpuid -1 显示它无法打开 /dev/cpu/-1/cpuid。我假设有一个不同的实现使用相同的名称,或者有一个更新的版本; Arch 自 2018 年以来就没有更新过这个包。啊,是的,似乎有一个 cpuid package 在 Arch 的社区打包的东西中可能有一个不同的同名命令:aur.archlinux.org/packages/cpuid
    • 是的,在我的 Ubuntu 系统上,该工具来自cpuid package
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      所有你需要的就是尝试:

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

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

      【讨论】:

      • 如果您解释了为什么您应该这样做以及它的作用,这将是一个更好的答案。另外值得一提的是,Linux 默认为 NMI 看门狗的每个内核使用一个性能计数器,您也可以使用 sysctl kernel/nmi_watchdog = 0 禁用它(即/proc/sys/kernel/nmi_watchdog
      • 所提供的答案被标记为低质量帖子以供审核。以下是How do I write a good answer? 的一些指南。这个提供的答案可以从解释中受益。仅代码答案不被视为“好”答案。来自Review
      • 为什么我要回显一些东西,而我实际上想读一些信息,而不是写?
      • @blaze9:更改内核设置,让您无需 root 权限即可读取所需信息。查看回声被​​重定向的位置。或使用sysctl
      猜你喜欢
      • 2014-02-06
      • 2019-03-05
      • 1970-01-01
      • 2011-05-07
      • 2010-10-28
      • 1970-01-01
      • 2021-05-16
      • 2012-02-04
      • 2022-10-13
      相关资源
      最近更新 更多