关于perf report -g输出中展开子项首列含义的技术问询
关于
perf report -g输出的两个核心问题解答 一、父项与子项同符号(omp_in_final)的百分比差异
原始输出片段:
Children Self Command Shared Object Symbol - 87.46% 3.94% my_cmd libgomp.so.1.0.0 [.] omp_in_final + 83.53% omp_in_final + 2.81% clone + 1.12% _start
- 父行的
87.46%是omp_in_final的Children占比:包含采样点落在omp_in_final自身(即Self的3.94%)以及它调用的所有后代函数中的总采样占比。 - 子项的
83.53% omp_in_final是调用者视角下的递归调用占比:这部分采样来自于omp_in_final被另一个omp_in_final递归调用的场景——也就是当调用栈中存在「上层omp_in_final → 当前omp_in_final」的链路时,这些链路对应的总采样占比。 - 两者的差值
87.46% - 83.53% ≈ 3.93%,和Self的3.94%几乎一致(浮点计算误差),这部分就是没有进入递归、直接在omp_in_final自身指令上结束的采样。
二、调用者模式下展开项的含义
在调用者模式(perf report -g caller)下,每一行的子项代表的是调用当前行函数的上层函数,而非当前函数调用的下游函数:
- 原始输出里的
+83.53% omp_in_final:表示有83.53%的采样中,当前的omp_in_final是被另一个omp_in_final调用的; +2.81% clone:表示有2.81%的采样中,omp_in_final是被clone调用的;+1.12% _start同理。
而你展开omp_in_final子项后看到的omp_get_num_procs等函数,是上层omp_in_final所调用的下游函数——这些函数的采样被计入了父行omp_in_final的Children占比中,展开后是在展示递归调用链里上层函数的被调用者详情。
展开后的输出片段:
- 87.46% 3.94% my_cmd libgomp.so.1.0.0 [.] omp_in_final - 83.53% omp_in_final 38.80% omp_get_num_procs + 21.33% do_manual_omp_version._omp_fn.0 + 3.61% do_bestcase_omp_version._omp_fn.0 + 3.39% do_omp_barrier_only._omp_fn.0
内容的提问来源于stack exchange,提问作者plafratt
相关产品推荐
相关产品推荐

