问题标签 [intel-pmu]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
debugging - simple-pt 中的 spdecode 响应“错误跟踪流与查询不匹配”英特尔处理器跟踪
我是使用 Intel PT 进行跟踪的新手。我已阅读 Intel PT 手册并开始使用 simple-pt 来了解 Intel PT 的工作原理。
sptcmd
simple-pt 中的命令工作并ptout.N
使用以下命令生成。
当我按如下方式使用 sptdecode 时:
sudo ./sptdecode --sideband ptout.sideband --pt ptout.0
我得到以下回复:
TIME DELTA INSNs OPERATION
50:0:错误跟踪流与查询不匹配
50:同步转发:跟踪流与查询不匹配
我已经尝试使用nopti
simple-pt Git repo 中提到的 boot 参数。
有关可能相关的设置的其他信息:
从 Git repo https://github.com/andikleen/simple-pt编译和构建 simple-pt 。通过从最新的 Git 存储库https://github.com/01org/processor-trace
构建来使用 libipt 。
使用 Ubuntu - 16.04
我不确定我错过了什么。任何帮助或指针表示赞赏。
linux-kernel - perf 如何使用 offcore 事件?
一些内置perf
事件映射到非核心事件。例如,LLC-loads
和LLC-load-misses
被映射到OFFCORE_RESPONSE.
事件。正如这里所讨论的,这可以很容易地确定。但是,这些核心外事件需要将某些值写入某些 MSR 寄存器以实际指定特定事件。perf
似乎正在使用一个名为snb_hw_cache_extra_regs的数组来指定要写入哪些 MSR 寄存器的值。我想知道这个数组是如何使用的。基本上我想知道如何perf
通过查看源代码来确定事件映射到的特定非核心事件。
c++ - 使用 PEBS 和 Linux Perf 计算执行 X 条指令所传递的 CPU 周期数
我想做这样的事情:经过 1 亿条指令后,查询 Linux perf HW CPU 周期并将其记录在文件中。我想使用此代码来表征应用程序/基准程序在程序执行的不同阶段的性能。
我有一个提示,我需要设置在 1 亿条指令通过后溢出的 Intel PEBS 并查询 linux perf counters HW cpu cycles counter。
关于从哪里开始以及是否有人已经这样做的任何指针。我想以低开销的方式做到这一点。我将用 C/C++ 编写代码。
问候...
linux-kernel - 如何从内核读取性能计数器?
我一直在用户空间中使用 Linux perf 工具。我想编写每次执行上下文切换时读取线程性能计数器的代码。
所需的步骤是:
1) 获得一种机制来读取性能计数器寄存器。
2) 在每次上下文切换后从调度程序调用 step(1)。
我被困在第 (1) 步,因为我无法弄清楚要调用哪些函数来读取性能寄存器以及如何在执行此操作时描述事件。我尝试浏览文档以及这个问题如何在内核中使用性能计数器?.
intel - 如何将英特尔 PCM 数据缩小到单个进程?
我正在尝试使用英特尔性能计数器监视器 (PCM) 来了解我的代码中的 L3 缓存未命中和其他一些性能标准。
我不确定如何从我得到的数字中理解并希望得到一些见解。
理想情况下,我希望从以下代码中读取 0 个字节,但是我得到的数字接近 240KB 读取。如果我尝试运行其他进程,240KB 的数字会波动(不会单调上升/下降,它只是有有意义的波动(先上升然后下降))。
这是我得到的输出:
尝试使用 Linux 性能事件...
使用 Linux perf 成功编程核心 PMU
每时钟指令数:0.637448,L3 缓存命中率:0.820139,错过周期:0.075492,读取字节数:263488,L3 占用率:0
有谁知道为什么我读取了 240KB,尽管我实际上没有读取代码中的任何内容?它是否与其他进程共享计算资源并可能从其他进程中捕获统计信息?如果是这种情况,我如何确保捕获的信息与正在运行的代码/进程隔离?
x86 - 为什么只有在存在存储初始化循环时才计算用户模式 L1 存储未命中事件?
概括
考虑以下循环:
whererax
被初始化为大于 L3 缓存大小的缓冲区的地址。每次迭代都会对下一个缓存行执行存储操作。我希望从 L1D 发送到 L2 的 RFO 请求数或多或少等于访问的缓存行数。问题是,这似乎只是当我计算内核模式事件时的情况,即使程序在用户模式下运行,除了我在下面讨论的一种情况。分配缓冲区的方式似乎并不重要(.bss、.data 或来自堆)。
细节
我的实验结果如下表所示。所有实验都是在禁用超线程并启用所有硬件预取器的处理器上进行的。
我测试了以下三种情况:
- 没有初始化循环。也就是说,在上面显示的“主”循环之前不会访问缓冲区。我将这种情况称为
NoInit
. 在这种情况下只有一个循环。 - 首先使用每个高速缓存行的一条加载指令访问缓冲区。一旦所有的行都被触及,主循环就会被执行。我将这种情况称为
LoadInit
. 在这种情况下有两个循环。 - 首先使用每个高速缓存行的一条存储指令访问缓冲区。一旦所有的行都被触及,主循环就会被执行。我将这种情况称为
StoreInit
. 在这种情况下有两个循环。
下表显示了英特尔 CFL 处理器上的结果。这些实验是在 Linux 内核版本 4.4.0 上进行的。
下表显示了英特尔 HSW 处理器上的结果。请注意,HSW 中没有记录事件L2_RQSTS.PF_HIT
、L2_RQSTS.PF_MISS
和。OFFCORE_REQUESTS.ALL_REQUESTS
这些实验是在 Linux 内核版本 4.15 上进行的。
每个表的第一列包含性能监控事件的名称,其计数显示在其他列中。在列标签中,字母U
和K
分别代表用户模式和内核模式事件。对于有两个循环的情况,数字 1 和 2 分别用于指代初始化循环和主循环。例如,LoadInit-1K
表示LoadInit
案例初始化循环的内核模式计数。
表中显示的值由高速缓存行数标准化。它们也采用如下颜色编码。绿色越深,相对于同一表格中的所有其他单元格,该值就越大。但是,CFL 表的最后三行和 HSW 表的最后两行没有进行颜色编码,因为这些行中的某些值太大了。这些行被涂成深灰色,表示它们不像其他行那样用颜色编码。
我希望用户模式L2_RQSTS.ALL_RFO
事件的数量等于访问的高速缓存行的数量(即标准化值 1)。该事件在手册中描述如下:
计算对 L2 缓存的 RFO(读取所有权)请求的总数。L2 RFO 请求包括 L1D 需求 RFO 未命中以及 L1D RFO 预取。
它说这L2_RQSTS.ALL_RFO
不仅可以计算来自 L1D 的需求 RFO 请求,还可以计算 L1D RFO 预取。但是,我观察到事件计数不受两个处理器上是否启用或禁用 L1D 预取器的影响。但是即使 L1D 预取器可能会生成 RFO 预取,事件计数也应该至少与访问的缓存行数一样大。从两张表中可以看出,这仅是StoreInit-2U
. 相同的观察结果适用于表中显示的所有事件。
但是,事件的内核模式计数大约等于预期的用户模式计数。这与例如MEM_INST_RETIRED.ALL_STORES
(或MEM_UOPS_RETIRED.ALL_STORES
在 HSW 上)按预期工作相反。
由于 PMU 计数器寄存器的数量有限,我不得不将所有的实验分成四个部分。特别是,内核模式计数是由与用户模式计数不同的运行产生的。什么被计入同样的东西并不重要。我认为告诉你这一点很重要,因为这解释了为什么某些用户模式计数比相同事件的内核模式计数略大。
以深灰色显示的事件似乎多虑了。第 4 代和第 8 代 Intel 处理器规格手册确实提到了(分别是问题 HSD61 和 111)OFFCORE_REQUESTS_OUTSTANDING.DEMAND_RFO
可能会高估。但这些结果表明,它可能被高估了很多倍,而不仅仅是几个事件。
还有其他有趣的观察结果,但它们与问题无关,即:为什么 RFO 计数不符合预期?
performance - 确定与英特尔存储相关的 L1 填充缓冲区占用率
要确定与load相关的 L1D 填充缓冲区占用率,可以使用L1D_PEND_MISS
事件,特别是L1D_PEND_MISS.PENDING
,记录如下:
计算未完成的 L1D 未命中的持续时间,即需求读取所需的未完成填充缓冲区 (FB) 的每个周期数。FB 要么由需求负载持有,要么由非需求负载持有并至少被需求击中一次。有效的未完成间隔通过以下方式之一定义直到 FB 解除分配:从 FB 分配,如果 FB 是按需求分配的 从需求 Hit FB,如果它是通过硬件或软件预取分配的。注意:在 L1D 中,a需求读取包含可缓存或不可缓存的需求负载,包括由于任何请求类型导致的页面遍历而导致缓存行拆分和读取的负载。
解析本段的第二部分有点困难,但关键方面似乎是该事件仅计算每个周期以某种方式由需求负载所需的占用填充缓冲区的数量。
例如,在没有负载的商店流的场景中,有没有办法确定 L1 填充缓冲区的占用率?
linux-kernel - 从内核读取性能寄存器
我想阅读某些性能计数器。我知道有像 perf 这样的工具,可以在用户空间本身为我做这件事,我希望代码在 Linux 内核中。
我想编写一种机制来监视 Intel(R) Core(TM) i7-3770 CPU 上的性能计数器。除了使用之外,我还使用 Ubuntu 内核 4.19.2。我从easyperf得到了以下方法
这是我阅读说明的代码的一部分。
我想将相同的行放在内核代码中(在上下文切换函数中)并检查正在读取的值。
我的最终目标是找出一种方法来读取进程的性能计数器,每次它从内核(4.19.2)本身切换到另一个时。
为此,我查看了系统调用号 __NR_perf_event_open 的代码。它可以在这里找到 为了使其可用,我将其中的代码复制为一个单独的函数,在同一个文件中将其命名为 perf_event_open() 并导出。
现在的问题是每当我以与上面相同的方式调用 perf_event_open() 时,返回的描述符都是-2。检查错误代码,我发现错误是 ENOENT。在perf_event_open() 手册页中,此错误的原因被定义为错误类型字段。
由于文件描述符与打开它们的进程相关联,如何从内核中使用它们?是否有另一种方法可以将 pmu 配置为在不涉及文件描述符的情况下开始计数?
performance - rdpmc: surprising behavior
I'm trying to understand the rdpmc instruction. As such I have the following asm code:
(The implementation is a translation of rdpmc_instructions().)
I count that this code should execute 2*ebx+3 instructions before hitting the rdpmc
instruction, so I expect (in this case) that I should get a return status of 23.
If I run perf stat -e instruction:u ./a.out
on this binary, perf
tells me that I've executed 30 instructions, which looks about right. But if I execute the binary, I get a return status of 58, or 0, not deterministic.
What have I done wrong here?
x86 - IB读、IB写、OB读、OB写是什么意思。它们作为英特尔® PCM 的输出,同时监控 PCIe 带宽
我正在尝试使用英特尔® 性能计数器监视器 (PCM) 工具测量 NIC 设备的 PCIe 带宽。但是,我无法理解它的输出。
为了测量 PCIe 带宽,我执行了二进制 pcm-iio。此二进制文件有助于测量每个 PCIe 设备的监视器 PCIe 带宽。执行二进制文件后,我得到以下输出。
我想了解IB读,IB写,OB读和OB写的含义。