如何获取一段代码的CPU性能计数器

pgp*_*628 5 linux performance benchmarking performancecounter perf

大家都知道,perf是为了得到一个程序的CPU性能计数器的工具,如cache-misscache-referenceinstruction executed等。

问题: 如何在cc++.
例如,我的程序首先进行一些初始化,然后进行工作,然后完成,我只想获得工作的性能计数器,例如 function do_something_1

int main(int argc, char ** argv) {
    do_initialize();
    for (int i = 0;i < 100 ;i ++) {
        /* begin profile code */
        do_something_1();
        /* end profile code */
        do_something_2();
    } 
    do_finalize();
}
Run Code Online (Sandbox Code Playgroud)

pgp*_*628 6

最后,我找到了一个库来获取一段代码的计数器。

帕皮伊

例如,如果您想测量某段代码的 L3 数据缓存读取。

#include "papi.h"
#include <iostream>
#include <glog/logging.h>

#define ASIZE 2684354560

#define event_count (1) // the number of event you want to trace

int main(int argc, char ** argv) {

  int events[event_count] = {PAPI_L3_DCR}; // L3 Data Cache Read
  int ret;
  long long int values[event_count]; // result  

  int* array = new int [ASIZE ];

  /* start counters */
  ret = PAPI_start_counters(events, event_count);
  CHECK_EQ(ret, PAPI_OK);

  size_t tot_cnt = 1;
  for(size_t cnt = 0; cnt < tot_cnt; cnt ++) {
    for(size_t i = 0;i < ASIZE ;i ++) {
      array[i] = i;
    }
  }

  /* read counters */
  ret = PAPI_read_counters(values, event_count);
  CHECK_EQ(ret, PAPI_OK);

  for(size_t i = 0;i < event_count ;i ++) {
    LOG(INFO) << " " << values[i];
  }
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

生成文件:

CXX?=g++
INC?=-I<path to where papi is installed>/include/
LIB?=-L<path to where papi is installed>/lib/ -lpapi -lglog

main : main.cpp
  ${CXX} -O3 ${INC} -o $@ $< ${LIB}

all : main

.PHONY:
clean :
  rm -f main
Run Code Online (Sandbox Code Playgroud)


Kla*_*aus 0

听起来您正在寻找分析。

正如你所说,你在 Linux 下,所以看看 gprof 工具链。只需使用一些编译器选项编译您的程序并启动您的程序即可。gprof 之后检查生成的分析数据并提供包含每个代码块信息的结果。

首先:使用附加选项编译您的程序:

g++ <source> -c -g -pg
...
Run Code Online (Sandbox Code Playgroud)

第二:链接,你还需要这些选项!

g++ <object1> <object2> ... <objectn> -g -pg -o <target>
Run Code Online (Sandbox Code Playgroud)

第三:运行你的程序

./<target>
Run Code Online (Sandbox Code Playgroud)

之后,获取统计数据:

gprof <target>
Run Code Online (Sandbox Code Playgroud)