我正在尝试计算for内部循环每次迭代的缓存未命中数、总周期数等MatMult_SeqSBAIJ_2()。我已将 PETSc 配置为使用 PAPI,并且我正在使用 PAPI API,如下面的骨架代码所示。PAPI 在运行 ./main 时总是失败 (!PAPI_OK)。PAPI 或 PETSc 中是否有我遗漏的设置,可以在 PETSc 中进行正确的计数器采样?
main.c:
PetscInitialize(&argc,&args,(char*)0,help);
PAPI_library_init(PAPI_VER_CURRENT); //Initialize PAPI
/*Matrix and vector setup code here. */
MatMult_SeqSBAIJ_2(A,xx,zz)
/*Destroy matrix here*/
sbaij2.c:
PetscErrorCode MatMult_SeqSBAIJ_2(Mat A,Vec xx,Vec zz)
{
long long counters[2];
int PAPI_events[2] = {PAPI_TOT_CYC, PAPI_L1_MISSES};
int retval=0;
PAPI_start_counters( PAPI_events, 2 );
for (i=0; i<mbs;i++)
{
/*SpMV operations happen here*/
PAPI_read_counters( counters, 2 );
if ( (retval = PAPI_read_counters(counters, 2)) != PAPI_OK)
{
printf("Papi fails!\n");
}
}
PAPI_stop_counters( counters, 2 );
}