我有一个使用PETSc的应用程序。对于(近)生产运行下的性能监控,我想记录少量的各种值。有些是由PETSc生成的,有些则不是。
现在我想知道:如何从PetscEventPerfInfo
中读取时间值以将其写入我的文件?我找不到关于PetscEventPerfInfo
的文档条目,所以我不确定我是否应该以任何方式触摸它。
但是,我发现以下方法基本上揭示了PetscEventPerfInfo
:
PetscErrorCode EventPerfInfoClear(PetscEventPerfInfo *eventInfo)
{
PetscFunctionBegin;
eventInfo->id = -1;
eventInfo->active = PETSC_TRUE;
eventInfo->visible = PETSC_TRUE;
eventInfo->depth = 0;
eventInfo->count = 0;
eventInfo->flops = 0.0;
eventInfo->flops2 = 0.0;
eventInfo->flopsTmp = 0.0;
eventInfo->time = 0.0;
eventInfo->time2 = 0.0;
eventInfo->timeTmp = 0.0;
eventInfo->numMessages = 0.0;
eventInfo->messageLength = 0.0;
eventInfo->numReductions = 0.0;
PetscFunctionReturn(0);
}
我强烈猜测它只是eventInfo->time
,但我绝对不确定是否可以阅读它是否有“官方”方式从该结构中读取。
那么,如果我只想将时间值读入变量以供进一步使用,我该怎么办?
答案 0 :(得分:1)
好消息:有一个PETSC的例子,src/dm/impls/plex/examples/tests/ex9.c利用time
的字段PetscEventPerfInfo
打印与效果相关的日志! < / p>
结构PetscEventPerfInfo
在petsc-3.7.6/include/petsclog.h
中定义。
文件中有很多注释。
字段time
确实定义为:
PetscLogDouble time, time2, timeTmp; /* The time and time^2 taken for this event */
有time
包含eventlog.c
执行时间的线索。实际上,在函数PetscLogEventBeginComplete
中,有一个eventPerfLog->eventInfo[event].time -= curTime;
,它与eventPerfLog->eventInfo[event].time += curTime;
的{{1}}匹配。
因此,只有在PetscLogEventEndComplete()
和time
被调用或同时PetscLogEventBeginComplete()
和PetscLogEventEndComplete()
时,字段PetscLogEventBeginDefault()
的值才有意义。