diff --git a/hermit/usr/openmpbench/common.c b/hermit/usr/openmpbench/common.c index 816795c56..db68de713 100644 --- a/hermit/usr/openmpbench/common.c +++ b/hermit/usr/openmpbench/common.c @@ -277,7 +277,7 @@ void reference(char *name, void (*refer)(void)) { int k; double start; - XRayAnnotate("name='%s'", name); + XRayLabelFrame(name); // Calculate the required number of innerreps innerreps = getinnerreps(refer); @@ -322,7 +322,7 @@ void benchmark(char *name, void (*test)(void)) intitest(name); - XRayAnnotate("name='%s'", name); + XRayLabelFrame(name); for (k=0; k<=outerreps; k++) { start = getclock(); diff --git a/hermit/usr/openmpbench/syncbench.c b/hermit/usr/openmpbench/syncbench.c index 6fa88de7f..b3f87e093 100644 --- a/hermit/usr/openmpbench/syncbench.c +++ b/hermit/usr/openmpbench/syncbench.c @@ -68,59 +68,59 @@ int main(int argc, char **argv) { benchmark("PARALLEL", &testpr); XRayEndFrame(trace); - /* TEST FOR */ + /* TEST FOR */ XRayStartFrame(trace); benchmark("FOR", &testfor); XRayEndFrame(trace); - /* TEST PARALLEL FOR */ + /* TEST PARALLEL FOR */ XRayStartFrame(trace); benchmark("PARALLEL FOR", &testpfor); XRayEndFrame(trace); - /* TEST BARRIER */ + /* TEST BARRIER */ XRayStartFrame(trace); - benchmark("BARRIER", &testbar); + benchmark("BARRIER", &testbar); XRayEndFrame(trace); - /* TEST SINGLE */ + /* TEST SINGLE */ XRayStartFrame(trace); - benchmark("SINGLE", &testsing); + benchmark("SINGLE", &testsing); XRayEndFrame(trace); - /* TEST CRITICAL*/ + /* TEST CRITICAL*/ XRayStartFrame(trace); - benchmark("CRITICAL", &testcrit); + benchmark("CRITICAL", &testcrit); XRayEndFrame(trace); - /* TEST LOCK/UNLOCK */ + /* TEST LOCK/UNLOCK */ XRayStartFrame(trace); - benchmark("LOCK/UNLOCK", &testlock); + benchmark("LOCK/UNLOCK", &testlock); XRayEndFrame(trace); - /* TEST ORDERED SECTION */ + /* TEST ORDERED SECTION */ XRayStartFrame(trace); - benchmark("ORDERED", &testorder); + benchmark("ORDERED", &testorder); XRayEndFrame(trace); - /* GENERATE NEW REFERENCE TIME */ + /* GENERATE NEW REFERENCE TIME */ XRayStartFrame(trace); - reference("reference time 2", &referatom); + reference("reference time 2", &referatom); XRayEndFrame(trace); - /* TEST ATOMIC */ + /* TEST ATOMIC */ XRayStartFrame(trace); - benchmark("ATOMIC", &testatom); + benchmark("ATOMIC", &testatom); XRayEndFrame(trace); - /* GENERATE NEW REFERENCE TIME */ + /* GENERATE NEW REFERENCE TIME */ XRayStartFrame(trace); - reference("reference time 3", &referred); + reference("reference time 3", &referred); XRayEndFrame(trace); - /* TEST REDUCTION (1 var) */ + /* TEST REDUCTION (1 var) */ XRayStartFrame(trace); - benchmark("REDUCTION", &testred); + benchmark("REDUCTION", &testred); XRayEndFrame(trace); #ifdef PARAVERTRACE diff --git a/hermit/usr/xray/xray.c b/hermit/usr/xray/xray.c index dc0fe8cc7..6b48dcb56 100644 --- a/hermit/usr/xray/xray.c +++ b/hermit/usr/xray/xray.c @@ -97,6 +97,7 @@ struct XRayTraceCapture { uint32_t guard3; struct XRayTraceBufferEntry* buffer; struct XRayTraceFrame frame; + char frame_labels[XRAY_FRAME_LBL_BUFSIZE][XRAY_MAX_LABEL]; #ifndef XRAY_DISABLE_BROWSER_INTEGRATION int32_t thread_id; @@ -556,7 +557,30 @@ int XRayFrameGetAnnotationCount(struct XRayTraceCapture* capture, int i) { void XRayFrameMakeLabel(struct XRayTraceCapture* capture, int counter, char* label) { - snprintf(label, XRAY_MAX_LABEL, "@@@frame%d@@@", counter); + if(counter < sizeof(capture->frame_labels) && capture->frame_labels[counter][0]) { + snprintf(label, XRAY_MAX_LABEL, "%s", capture->frame_labels[counter]); + } else { + snprintf(label, XRAY_MAX_LABEL, "frame_%i", counter); + } +} +void XRayLabelFrame(const char* fmt, ...) +{ + char buffer[32]; + int r; + va_list args; + + va_start(args, fmt); + r = vsnprintf(buffer, sizeof(buffer), fmt, args); + if(r != 0) { + const int n = XRayFrameGetHead(g_xray_capture); + if(n < sizeof(g_xray_capture->frame_labels)) { + strcpy(g_xray_capture->frame_labels[n], buffer); + } else { + puts("XRay: Not enough entries in frame label buffer"); + puts(" Add -DXRAY_FRAME_LBL_BUFSIZE=[n] to your CFLAGS"); + } + } + va_end(args); } @@ -620,6 +644,11 @@ void XRayStartFrame(struct XRayTraceCapture* capture) { GTSC(capture->frame.entry[i].start_tsc); g_xray_capture = capture; + // initialize frame label + if(i < sizeof(capture->frame_labels)) { + capture->frame_labels[i][0] = 0; + } + #ifndef XRAY_DISABLE_BROWSER_INTEGRATION capture->frame.entry[i].start_time = XRayGenerateTimestampsNow(); #endif diff --git a/hermit/usr/xray/xray.h b/hermit/usr/xray/xray.h index 1d459c4f3..6e0991f0c 100644 --- a/hermit/usr/xray/xray.h +++ b/hermit/usr/xray/xray.h @@ -51,6 +51,7 @@ XRAY_NO_INSTRUMENT struct XRayTraceCapture* XRayInit(int stack_size, XRAY_NO_INSTRUMENT void XRayShutdown(struct XRayTraceCapture* capture); XRAY_NO_INSTRUMENT void XRayStartFrame(struct XRayTraceCapture* capture); XRAY_NO_INSTRUMENT void XRayEndFrame(struct XRayTraceCapture* capture); +XRAY_NO_INSTRUMENT void XRayLabelFrame(const char* fmt, ...); XRAY_NO_INSTRUMENT void XRaySetAnnotationFilter( struct XRayTraceCapture* capture, uint32_t filter); XRAY_NO_INSTRUMENT void XRaySaveReport(struct XRayTraceCapture* capture, @@ -95,6 +96,8 @@ inline struct XRayTraceCapture* XRayInit(int stack_size, inline void XRayShutdown(struct XRayTraceCapture* capture) {} inline void XRayStartFrame(struct XRayTraceCapture* capture) {} inline void XRayEndFrame(struct XRayTraceCapture* capture) {} +inline void XRayLabelFrame(const char* fmt, ...) {} + inline void XRaySetAnnotationFilter(struct XRayTraceCapture* capture, uint32_t filter) {} inline void XRaySaveReport(struct XRayTraceCapture* capture, diff --git a/hermit/usr/xray/xray_priv.h b/hermit/usr/xray/xray_priv.h index 3aa7e5250..8d2829e43 100644 --- a/hermit/usr/xray/xray_priv.h +++ b/hermit/usr/xray/xray_priv.h @@ -38,7 +38,7 @@ extern "C" { #define XRAY_SYMBOL_TABLE_MAX_RATIO (0.66f) #define XRAY_LINE_SIZE (1024) #define XRAY_MAX_FRAMES (60) -#define XRAY_MAX_LABEL (64) +#define XRAY_MAX_LABEL (32) #define XRAY_DEFAULT_SYMBOL_TABLE_SIZE (4096) #define XRAY_SYMBOL_POOL_NODE_SIZE (1024) #define XRAY_GUARD_VALUE_0x12345678 (0x12345678) @@ -197,6 +197,9 @@ XRAY_NO_INSTRUMENT struct XRayTimestampPair XRayFrameGetEndTimestampPair( XRAY_NO_INSTRUMENT struct XRayTimestampPair XRayGenerateTimestampsNow(void); #endif +#ifndef XRAY_FRAME_LBL_BUFSIZE +#define XRAY_FRAME_LBL_BUFSIZE 16 +#endif #endif /* defined(XRAY) */