pgp*_*628 5 linux performance benchmarking performancecounter perf
大家都知道,perf是为了得到一个程序的CPU性能计数器的工具,如cache-miss,cache-reference,instruction executed等。
问题:
如何在c或c++.
例如,我的程序首先进行一些初始化,然后进行工作,然后完成,我只想获得工作的性能计数器,例如 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)
最后,我找到了一个库来获取一段代码的计数器。
例如,如果您想测量某段代码的 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)
听起来您正在寻找分析。
正如你所说,你在 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)