程序部分的perf stat

时间:2014-10-08 22:40:58

标签: linux perf likwid

是否可以使用perf来收集程序执行的部分硬件计数器统计信息?如果是这样,怎么样?

likwid提供了能够定义命名区域的功能,但如果在只安装了perf的系统上可以实现这一点,那就太棒了。

之前的一些问题已经回复了相关答案,但仍有一些缺点:

  • Using probe我得到了同样的错误,我使用了稍微新的内核(3.13)。这些修补程序是否在较新版本中可用?
  • Using perf_event_open我想保持在命令行上定义事件的灵活性。我还看了一眼perf stat itself的代码,但似乎没有通过调用perf_event_open进行设置。

2 个答案:

答案 0 :(得分:2)

产生一个子进程来运行性能统计。
perf stat附加到父项。
在需要时从父进程中终止子进程。

#include <unistd.h>
#include <stdio.h>
#include <signal.h>

int main()
{

    int pid= getpid();
    int cpid = fork();


    if( cpid == 0)
    {
        // child process .  Run your perf stat
        char buf[50];
        sprintf(buf, "perf stat -p %d   > stat.log 2>&1",pid);
        execl("/bin/sh", "sh", "-c", buf, NULL);

    }
    else
    {
        // set the child the leader of its process group
        setpgid(cpid, 0);

        //////////////////////////////////////////////
        // part of program you wanted to perf stat
        sleep(3);
        ////////////////////////////////////////////////


        ////////////////////////////////////////////////////////////////
        // stop perf stat by killing child process and all its descendants(sh, perf stat etc )
        kill(-cpid, SIGINT);
        ////////////////////////////////////////////////////////////////////


        // rest of the program
        sleep(2);
     }
}

答案 1 :(得分:1)

您可以使用libpfcjevents,它们都是Linux兼容的库,它们允许在rdpmc的userland程序中的任意点上编程和读取性能计数器。

这不会直接帮助您在命令行中指定事件的请求,但是您可以基于ocperf.py代码或libpfm4一起备份某些内容。