使用PAPI的一些问题

时间:2011-04-01 04:56:42

标签: c specifications papi

您曾经使用过PAPI吗?

因为PAPI支持内核版本> 2.6.32(perf-events),所以我选择它来测试我的代码。

无论我选择哪种事件代码,为什么我只得到相同的数字(结果),例如PAPI_TOT_INS,PAPI_BR_INS等。

#include <stdio.h>
#include "papi.h"
int main(){
int i,j,k;
int a[300][300];
int b[300][300];
int c[300][300];
for(i=0;i<300;i++){
    for(j=0;j<300;j++){
        a[i][j]=1;
        b[i][j]=2;
        c[i][j]=0;
    }
}

int Events[1]={PAPI_TOT_INS};//={PAPI_BR_INS,PAPI_BR_MSP};

long_long values[1];//values[0]=0;

PAPI_start_counters(Events,1);

for(i=0;i<300;i++){
    for(j=0;j<300;j++){
        for(k=0;k<300;k++){
            c[i][j]+=a[i][k]*b[k][j];
        }
    }
}
printf("r is %d\n",c[0][0]);

PAPI_read_counters(values,1);

printf("events is %lld\n",values[0]);

for(i=0;i<300;i++){
    for(j=0;j<300;j++){
        for(k=0;k<300;k++){
            a[i][j]+=b[i][k]*c[k][j];
        }
    }
}

PAPI_accum_counters(values,1);

printf("events is %lld\n",values[0]);

for(i=0;i<300;i++){
            for(j=0;j<300;j++){
                    for(k=0;k<300;k++){
                            a[i][j]+=b[i][k]*c[k][j];
                    }
            }
    }

PAPI_stop_counters(values,1);

printf("events is %lld\n",values[0]);

return 0;
}

我的想法:

1.我的电脑(uname -a): Linux xunzhang-virtual-machine 2.6.35-28-generic#49-Ubuntu SMP Tue Mar ... X86_64 GNU / Linux

我怎么能(命令)看到我的内核对perf事件的支持?我只使用&gt; 2.6.32 ....

的默认结论

2.我只是在我的MAC中使用我的虚拟机,这样做了吗?? ..

说些什么来指导/帮助我。谢谢!

2 个答案:

答案 0 :(得分:0)

您没有初始化PAPI。在开始计数之前,您应该进行初始化并计算关闭之后。您可能想要读取ctests目录中的文件以了解它是如何完成的。

答案 1 :(得分:0)

AFAIK,高级API调用不会调用显式初始化。我遇到了和你一样的问题。如果你已经解决了,请告诉我怎么样?