Skip to content

Commit d98bad0

Browse files
Add config param noopCallbacks
Promotes noopCallbacks from a runtime CLI flag (--noop-callbacks) to a compile-time config param in ConverterParams. The param guard is at the top of each callback body, after C pointer dereference, so the compiler folds away the entire callback body in normal builds. Callbacks are still registered and called by OTF2 — this isolates raw C-library read + dispatch overhead from Chapel processing overhead. The write step is also skipped when noopCallbacks=true since there is no callgraph/metrics data to write. Removes: --noop-callbacks CLI flag noopCallbacks field from ConverterConfig record and EvtCallbackArgs [Reviewed by @brandon-neth]
2 parents 1d66ed3 + 260229b commit d98bad0

9 files changed

Lines changed: 32 additions & 22 deletions

apps/FastOTF2Converter/src/ConverterArgs.chpl

Lines changed: 1 addition & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,6 @@ module ConverterArgs {
2525
var excludeHIP: bool;
2626
var timings: bool;
2727
var timingsCSV: string;
28-
var noopCallbacks: bool;
2928
}
3029

3130
// -------------------------------------------------------------------------
@@ -111,14 +110,6 @@ module ConverterArgs {
111110
help="Output directory for CSV timing files (writes run_<ts>.csv, tasks_<ts>.csv, phases_<ts>.csv)"
112111
);
113112

