2017-08-03 3 views
1

Ich habe eine Anwendung mit PETSc. Für die Leistungsüberwachung unter (nahen) Produktionsläufen möchte ich eine kleine Anzahl verschiedener Werte protokollieren. Einige werden von PETSc generiert, andere nicht.Werte aus PetscEventPerfInfo lesen

Jetzt frage ich mich: Wie kann ich den Zeitwert aus PetscEventPerfInfo lesen, um es in meine Datei zu schreiben? Ich kann keinen Dokumentationseintrag über PetscEventPerfInfo finden, daher bin ich mir nicht sicher, ob ich ihn irgendwie anfassen soll.

Allerdings fand ich die folgende Methode, die im Grunde die Struktur des PetscEventPerfInfo zeigt:

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); 
} 

Ich habe eine starke Vermutung, dass es nur eventInfo->time, aber ich bin absolut nicht sicher, ob es ist, es zu lesen speichern oder ob es eine "offizielle" Möglichkeit gibt, von dieser Struktur zu lesen.

Also, was soll ich tun, wenn ich nur den Zeitwert in eine Variable für die weitere Verwendung lesen möchte?

Antwort

0

gute Nachricht: Es ist ein Beispiel für PETSc, src/dm/impls/plex/examples/tests/ex9.c die Protokolle erfolgsbezogen Print-Nutzung des Feldes time von PetscEventPerfInfo macht! Die Struktur PetscEventPerfInfo ist in petsc-3.7.6/include/petsclog.h definiert. Es gibt viele Kommentare in der Datei. Das Feld time ist in der Tat wie folgt definiert:

PetscLogDouble time, time2, timeTmp; /* The time and time^2 taken for this event */ 

Es Hinweise, dass time die Ausführungszeit in eventlog.c enthält. Tatsächlich gibt es in der Funktion PetscLogEventBeginComplete eine eventPerfLog->eventInfo[event].time -= curTime;, die mit der eventPerfLog->eventInfo[event].time += curTime; von PetscLogEventEndComplete() übereinstimmt.

Folglich wird der Wert des Feldes time ist interessant, wenn ein nur, wenn beide PetscLogEventBeginComplete() und PetscLogEventEndComplete() berufen worden oder beide PetscLogEventBeginDefault() und PetscLogEventEndDefault().