【问题标题】:Where to find perf event document在哪里可以找到 perf 事件文档
【发布时间】:2018-08-08 04:39:24
【问题描述】:

在问题cpu cache performance. store misses vs load misses中,没有关于在哪里可以找到perf list列出的事件文档的答案

man perfperf help list 找不到,

看了Intel@64和AMD64的Event文档,事件格式如下 Last Level Cache References — Event select 2EH, Umask 4FH 那么它在哪里呢?

编辑:明确一点,我想通过perf list查找事件列表的文档

【问题讨论】:

  • Use ocperf.py 用于 CPU 特定事件的符号名称,例如 l2_lines_in.alluops_issued.any。 (ocperf.py list 向他们展示了他们的意思的简短文档)。
  • 那不是官方文档,也不完整。
  • 我知道这不是官方的,但它在实践中非常有用。这就是为什么我发表评论,而不是答案。它缺少哪些事件?我认为它或多或少是完整的,除了一些你可以用面具/选项来做一些事情的事情。
  • 当您运行ocperf.py stat -e whatever ./a.out 时,它会在运行之前打印perf 命令,例如perf stat -e cpu/event=0xb1,umask=0x1,name=uops_executed_thread/ ./a.out。 (数字代码仅适用于 perf 不知道名称的事件。perfocperf.py 可能有一个详细选项)。我认为这与您要问的很接近。
  • 您是否试图找出您的 perf 版本支持的预定义事件列表?如果是这样,那么直接运行perf list,它将为您提供可用于测量的事件列表。如果在任何情况下您都无法使用它们中的任何一个,您应该尝试使用事件的符号名称 - (这就是 ocperf.py 将提供帮助的地方,正如 Peter 所建议的那样)。

标签: kernel document perf manual


【解决方案1】:

预定义的perf 事件列表,如branches cycles LLC-load-misses 由 Linux 内核中 perf 子系统的源代码记录。该列表部分映射到不同 CPU 型号和微架构的各种硬件事件。使用来自andikleen's pmu-tools(如果您的 CPU 是 Intel)的 ocperf.py(和 toplev.py)与来自 Intel 文档的事件名称(ocperf 不是官方的,但它是由 Intel 员工编写并使用 官方列表来自https://download.01.org/perfmon/https://download.01.org/perfmon/readme.txt“这个包包含英特尔处理器的性能监控事件列表”)

对于 x86 和 x86_64 perf,这些(古老的)预定义/通用名称映射到 arch/x86/events 目录,例如对于所有英特尔酷睿微架构检查 arch/x86/events/intel/core.c 并通过其代码名称搜索微架构(Core、Core2、 NHM=Nehalem、WSM=Westmere、SNB=SandyBridge、IVB=IvyBridge、HSW=HaSWell、BDW=BroaDWell、SKL=SKyLake、SLM=SiLverMont 和其他来自listsamd)。对于 Skylake,line 394 of intel/core.c of 4.15.8 有结构,我们看到 PREFETCH 计数器未映射到所有缓存(“不支持”)

 static __initconst const u64 skl_hw_cache_event_ids

 [ C(L1D ) ] = {
    [ C(OP_READ) ] = {
        [ C(RESULT_ACCESS) ] = 0x81d0,  /* MEM_INST_RETIRED.ALL_LOADS */
        [ C(RESULT_MISS)   ] = 0x151,   /* L1D.REPLACEMENT */
    },
    [ C(OP_WRITE) ] = {
        [ C(RESULT_ACCESS) ] = 0x82d0,  /* MEM_INST_RETIRED.ALL_STORES */
        [ C(RESULT_MISS)   ] = 0x0,

...
 [ C(LL  ) ] = {
    [ C(OP_READ) ] = {
        [ C(RESULT_ACCESS) ] = 0x1b7,   /* OFFCORE_RESPONSE */
        [ C(RESULT_MISS)   ] = 0x1b7,   /* OFFCORE_RESPONSE */
    },
    [ C(OP_WRITE) ] = {
        [ C(RESULT_ACCESS) ] = 0x1b7,   /* OFFCORE_RESPONSE */
        [ C(RESULT_MISS)   ] = 0x1b7,   /* OFFCORE_RESPONSE */
    },

以及为诸如 OFFCORE_RESPONSE 之类的事件定义额外标志/掩码的额外结构:

static __initconst const u64 skl_hw_cache_extra_regs 
 [ C(LL  ) ] = {
    [ C(OP_READ) ] = {
        [ C(RESULT_ACCESS) ] = SKL_DEMAND_READ|
                       SKL_LLC_ACCESS|SKL_ANY_SNOOP,
        [ C(RESULT_MISS)   ] = SKL_DEMAND_READ|
                       SKL_L3_MISS|SKL_ANY_SNOOP|
                       SKL_SUPPLIER_NONE,
    },
    [ C(OP_WRITE) ] = {
        [ C(RESULT_ACCESS) ] = SKL_DEMAND_WRITE|
                       SKL_LLC_ACCESS|SKL_ANY_SNOOP,
        [ C(RESULT_MISS)   ] = SKL_DEMAND_WRITE|
                       SKL_L3_MISS|SKL_ANY_SNOOP|
                       SKL_SUPPLIER_NONE,
 [ C(NODE) ] = {
    [ C(OP_READ) ] = {
        [ C(RESULT_ACCESS) ] = SKL_DEMAND_READ|
                       SKL_L3_MISS_LOCAL_DRAM|SKL_SNOOP_DRAM,
        [ C(RESULT_MISS)   ] = SKL_DEMAND_READ|
                       SKL_L3_MISS_REMOTE|SKL_SNOOP_DRAM,
    },
    [ C(OP_WRITE) ] = {
        [ C(RESULT_ACCESS) ] = SKL_DEMAND_WRITE|
                       SKL_L3_MISS_LOCAL_DRAM|SKL_SNOOP_DRAM,
        [ C(RESULT_MISS)   ] = SKL_DEMAND_WRITE|
                       SKL_L3_MISS_REMOTE|SKL_SNOOP_DRAM,

【讨论】:

    猜你喜欢
    • 2013-09-04
    • 2018-02-20
    • 1970-01-01
    • 1970-01-01
    • 2023-03-16
    • 1970-01-01
    • 2019-08-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多