114-
var noopCallbacksArg = parser.addFlag(
115-
name="noopCallbacks",
116-
opts=["--noop-callbacks"],
117-
defaultValue=false,
118-
numArgs=0,
119-
help="Disable all callback work to measure pure OTF2 read baseline"
120-
);
121-
122113
var logArg = parser.addOption(
123114
name="log",
124115
defaultValue="INFO",
@@ -137,7 +128,6 @@ module ConverterArgs {
137128
conf.excludeHIP = excludeHIPArg.valueAsBool();
138129
conf.timings = timingsArg.valueAsBool();
139130
conf.timingsCSV = timingsCSVArg.value();
140-
conf.noopCallbacks = noopCallbacksArg.valueAsBool();
141131

142132
try {
143133
log = logArg.value(): LogLevel;
@@ -200,8 +190,7 @@ module ConverterArgs {
200190
processesToTrack=processesToTrack,
201191
metricsToTrack=metricsToTrack,
202192
excludeMPI=conf.excludeMPI,
203-
excludeHIP=conf.excludeHIP,
204-
noopCallbacks=conf.noopCallbacks
193+
excludeHIP=conf.excludeHIP
205194
);
206195
}
207196
}

apps/FastOTF2Converter/src/ConverterCommon.chpl

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -129,7 +129,6 @@ module ConverterCommon {
129129
const metricsToTrack: domain(string);
130130
const excludeMPI: bool = false;
131131
const excludeHIP: bool = false;
132-
const noopCallbacks: bool = false;
133132
}
134133

135134
record EvtCallbackContext {

apps/FastOTF2Converter/src/ConverterEvtReaders.chpl

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
module ConverterEvtReaders {
99
use FastOTF2;
1010
use ConverterCommon;
11+
use ConverterParams;
1112
use Time;
1213
use CallGraphModule;
1314
use List;
@@ -119,8 +120,8 @@ module ConverterEvtReaders {
119120
region: OTF2_RegionRef): OTF2_CallbackCode {
120121
var ctxPtr = userData: c_ptr(EvtCallbackContext);
121122
if ctxPtr == nil then return OTF2_CALLBACK_ERROR;
123+
if noopCallbacks then return OTF2_CALLBACK_SUCCESS;
122124
ref ctx = ctxPtr.deref();
123-
if ctx.evtArgs.noopCallbacks then return OTF2_CALLBACK_SUCCESS;
124125
var cbSw: stopwatch; cbSw.start();
125126
ref defCtx = ctx.defContext;
126127

@@ -152,8 +153,8 @@ module ConverterEvtReaders {
152153
region: OTF2_RegionRef): OTF2_CallbackCode {
153154
var ctxPtr = userData: c_ptr(EvtCallbackContext);
154155
if ctxPtr == nil then return OTF2_CALLBACK_ERROR;
156+
if noopCallbacks then return OTF2_CALLBACK_SUCCESS;
155157
ref ctx = ctxPtr.deref();
156-
if ctx.evtArgs.noopCallbacks then return OTF2_CALLBACK_SUCCESS;
157158
var cbSw: stopwatch; cbSw.start();
158159
ref defCtx = ctx.defContext;
159160

@@ -188,8 +189,8 @@ module ConverterEvtReaders {
188189
metricValues: c_ptrConst(OTF2_MetricValue)): OTF2_CallbackCode {
189190
var ctxPtr = userData: c_ptr(EvtCallbackContext);
190191
if ctxPtr == nil then return OTF2_CALLBACK_ERROR;
192+
if noopCallbacks then return OTF2_CALLBACK_SUCCESS;
191193
ref ctx = ctxPtr.deref();
192-
if ctx.evtArgs.noopCallbacks then return OTF2_CALLBACK_SUCCESS;
193194
var cbSw: stopwatch; cbSw.start();
194195
ref defCtx = ctx.defContext;
195196
const (locName, locGroup, _) = getLocationAndRegionInfo(defCtx, location, 0);
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
// Copyright Hewlett Packard Enterprise Development LP.
2+
//
3+
// Compile-time configuration knobs for the converter.
4+
// All config params live here so they have a single source of truth.
5+
// Any module that needs a param adds: use ConverterParams;
6+
7+
module ConverterParams {
8+
9+
// When true, event callback bodies are no-ops (return SUCCESS immediately).
10+
// Callbacks are still registered and called by OTF2 — this measures raw
11+
// C-library read + dispatch overhead without any Chapel processing.
12+
config param noopCallbacks: bool = false;
13+
14+
}

apps/FastOTF2Converter/src/FastOTF2Converter.chpl

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
module FastOTF2Converter {
44
use ConverterArgs;
5+
use ConverterParams;
56
use Strategy_Serial;
67
use Strategy_LocBlock;
78
use Strategy_LocGroupBlock;
@@ -23,6 +24,8 @@ module FastOTF2Converter {
2324
proc main(args: [] string) throws {
2425
const conf = parseConverterArgs(args);
2526
validatePaths(conf);
27+
if noopCallbacks then
28+
logWarn("Compiled with noopCallbacks=true — event callbacks are no-ops");
2629

2730
// Capture baseline RSS per locale (before work)
2831
var baselineKiB: [0..#numLocales] int;

apps/FastOTF2Converter/src/Strategy_LocBlock.chpl

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
module Strategy_LocBlock {
1010
use ConverterArgs;
1111
use ConverterCommon;
12+
use ConverterParams;
1213
use ConverterDefReaders;
1314
use ConverterEvtReaders;
1415
use ConverterWriters;
@@ -86,10 +87,10 @@ module Strategy_LocBlock {
8687
logInfo("Trace loaded in ", global_sw.elapsed(), " seconds");
8788
logInfo("Writing ", conf.outputFormat: string, " files to directory: ", conf.outputDir);
8889

89-
const writeResult = if !conf.noopCallbacks
90+
const writeResult = if !noopCallbacks
9091
then writeOutputForContext(mergedCtx, conf.outputFormat, conf.outputDir)
9192
else new WriteResult();
92-
if !conf.noopCallbacks then
93+
if !noopCallbacks then
9394
logInfo("Finished writing to ", conf.outputDir, " in ", writeResult.writeTime, " seconds");
9495
logInfo("Finished converting trace in ", global_sw.elapsed(), " seconds");
9596

apps/FastOTF2Converter/src/Strategy_LocGroupBlock.chpl

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
module Strategy_LocGroupBlock {
1010
use ConverterArgs;
1111
use ConverterCommon;
12+
use ConverterParams;
1213
use ConverterDefReaders;
1314
use ConverterEvtReaders;
1415
use ConverterGroupMap;
@@ -90,7 +91,7 @@ module Strategy_LocGroupBlock {
9091
totalEventsRead += readResult.eventsRead;
9192

9293
// Write immediately — each reader owns complete groups
93-
const writeResult = if !conf.noopCallbacks
94+
const writeResult = if !noopCallbacks
9495
then writeOutputForContext(evtContexts[i], conf.outputFormat, conf.outputDir)
9596
else new WriteResult();
9697

apps/FastOTF2Converter/src/Strategy_LocGroupDistBlock.chpl

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
module Strategy_LocGroupDistBlock {
1010
use ConverterArgs;
1111
use ConverterCommon;
12+
use ConverterParams;
1213
use ConverterDefReaders;
1314
use ConverterEvtReaders;
1415
use ConverterGroupMap;
@@ -108,7 +109,7 @@ module Strategy_LocGroupDistBlock {
108109
else 0.0, "%");
109110

110111
// Write immediately — each reader owns complete groups
111-
const writeResult = if !conf.noopCallbacks
112+
const writeResult = if !noopCallbacks
112113
then writeOutputForContext(evtContexts[i], conf.outputFormat, conf.outputDir)
113114
else new WriteResult();
114115

apps/FastOTF2Converter/src/Strategy_Serial.chpl

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
module Strategy_Serial {
1010
use ConverterArgs;
1111
use ConverterCommon;
12+
use ConverterParams;
1213
use ConverterDefReaders;
1314
use ConverterEvtReaders;
1415
use ConverterWriters;
@@ -39,10 +40,10 @@ module Strategy_Serial {
3940

4041
logDebug("Total events read: ", totalEventsRead);
4142
logInfo("Writing ", conf.outputFormat: string, " files to directory: ", conf.outputDir);
42-
const writeResult = if !conf.noopCallbacks
43+
const writeResult = if !noopCallbacks
4344
then writeOutputForContext(evtCtx, conf.outputFormat, conf.outputDir)
4445
else new WriteResult();
45-
if !conf.noopCallbacks then
46+
if !noopCallbacks then
4647
logInfo("Finished writing to ", conf.outputDir, " in ", sw.elapsed(), " seconds");
4748
const taskTotalTime = taskSw.elapsed();
4849
const evtReadWriteTime = sw.elapsed();

0 commit comments

Comments
 (0)