问题标签 [papi]
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.
multithreading - PAPI_INHERIT_ALL 和 RAPL 事件可以一起工作吗?
我正在使用 PAPI 收集 skylake 处理器的性能和能量信息。目标应用程序是多线程的,我想汇总所有正在运行的线程的统计信息。如果我只跟踪非 RAPL 事件,这很好用,但如果我尝试跟踪 RAPL 和 CPU 计数器,CPU 计数器不会聚合(即它们只对应一个线程。
一切似乎都在正常工作。我检查了 PAPI 调用的所有错误代码,一切都是PAPI_OK
.
我适用PAPI_INHERIT_ALL
于组件 0 (CPU) 的事件集。对 RAPL 组件执行相同操作会失败,所以我不这样做。
下面的输出是我的测试程序的两次运行。唯一的区别是第二次运行包括rapl:::PACKAGE_ENERGY:PACKAGE0
. 如果没有 RAPL 事件,周期和指令计数会随着线程计数而变化。有了它,他们就不会(但能量计数器显示包裹能量一直在缩放)。
我在 papi-5.7.0 下运行。
uname -a
:
没有 RAPL 事件
与 RAPL 一起举办活动
c - 更改函数的不相关部分会更改分支预测的 papi 测量
我正在使用我在网上找到的代码,我想尝试不同的分支预测代码以更好地理解分支预测器。
CPU是AMD锐龙3600。
基本上,我正在做的是在下面的代码中,我试图测量给定函数/代码段的误预测率。作为伪/缩短的代码,这就是我所做的:
我的设置
- 我已经隔离了我正在处理的核心,因此该核心中没有其他用户进程。我还隔离了同级内核,以便我完全负责两个内核,除非有中断或例程。
- 以前,我已经看到,如果我
sleep
在迭代之间使用(如在 main 函数中),CPU 会进入更深层次的 C 状态,因此分支预测单元(在本例中为 BHT)会重置。这是2nd important line
代码中的解释。
我想看的
如果没有这sleep
条线,我会看到在每次迭代中我的误预测率越来越低。那是因为分支预测器正在学习数组中的模式。
有了这sleep
条线,我想要实现的是,在每次迭代中,我应该看到类似的错误预测数字,因为 BPU 条目正在被重置。
问题是什么
问题是当我从
至
然后测量就搞砸了。我在上一个问题中遇到过这种问题,但从未得到回答。更改与测量无关的行会改变测量行为。
这是我的结果:
在 the 之后放置mfence
orlfence
指令warmup
也不会改变结果。
下面,我将整个代码放入以防有人想尝试和/或对此行为有答案。
编译
gcc -O0 main.c -lpthread -lpapi -o exp
kernel - papi_avail 显示事件,无法在 C 中访问
我正在尝试在 Odroid-XU4 上运行 PAPI,我已经安装了 PAPI,当我运行时,papi_avail -a
我可以看到 16 个可用事件。
我设置perf_event_paranoid
为-1。
当我尝试使用 C 调用 PAPI 时,它总是说:
活动不存在
即使我知道硬件有 16 个事件。
当我运行 PAPI 的测试时,我看到了这个错误:
有谁知道这个错误是什么意思以及如何修复它以使 PAPI 正常工作?
编辑
我已经包含了的输出,papi_component_avail
以防papi_avail -a
万一。
papi_component_avail
papi_avail -a
尝试安装 perf 时的输出
c - 使用 rdmsr/rdpmc 进行分支预测精度
我试图了解分支预测单元如何在 CPU 中工作。
我也使用过papi
linux perf-events
,但它们都没有给出准确的结果(就我而言)。
这是我的代码:
我的数组由 0 和 1 组成。它有一个大小为sequence_len
. 例如,如果我的尺码是 8 号,那么它就有类似的图案0 1 0 1 0 0 1 1
。
试验一:
我试图了解 CPU 如何预测这些分支。因此,我使用 papi 并为错误预测的分支预测设置了性能计数器(我知道它也计算间接分支)。
我看到的输出是(对于200的序列长度)
所以,一开始,CPU 盲目地预测序列,只成功了一半。在接下来的迭代中,CPU 可以预测得越来越好。经过一些迭代后,CPU 可以完美地猜到。
试验 2
我想看看,CPU 错误预测在哪个数组索引处。
预期结果:
收到的结果:
我的观察
当我在 for 循环之外测量错误预测时,我可以看到 CPU 从错误预测中学习。但是,当我尝试测量单个分支指令的错误预测时,CPU 要么无法学习,要么我测量错误。
我的解释
我给出 200 作为序列长度。CPU 有一个小的分支预测器,如 Intel 中的 2-3 位饱和计数器,以及一个大的全局分支预测器。当我在环路外进行测量时,我会在测量中引入更少的噪声。通过减少噪音,我的意思是papi
电话。
想一想:在循环测量之外
全球历史是:papi_start, branch_outcome1, branch_outcome2, branch_outcome3, ..., papi_end, papi_start (2nd loop of main iteration), branch_outcome1, ...
因此,分支预测器以某种方式在同一分支中找到了模式。
但是,如果我尝试测量单个分支指令,那么全局历史是:
papi_start, branchoutcome1, papiend, papistart, branchoutcome2, papiend...
因此,我正在向全球历史介绍越来越多的分支。我假设全局历史不能包含许多分支条目,因此它在所需的 if 语句(分支)中找不到任何相关性/模式。
因此
我需要测量单个分支预测结果。我知道如果我不过多介绍papi,CPU可以学习200模式。我查看了 papi 调用,并且看到了很多 for 循环,如果条件。
这就是为什么我需要更好的测量。我尝试过 linux perf-event
,但它会进行ioctl
调用,这是一个系统调用,我用系统调用污染了全局历史记录,因此不是一个好的衡量标准。
我已经阅读了该指令rdpmc
和rdmsr
指令,并且我假设由于它们只是指令,因此我不会污染全局历史记录,并且我可以一次测量单个分支指令。
但是,我不知道如何做到这一点。我有 AMD 3600 CPU。这些是我在网上找到的链接,但我不知道该怎么做。除此之外,我还缺少什么吗?
c - 使用 PAPI 从 perf_event_uncore 列表中读取硬件计数器
我正在尝试使用 PAPI 读取硬件计数器之一。当我尝试从perf_event
列表中读取事件时,它工作正常。但是现在我需要从perf_event_uncore
列表中读取其中一个计数器,该计数器是用 获得的papi_native_avail
,但我得到一个错误。它在级联湖架构上运行,具有 linux 5.4.0-3-amd64 版本。
即使PAPI_event_name_to_code
返回 PAPI_OK,也会PAPI_add_event
返回 -1,即PAPI_EINVAL
- 无效参数。我尝试了几种计数器形式perf_event_uncore
,但遇到了同样的问题。我是否需要使用不同的功能将其添加到事件集中?还是我做错了什么?
c - 分析C程序一个函数的缓存命中率
我想获得在 Linux 机器上运行的 C/C++ 程序 ( foo ) 的特定功能的缓存命中率。我正在使用 gcc 并且没有编译器优化。使用perf,我可以使用以下命令获得整个程序的命中率。
perf stat -e L1-dcache-loads,L1-dcache-load-misses,L1-dcache-stores,L1-dcache-store-misses ./a.out
但我只对内核foo感兴趣。
有没有办法使用perf或任何其他工具仅获得foo的命中率?
lscpu 命令的输出是:
python - py-papi 的事件不存在,但 papi_avail 的事件可用
我正在关注此处的教程,以获取Performance Application Programming Interface的 python 包装器。
我可以看到papi_avail
我的系统确实有硬件计数器 ( Number Hardware Counters: 11
) 并且我感兴趣的事件 ( PAPI_SP_OPS
) 可用:
现在我运行类似于教程中所示的 python 包装器:
但是我得到了错误pyapi.exceptions.PapiNoEventError: Event does not exist. (PAPI_ENOEVNT)
。但显然事件确实存在,如开头所示papi_avail
有小费吗?
android - perf_event 用于进程中的多个线程
我正在尝试使用perf
. 尽管在下面的代码中确实出现了,即使pid
参数perf_event_open
是0
(这应该导致整个进程的分析?),硬件计数器值仅对应于执行线程(与 perf 计数器在线程中求和)过程)inf_loop
不被计算在内。
我的问题是:如何分析进程中的所有线程与仅执行perf_event_open
如下的线程?perf_event_attr
是否需要设置其他配置以启用进程范围的分析?
linux - Papi_avail 没有可用的事件 - 未知的 libpfm4 相关错误
我刚刚在 AMD Ryzen 5000 系列上全新安装了 Ubuntu 20。我按照安装说明安装了 papi tools 6。安装成功,我验证了安装的版本:
然后,当我验证可用事件时,我没有得到:
所以我按照说明运行了 papi_component_avail:
我尝试应用堆栈溢出问题papi_avail: No events available - 32308175中解释的修复程序,该修复程序过去曾在我的运行 Intel 6700HQ 的 Ubuntu 18 上运行,但在这里没有用。当然,问题描述不同。我不确定如何解决“Unknown libpfm4 related error”错误。
我还尝试使用“apt get install papi tools”安装当前可用的 Papi 版本
安装顺利,但我不断收到相同的错误消息。我错过了什么?
c - PAPI 似乎依附于它的进程
PAPI 似乎只衡量其自身进程的性能,例如
这里 PAPI 测量由some_work()
.
但是,如果我想测量整个 CPU 的周期数,而some_work()
上面被替换为sleep(1)
?
如果我运行一个 CPU hog 进程,它count
只会在很小的程度上改变它,而增加工作会some_work()
产生很大的影响。如何让 PAPI 测量整个 CPU 性能?