在 PETSc 代码中使用 PAPI

计算科学 线性代数 宠物 表现 图书馆 分析
2021-12-10 17:56:28

我正在尝试计算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 );

}
1个回答

一般来说,在调试这类问题时,您希望尽可能多地了解您的错误。在这种情况下,您的retval支票没有提供足够的信息。有关更多信息,请参阅有关错误处理的 PAPI文档,但首先,您可能需要尝试:

retval = PAPI_read_counters(counters, 2));
if (retval != PAPI_OK) {
    fprintf(stderr, "PAPI error %d: %s\n", ret, PAPI_strerror(retval));
}

您还可以使用PAPI_Set_debug提高调试信息的级别,但您需要确保您拥有启用调试的 PAPI 构建。