我正在使用Linux Ubuntu,并使用C ++编程。我已经能够使用perf_event访问性能计数器(指令计数,缓存未命中等)(实际上使用来自此链接的程序:https://github.com/castl/easyperf)。
但是,现在我正在使用pthreads运行多线程应用程序,需要指令计数和循环来分别完成每个线程。关于如何解决这个问题的任何想法?
谢谢!
答案 0 :(得分:3)
perf是您可以使用的系统分析工具。它不像https://github.com/castl/easyperf),它是一个库,你可以在你的代码中使用它。按照步骤使用它来分析您的程序:
在Ubuntu上安装perf
。在不同的Linux发行版中,安装可能会大不相同。您可以找到安装教程。
只需运行您的程序并获取程序的所有线程ID:
ps -eLf | grep [application name]
根据手册页打开单独的终端并以perf stat -t [threadid]
运行perf:
usage: perf stat [<options>] [<command>]
-e, --event <event> event selector. use 'perf list' to list available events
-i, --no-inherit child tasks do not inherit counters
-p, --pid <n> stat events on existing process id
-t, --tid <n> stat events on existing thread id
-a, --all-cpus system-wide collection from all CPUs
-c, --scale scale/normalize counters
-v, --verbose be more verbose (show counter open errors, etc)
-r, --repeat <n> repeat command and print average + stddev (max: 100)
-n, --null null run - dont start any counters
-B, --big-num print large numbers with thousands' separators
有一个关于perf
的{{3}},您可以对它有所了解。
答案 1 :(得分:1)
请查看perf
工具文档here,它支持您要查看的一些事件(例如:instructions
和cache-misses
)轮廓。从上面链接的Wiki页面中提取:
perf工具可用于计算每线程,每进程,每个CPU或系统范围内的事件。在每线程模式下,计数器仅监视指定线程的执行。线程计划完毕后,监视将停止。当一个线程从一个处理器迁移到另一个处理器时,计数器将保存在当前处理器上并在新处理器上恢复。
答案 2 :(得分:1)
您可以使用标准工具访问perf_event
- perf
(来自linux-tools)。它可以与程序的所有线程一起使用,并报告摘要配置文件和每个线程(每个pid / per-tid)配置文件。
此配置文件不是精确的硬件计数器,而是每N个事件采样的结果,N调整到大约99 Hz(每秒时间)。您还可以尝试使用-c 2000000
选项来获取每两百万次硬件事件的样本。例如,周期事件(完整列表 - perf list
或尝试perf stat ./program
中列出的一些)
perf record -e cycles -F 99 ./program
perf record -e cycles -c 2000000 ./program
所有主题的摘要。 -n
将显示样本总数
perf report -n
每个pid(实际上这里使用了tid,所以它允许你选择任何线程)。
文本变体将列出使用摘要样本计数记录的所有线程(使用-c 2000000
,您可以将样本计数乘以200万来估计线程的hw事件计数)
perf report -n -s pid | cat
或类似ncurses的交互式变体,您可以在其中选择任何线程并查看其自己的配置文件:
perf report -n -s pid