- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我想了解哪些事件可以对我的 precise 修饰符CPU(沙桥)。
英特尔软件开发人员手册(表 18-32。PEBS 性能英特尔微体系结构代号 Sandy Bridge 的事件)包含仅以下事件: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 的相同事件。
但是有some examples使用 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
在没有 PEBS 的 SandyBridge 上 CPU_CLK_UNHALTED.*
.该 hack 是在 perf
的内核部分实现的在 intel_pebs_aliases_snb()
.当用户请求 -e cycles
这是 PERF_COUNT_HW_CPU_CYCLES
(转换为 CPU_CLK_UNHALTED.CORE
)非零 precise
修饰符,此函数会将硬件事件更改为 UOPS_RETIRED.ALL
与 PEBS:
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:
作为
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: Make cycles:p working on SNB”, “[tip:perf/core] perf/x86: Implement cycles:p for SNB/IVB” , cccb9ba9e4ee0d750265f53de9258df69655c40b, http://git.kernel.org/cgit/linux/kernel/git/tip/tip.git/commit/?id=cccb9ba9e4ee0d750265f53de9258df69655c40b :
perf/x86: Implement cycles:p for SNB/IVB
Now that there's finally a chip with working PEBS (IvyBridge), we can enable the hardware and implement cycles:p for SNB/IVB.
而且我认为,除了 arch/x86/events/intel/core.c
中的 linux 源代码之外,没有此类“精确”转换 hack 的完整列表。 , grep static void intel_pebs_aliases
(通常执行 cycles:p
/CPU_CLK_UNHALTED 0x003c
)并检查 intel_pmu_init
对于实际模型和精确 x86_pmu.pebs_aliases
选择的变体:
INST_RETIRED.ANY_P (0x00c0) CNTMASK=16
而不是 cycles:p
UOPS_RETIRED.ALL (0x01c2) CNTMASK=16
而不是 cycles:p
precise_ip
, INST_RETIRED.PREC_DIST (0x01c0)
而不是 cycles:ppp
在 SKL、IVB、HSW、BDW 上关于linux - 哪些性能事件可以使用 PEBS?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42166846/
PEB存储了windows中一个进程的信息。当进程结束时它是否仍然存储它? 最佳答案 它是一个进程内数据结构。不再有进程 == 不再有 PEB。 CreateProcess 返回的进程句柄引用了一个内
我想了解哪些事件可以对我的 precise 修饰符CPU(沙桥)。 英特尔软件开发人员手册(表 18-32。PEBS 性能英特尔微体系结构代号 Sandy Bridge 的事件)包含仅以下事件:INS
我想从“notepad.exe”进程获取PEB。有人知道怎么做吗? 我尝试了 GetModuleHandle API,但它没有返回有效的指针(每次都返回零),因为我必须是该模块的调用者进程。 因此,我
64 位 Windows 似乎使用 rcx = r8 = &PEB 调用 exe 的入口点和 rdx = r9 = &entrypoint好像入口点被声明 entrypoint(PEB *peb, v
PEBS 是 Intel CPU 为采样性能监视器提供的采样机制。 是否可以使用 PEBS 来测量过程的 IPC? PEBS 如何确定采样时间? 最佳答案 看我对Do Core i3/5/7 CPUs
这个标志的目的是什么(从操作系统端)?除 isDebuggerPresent 外,哪些函数使用此标志? 非常感谢 最佳答案 实际上是一样的,但读取 PEB 不需要通过内核模式。 更明确地说,IsDeb
规范:Windows 7 x64,Visual C++ 目标:我正在尝试获取 Remote PEB来自示例程序(例如 calc.exe)。我找到了 proc ID,并打开了一个具有所有良好权限的进程句
我现在正尝试使用 perf 通过 PEBS 测量 L3_Miss(LLC Miss)。 命令如下:perf record -d -e cpu/event=0xd1,umask=0x20/ppu -c
您好,我正在尝试使用 WinDbg 查看 memory.dmp 内核转储文件,以诊断崩溃。当我打开崩溃文件并获取符号时,我收到消息 BugCheck A, {2, ff, 4e, fffff801a4
我试图获得我自己的 PEB 并获得我自己的模块地址。我写了这样一个简单的代码: PLIST_ENTRY myModule = (PLIST_ENTRY)pebLdr->InMemoryOrderMod
我正在使用 ctypes 并尝试使用 NtQueryInformationProcess 函数获取 PEB 地址。 返回值为0,表示函数成功完成。但 PROCESS_BASIC_INFORMATION
我正在尝试通过使用硬件性能计数器来生成 D-TLB 未命中的地址跟踪。 Intel 处理器具有“基于事件的精确采样”(PEBS),可以在每次采样时转储硬件寄存器内容。我需要使用这个寄存器转储来创建导致
我正在尝试获取我的应用程序中已加载模块的列表(与安全/shellcode 有关,因此请避免调用 WINAPI)。我正在遍历 PEB->Ldr 模块双向链表,但每次打印 DLL 的名称时,它只是打印当前
我已经阅读了大量有关此事的 SO 问题,但我没有找到以正确方式执行此操作的真正权威指南。 我的目标是枚举 [断开连接和事件] 用户控制台 session 并在每个 session 中启动一个进程。每个
我有一个 64 位进程需要读取 Wow64 进程的 32 位 PEB。 我可以通过 NtQueryInformationProcess 获取它,但我意识到 Wow64 进程有两个 PEB(64 位和
我一直在尝试使用 linux perf 工具来对程序中的内存访问进行采样。具体来说,我使用 perf mem 命令检测程序中的负载: perf mem -t load rec myprogram pe
到现在为止,我有这段代码(我知道它很丑,但这不是现在的重点) 我不知道如何发布以下系统并构建正确的结构来访问另一个进程的 PEB。 我想做以下事情: HANDLE pHandle = OpenProc
我正在使用 perf userland 工具进行基于事件的采样:目标是试图找出某些影响性能的事件(如分支未命中和缓存未命中)在我正在处理的更大系统上发生的位置。 现在,像 perf record -a
我正在尝试使用汇编程序获取当前进程的 PEB 地址。 cpp文件: #include //#include extern "C" int* __ptr64 Get_Ldr_Addr(); int
是否可以直接从 Linux 用户空间进程而不是使用内核接口(interface)使用 Haswell CPU 功能 PEBS(基于精确事件的采样)? 我已成功使用 RDPMC 指令从用户空间访问性能计
我是一名优秀的程序员,十分优秀!