簡體   English   中英

哪些perf事件可以使用PEBS?

[英]Which perf events can use PEBS?

我想了解哪些事件可以在我的CPU(Sandy Bridge)上具有精確修改器。

英特爾軟件開發人員手冊(表18-32.英特爾微體系結構代碼名稱Sandy Bridge的PEBS性能事件)僅包含以下事件: INST_RETIREDUOPS_RETIREDBR_INST_RETIREDBR_MISP_RETIREDMEM_UOPS_RETIREDMEM_LOAD_UOPS_RETIREDMEM_LOAD_UOPS_LLC_HIT_RETIRED SandyBridge_core_V15.json列出了與PEBS> 0相同的事件。

但是有一些使用perf 例子 ,它們將:p添加到cycles事件中。 我可以在我的機器上成功運行perf record -e cycles:p

perf record -e cycles:p -vv -- sleep 1打印precise_ip 1 那么它是否意味着CPU_CLK_UNHALTED事件實際上使用了PEBS?

是否有可能獲得支持的完整事件列表:p

有支持cycles:p黑客攻擊cycles:p在SandyBridge上沒有PEBS的CPU_CLK_UNHALTED.* hack在intel_pebs_aliases_snb()perf的內核部分實現。 當用戶使用非零precise修改器請求-e cycles PERF_COUNT_HW_CPU_CYCLES (轉換為CPU_CLK_UNHALTED.CORE )時,此函數將使用PEBS將硬件事件更改為UOPS_RETIRED.ALL

  29    [PERF_COUNT_HW_CPU_CYCLES]      = 0x003c,

2739 static void intel_pebs_aliases_snb(struct perf_event *event)
2740 {
2741    if ((event->hw.config & X86_RAW_EVENT_MASK) == 0x003c) {
2742        /*
2743         * Use an alternative encoding for CPU_CLK_UNHALTED.THREAD_P
2744         * (0x003c) so that we can use it with PEBS.
2745         *
2746         * The regular CPU_CLK_UNHALTED.THREAD_P event (0x003c) isn't
2747         * PEBS capable. However we can use UOPS_RETIRED.ALL
2748         * (0x01c2), which is a PEBS capable event, to get the same
2749         * count.
2750         *
2751         * UOPS_RETIRED.ALL counts the number of cycles that retires
2752         * CNTMASK micro-ops. By setting CNTMASK to a value (16)
2753         * larger than the maximum number of micro-ops that can be
2754         * retired per cycle (4) and then inverting the condition, we
2755         * count all cycles that retire 16 or less micro-ops, which
2756         * is every cycle.
2757         *
2758         * Thereby we gain a PEBS capable cycle counter.
2759         */
2760        u64 alt_config = X86_CONFIG(.event=0xc2, .umask=0x01, .inv=1, .cmask=16);
2761 
2762        alt_config |= (event->hw.config & ~X86_RAW_EVENT_MASK);
2763        event->hw.config = alt_config;
2764    }
2765 }

所述intel_pebs_aliases_snb劈被登記在3557 __init int intel_pmu_init(void)case INTEL_FAM6_SANDYBRIDGE: / case INTEL_FAM6_SANDYBRIDGE_X:

3772        x86_pmu.event_constraints = intel_snb_event_constraints;
3773        x86_pmu.pebs_constraints = intel_snb_pebs_event_constraints;
3774        x86_pmu.pebs_aliases = intel_pebs_aliases_snb;

pebs_aliases從稱為intel_pmu_hw_config()precise_ip被設置為非零:

2814 static int intel_pmu_hw_config(struct perf_event *event)
2815 {

2821    if (event->attr.precise_ip) {

2828        if (x86_pmu.pebs_aliases)
2829            x86_pmu.pebs_aliases(event);
2830    }

黑客攻擊是在2012年實施的,lkml線程“[PATCH] perf,x86:使周期:p工作於SNB”,“[tip:perf / core] perf / x86:實現周期:p表示SNB / IVB”,cccb9ba9e4ee0d750265f53de9258df69655c40b, http://git.kernel.org/cgit/linux/kernel/git/tip/tip.git/commit/?id=cccb9ba9e4ee0d750265f53de9258df69655c40b

perf / x86:實現周期:p表示SNB / IVB

現在最終有一個帶有工作PEBS(IvyBridge)的芯片,我們可以啟用硬件並實現周期:p用於SNB / IVB。

而且我認為除了arch/x86/events/intel/core.c的linux源代碼之外,還沒有完整的“精確”轉換黑客列表,grep for static void intel_pebs_aliases (通常是cycles:p / CPU_CLK_UNHALTED 0x003c已實現)並檢查intel_pmu_init的實際模型和選擇的確切x86_pmu.pebs_aliases變體:

  • intel_pebs_aliases_core2, INST_RETIRED.ANY_P (0x00c0) CNTMASK=16而不是cycles:p
  • intel_pebs_aliases_snb, UOPS_RETIRED.ALL (0x01c2) CNTMASK=16而不是cycles:p
  • intel_pebs_aliases_precdist表示最高的precise_ipINST_RETIRED.PREC_DIST (0x01c0)而不是cycles:ppp SKL,IVB,HSW,BDW上的cycles:ppp

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM