现代CPU有很多性能指标 - http://www.intel.com/content/www/us/en/architecture-and-technology/64-ia-32-architectures-software-developer-system-programming-manual-325384.html如何阅读它们? 我对缓存未命中和分支错误预测感兴趣。
答案 0 :(得分:14)
看起来PAPI具有非常干净的API,并且在Ubuntu 11.04上运行良好。 安装后,以下应用程序将执行我想要的操作:
#include <stdio.h>
#include <stdlib.h>
#include <papi.h>
#define NUM_EVENTS 4
void matmul(const double *A, const double *B,
double *C, int m, int n, int p)
{
int i, j, k;
for (i = 0; i < m; ++i)
for (j = 0; j < p; ++j) {
double sum = 0;
for (k = 0; k < n; ++k)
sum += A[i*n + k] * B[k*p + j];
C[i*p + j] = sum;
}
}
int main(int /* argc */, char ** /* argv[] */)
{
const int size = 300;
double a[size][size];
double b[size][size];
double c[size][size];
int event[NUM_EVENTS] = {PAPI_TOT_INS, PAPI_TOT_CYC, PAPI_BR_MSP, PAPI_L1_DCM };
long long values[NUM_EVENTS];
/* Start counting events */
if (PAPI_start_counters(event, NUM_EVENTS) != PAPI_OK) {
fprintf(stderr, "PAPI_start_counters - FAILED\n");
exit(1);
}
matmul((double *)a, (double *)b, (double *)c, size, size, size);
/* Read the counters */
if (PAPI_read_counters(values, NUM_EVENTS) != PAPI_OK) {
fprintf(stderr, "PAPI_read_counters - FAILED\n");
exit(1);
}
printf("Total instructions: %lld\n", values[0]);
printf("Total cycles: %lld\n", values[1]);
printf("Instr per cycle: %2.3f\n", (double)values[0] / (double) values[1]);
printf("Branches mispredicted: %lld\n", values[2]);
printf("L1 Cache misses: %lld\n", values[3]);
/* Stop counting events */
if (PAPI_stop_counters(values, NUM_EVENTS) != PAPI_OK) {
fprintf(stderr, "PAPI_stoped_counters - FAILED\n");
exit(1);
}
return 0;
}
在英特尔Q6600上进行了测试,它最多支持4个性能事件。您的处理器可能支持更多或更少。
答案 1 :(得分:6)
perf怎么样? perf list hw cache
显示33个不同的事件,手册页显示了如何使用原始性能计数器描述符。
答案 2 :(得分:2)
使用RDPMC
insn。
编辑:要添加更多信息,阅读性能计数器并不是一件容易的事情,如果我们要在这里描述它,它会占用页面页面,除了它涉及写入模型特定寄存器,这需要特权指示。我建议使用现成的分析器 - oprofile或Intel VTune,它们建立在性能计数器之上。
答案 3 :(得分:2)
我认为有一个可以使用的库,名为perfmon2,http://perfmon2.sourceforge.net/,文档可以在http://www.hpl.hp.com/research/linux/perfmon/perfmon.php4和http://www.hpl.hp.com/techreports/2004/HPL-2004-200R1.html获得,我最近正在挖掘这个库,我我想出来后会发布示例代码〜