我想知道哪些事件可以在我的cpu(桑迪桥)上有精确的修饰符。
英特尔软件开发人员手册(表18-32。英特尔微体系结构代码名称Sandy Bridge的PEBS性能事件)仅包含以下事件: INST_RETIRED , UOPS_RETIRED , BR_INST_RETIRED , BR_MISP_RETIRED , MEM_UOPS_RETIRED , MEM_LOAD_UOPS_RETIRED , MEM_LOAD_UOPS_LLC_HIT_RETIRED 。 SandyBridge_core_V15.json列出了PEBS> 0的相同事件。
不过有一些使用perf 例子 ,在cycles事件中增加:p 。 我可以在我的机器上成功运行perf record -e cycles:p 。
也perf record -e cycles:p -vv -- sleep 1打印precise_ip 1 。 那么这是否意味着cpu_CLK_UNHALTED事件实际上使用了PEBS?
为什么这个延迟循环在几次迭代之后开始运行得更快而没有睡眠?
为什么malloc依赖于从某个阈值开始的mmap?
通过Cygwin运行一个Windows .EXE固有的比通过BAT更慢?
诊断一个集群软件的病理行为
是否有可能获得完整的事件列表,支持:p ?
使用Linux usb批量传输内核驱动程序和硬件环回性能非常差(〜0.4MB / s)
Windows上的程序的cpu使用率测量
在NTFS上打开许多小文件太慢了
提高wp-admin面板性能的build议
Nginx + PHP-fpm假设比Apache + mod-PHP快得多
在SandyBridge上有支持cycles:p没有cpu_CLK_UNHALTED.* PEBS。 该入侵在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 hack在3557 __init int intel_pmu_init(void)注册case INTEL_FAM6_SANDYBRIDGE: case INTEL_FAM6_SANDYBRIDGE_X: as
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;
当precise_ip设置为非零时,将从intel_pmu_hw_config()调用intel_pmu_hw_config() :
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年,hack执行了lkml线程“[PATCH] perf,x86:使周期:p工作在SNB上”,“[tip:perf / core] perf / x86:为SNB / IVB实现周期:p”,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 for precise_ip , INST_RETIRED.PREC_disT (0x01c0)最高值,而不是cycles:ppp在SKL,IVB,HSW,BDW上的cycles:ppp
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。