2017-08-03 65 views
1

我有一個使用PETSc的應用程序。對於(近)生產運行中的性能監控,我想記錄少量的各種值。一些由PETSc生成,一些不是。從PetscEventPerfInfo中讀取數值

現在我想知道:如何將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

好消息:有PETSC,src/dm/impls/plex/examples/tests/ex9.c的一個例子,其利用領域的PetscEventPerfInfo到打印性能相關的日誌time的!

結構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;,它與PetscLogEventEndComplete()eventPerfLog->eventInfo[event].time += curTime;相匹配。

因此,如果僅在兩個PetscLogEventBeginComplete()PetscLogEventEndComplete()被稱爲或領域time的價值是既有趣和PetscLogEventBeginDefault()PetscLogEventEndDefault()