https://bugs.kde.org/show_bug.cgi?id=394307
Bug ID: 394307 Summary: Add macro to extract current instruction count for peak load monitoring Product: valgrind Version: unspecified Platform: Other OS: Linux Status: UNCONFIRMED Severity: normal Priority: NOR Component: callgrind Assignee: josef.weidendor...@gmx.de Reporter: jonjo...@gmail.com Target Milestone: --- In order to use callgrind to find load peaks, it is necessary to extract the current instruction count from the running program. Currently callgrind just gives the total instruction count which can give information about a mean load but it cannot be used to find peak loads. I've made a modification to callgrind that adds a macro that does this: diff --git a/callgrind/callgrind.h b/callgrind/callgrind.h index f078cc82b..6d3c40951 100644 --- a/callgrind/callgrind.h +++ b/callgrind/callgrind.h @@ -78,7 +78,8 @@ typedef VG_USERREQ__TOGGLE_COLLECT, VG_USERREQ__DUMP_STATS_AT, VG_USERREQ__START_INSTRUMENTATION, - VG_USERREQ__STOP_INSTRUMENTATION + VG_USERREQ__STOP_INSTRUMENTATION, + VG_USERREQ__GET_TOTAL_COSTS } Vg_CallgrindClientRequest; /* Dump current state of cost centers, and zero them afterwards */ @@ -126,4 +127,10 @@ typedef VALGRIND_DO_CLIENT_REQUEST_STMT(VG_USERREQ__STOP_INSTRUMENTATION, \ 0, 0, 0, 0, 0) +#define CALLGRIND_GET_TOTAL_COSTS(rValue) \ + VALGRIND_DO_CLIENT_REQUEST(rValue, 0, VG_USERREQ__GET_TOTAL_COSTS, \ + 0, 0, 0, 0, 0) + #endif /* __CALLGRIND_H */ diff --git a/callgrind/main.c b/callgrind/main.c index ab4927296..dd59cc208 100644 --- a/callgrind/main.c +++ b/callgrind/main.c @@ -1661,6 +1661,20 @@ Bool CLG_(handle_client_request)(ThreadId tid, UWord *args, UWord *ret) } break; + case VG_USERREQ__GET_TOTAL_COSTS: + { + #define UWORD_MAX (~(UWord)0) + ULong Ir_total; + + Ir_total = CLG_(current_state).cost[ fullOffset(EG_IR) ]; + + if (Ir_total > UWORD_MAX) // ULong is 64 bits, UWord might be 32 bit + Ir_total = UWORD_MAX; + + *ret = ((UWord) Ir_total); + } + break; + case VG_USERREQ__ZERO_STATS: CLG_(zero_all_cost)(True); *ret = 0; /* meaningless */ (END) This can be used to track the peak load of a function in the following way: // Some kind of main loop unsigned long MaxInstCount = 0; while(1) { unsigned long PostInstCount, PreInstCount; CALLGRIND_ZERO_STATS; CALLGRIND_START_INSTRUMENTATION; CALLGRIND_GET_TOTAL_COSTS(PreInstCount); // Execute function to monitor Execute_Something(); CALLGRIND_GET_TOTAL_COSTS(PostInstCount); PostInstCount -= PreInstCount; // Find max and dump callgrind stats. if (PostInstCount > MaxInstCount) { MaxInstCount = PostInstCount; CALLGRIND_DUMP_STATS; } // Write execution time and some other parameters to InstructionFetchLog.txt. fprintf(InstructionFetchLog, "%u,%u\n", PostInstCount, SomeInterestingStateInfo); // Stop intrumentation CALLGRIND_STOP_INSTRUMENTATION; } -- You are receiving this mail because: You are watching all bug changes.