问题标签 [oprofile]
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.
linux - Oprofile - 使用 operf 在 opreport 中显示 INST_RETIRED 和 l1d_replacement 事件
主机:Ubuntu 14.04 Opef 版本:0.9.9
我想在 opreport 中显示两个事件,以便输入以下命令来运行 operf:
几秒钟后,终端显示“Profiling done”
然后我输入:
我没有指定路径,因为手册页表明数据自动保存在“oprofile_data”中。
但是,输出没有显示“l1d_replacement”和“INST_RETIRED”事件。
我相信我在这里错过了一些东西,以使这两个事件出现在 opreport 上。
任何想法 ?谢谢
linux - oprofile 二进制构建错误 - (未找到自由库)
在我的主机(Ubuntu 15.04)上下载 oprofile 源代码后,由于某些原因,我需要自己构建二进制文件。
我输入以下命令来构建二进制文件
并收到错误消息
通过搜索此错误的修复程序,我发现需要安装一个包。
但是,即使软件包已成功安装,仍然会出现相同的错误。
有什么我可以检查的吗?
谢谢
optimization - 什么是良好的缓存命中/未命中率?
我在我们的程序上运行 ocount 来计算 L2 缓存读取事件,我们得到以下结果:
但是,我们不知道这些结果是否应该被视为完全缓存垃圾。
您认为 L2 缓存的良好命中率/未命中率是多少?
我希望它在很大程度上取决于 CPU 架构和应用程序要求,但它有一般可接受的值吗?
parallel-processing - 使用 OpenMP 的 OProfile
我通过执行以下操作将 OProfile 用于 OpenMP 并行化代码,
我如何知道事件是按 CPU 计算还是作为一个整体计算?如果我在没有 OpenMP 的情况下编译,我很确定它作为一个整体,因为它们接近数字,但我想确定。
powerpc - Power8 上的 PM_DATA_ALL* 和 PM_DATA* 事件有什么区别?
在使用 Power8 处理器评估内存性能时,我遇到perf
了理解事件PM_DATA_ALL_*
和PM_DATA_*
. 大多数计数器在两个版本中都存在,但oprofile 文档中的描述和 inpapi_native_avail
相同,例如:
PM_DATA_FROM_LMEM
如果 MMCR1[16] 为 1,则处理器的数据高速缓存从本地芯片的内存中重新加载,因为只有按需加载或按需加载加上预取。
我虽然会通过测量一些数据来找出差异。如果我提供足够大的任务,我可以观察到*_ALL
版本具有更高值的预期差异。我理解使用perf
.
那么这些事件的全部内容到底是什么?
performance - oprofile - 使用 ocount / operf - LLC 未命中问题 100%
主机:ubuntu 15.04
oprofile 版本:1.1.0
CPU:英特尔至强 D-1520
1.
结果是:
和相同LLC_MISSES
,LLC_REFS
表示缓存丢失率为 100%。为什么会这样?对我来说它看起来不正确。
我operf
用来做测试:
L1D
是比较公平的。但是,LLC ( Last Level Cache )
缓存未命中率与ocount
100% 相同。
我还没有找到根本原因,如果您知道原因或如何解决此问题,请分享您的经验。
谢谢
linux-kernel - 系统分析 - 共享库的使用信息
有没有办法知道在一段时间内哪个进程(或多少个进程)正在使用哪些库文件。
可以为此使用 V-Tune 或 perf 或 OProfile 吗?
c - 优化慢循环
代码看起来像这样,内部循环需要大量时间:
oprofile 告诉我大部分运行时间都花在这里(第二列是时间百分比):
我的第一个问题是:我是否可以依靠 oprofile 来指示代码运行缓慢的正确位置(我在 -Og 和 -Ofast 中尝试过,它基本相同)。
我的第二个问题是:为什么这个非常简单的循环比 sqrt、atan2 和之前的数百行计算慢?我知道我没有显示所有代码,但是有很多代码,对我来说没有意义。
我尝试了各种优化器技巧来矢量化(不起作用)或展开(起作用)但收效甚微,例如:
我检查了优化器的输出:“-Ofast -g -march=native -fopt-info-all=missed.info -funroll-loops”,在这种情况下,我得到“循环展开 9 次”,但如果我尝试矢量化,我得到(简而言之):“无法强制对齐参考”,“矢量对齐可能无法到达”,“矢量化未对齐的访问”,“访问的未知对齐:*(prephitmp_3784 +((sizetype ) _1328 + (long unsigned int) (n_bol_1173 * 500) * 2) * 4)"
有什么办法可以加快速度吗?
附录:谢谢大家的意见,我会在这里回答:
- 是的,我知道代码很丑(不是我的),而且你还没有看到真正的原始代码(这是一个巨大的简化)
- 我坚持使用这个数组,因为 C 代码位于库中,而大型数组一旦被 C 处理和修改,就会传递给调用者(IDL、Python 或 C)。
- 我知道使用一些结构而不是将 char* 转换为复杂的多维 double* 会更好,但请参见上文。当第一次编写这个程序时,结构可能不是 C 规范的一部分(开个玩笑......也许)
- 我知道对于矢量化器来说,数组结构比结构数组更好,但是,叹息......见上文。
- 有一个实际的外循环(在调用程序中),所以这个整体数组的总大小约为 2Gb
- 照原样,在没有优化的情况下运行大约需要 15 分钟,并且在我重写了一些代码(更快的 atan2,数组内的一些手动对齐......)之后一分钟,我使用了 -Ofast 和 -march=native
- 由于硬件的限制变化,我试图更快地跟上数据流。
- 我尝试使用 Clang 并且收益很小(几秒钟),但我没有看到获得优化报告的选项,例如 -fopt-info。我是否必须将程序集视为了解发生了什么的唯一选择?
- 该系统是一个拥有 500Gb RAM 的 64 核,但我无法插入任何 OpenMP pragma 来并行化上述代码(我已经尝试过):它读取一个文件,将其完全解压缩到内存中(2Gb) ,按顺序分析它(诸如'+='之类的东西)并将一些结果吐出给调用IDL/Python。全部在一个内核上(但其他内核非常忙于实际采集和后期处理)。:(
- 没用,感谢您的出色建议:删除 ddQ += ... 似乎将时间百分比转移到上一行:376280 39.4835:ddI+=...
- 这让我们变得更好:删除两者(因此整个循环)保存......什么都没有!所以我想正如彼得所说,我不能相信探查器。如果我分析无环编,我会得到更均匀的时间分布(以前只有 1 秒以上的 3 行,现在大约 10 行,所有这些都像简单的变量分配一样荒谬)。
我猜这个内部循环从一开始就是一个红鲱鱼。我将使用手动计时重新开始优化。谢谢。
linux-kernel - vmlinux中没有符号
我需要oprofile
显示有关内核内部发生的事情的详细信息,而不是将其标记为/no-vmlinux
.
为了能够提供oprofile
内核符号,我使用了从压缩版本extract_vmlinux
中/usr/src/linux-headers-3.9.7/scripts
获取的脚本。vmlinux
vmlinuz
operf
然后我用选项打电话--vmlinux path_to_vmlinux
。但是,operf
显示以下错误消息:
无法获取 vmlinux 结束地址 指定的 vmlinux 文件 (/tmp/vmlinux) 似乎无效。确保您使用的是非压缩映像文件(例如 vmlinux 不是 vmlinuz)
通过在代码中跟踪此错误消息operf
,我发现它最有可能发生在调用之后objdump -t
(选项 -t 是“打印文件的符号表条目。”根据 objdump 的手册页)当我运行时:“ objdump -t vmlinux
",我得到以下输出:
请你帮助我好吗?
linux - 我可以在使用 oProfile 时指定一个 CPU 内核吗?
我需要使用 oProfile 在 8 核服务器上进行性能计数器分析,oProfile 是否只能记录 7 核上的事件?谢谢!