Skip to content

Commit 4814000

Browse files
deep1712DEVAID-MSFTnmalkapuram
authored
Updating Lat Mem Rd profile and executor (#642)
* Updating gcc version from 10 to 13 for Lat Mem rd lmbench * Updating C++ compiler command lines * adding scenario name and toolname correctly * Adding LmBench executor * Fixing unit tests --------- Co-authored-by: Deepanshu Vaid <devaid@microsoft.com> Co-authored-by: nmalkapuram <nmalkapuram@microsoft.com>
1 parent 4f35e59 commit 4814000

5 files changed

Lines changed: 66 additions & 28 deletions

File tree

src/VirtualClient/VirtualClient.Actions.UnitTests/LMbench/LMbenchExecutorTests.cs

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,8 @@ public void SetupTest()
3535
this.Parameters = new Dictionary<string, IConvertible>()
3636
{
3737
{ nameof(LMbenchExecutor.PackageName), "lmbench" },
38-
{ nameof(LMbenchExecutor.CompilerFlags), "CPPFLAGS=\"-I /usr/include/tirpc\"" }
38+
{ nameof(LMbenchExecutor.CompilerFlags), "CPPFLAGS=\"-I /usr/include/tirpc\"" },
39+
{ nameof(LMbenchExecutor.Scenario), "Scenario" }
3940
};
4041

4142
this.ProcessManager.OnProcessCreated = (process) =>
@@ -60,6 +61,26 @@ public async Task LMbenchExecutorExecutesTheExpectedWorkloadCommands()
6061
}
6162
}
6263

64+
[Test]
65+
public async Task LMbenchExecutorExecutesTheExpectedCommandForLatMemRd()
66+
{
67+
this.Parameters[nameof(LMbenchExecutor.BinaryName)] = "lat_mem_rd";
68+
this.ProcessManager.OnProcessCreated = (process) =>
69+
{
70+
string lmbenchOutput = System.IO.File.ReadAllText(this.Combine(LMbenchExecutorTests.Examples, "latmemrd_example_results.txt"));
71+
process.StandardOutput.Append(lmbenchOutput);
72+
};
73+
using (TestLMbenchExecutor lmbenchExecutor = new TestLMbenchExecutor(this.Dependencies, this.Parameters))
74+
{
75+
await lmbenchExecutor.ExecuteAsync(EventContext.None, CancellationToken.None);
76+
77+
Assert.IsTrue(this.ProcessManager.CommandsExecuted(
78+
$"sudo chmod -R 2777 \"/home/user/tools/VirtualClient/packages/lmbench/scripts\"",
79+
$"make build CPPFLAGS=\"-I /usr/include/tirpc\"",
80+
$"/home/user/tools/VirtualClient/packages/lmbench/bin/x86_64-Linux/lat_mem_rd"));
81+
}
82+
}
83+
6384
[Test]
6485
public async Task LMbenchExecutorExecutesTheExpectedLMbenchBenchmarks()
6586
{

src/VirtualClient/VirtualClient.Actions.UnitTests/LMbench/LatMemRdMetricsParserTests.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -37,10 +37,10 @@ public void LMbenchMetricsParserCapturesTheExpectedMetrics_1()
3737
IList<Metric> metrics = parser.Parse();
3838

3939
Assert.IsTrue(metrics.Count == 54);
40-
Assert.IsNotNull(metrics.FirstOrDefault(m => m.Name == "Latency_StrideBytes_64_Array_512_B" && m.Value == 1.438));
41-
Assert.IsNotNull(metrics.FirstOrDefault(m => m.Name == "Latency_StrideBytes_64_Array_1_KiB" && m.Value == 1.438));
42-
Assert.IsNotNull(metrics.FirstOrDefault(m => m.Name == "Latency_StrideBytes_32_Array_768_KiB" && m.Value == 1.506));
43-
Assert.IsNotNull(metrics.FirstOrDefault(m => m.Name == "Latency_StrideBytes_32_Array_32_MiB" && m.Value == 1.612));
40+
Assert.IsNotNull(metrics.FirstOrDefault(m => m.Name == "Latency" && m.Value == 1.438));
41+
Assert.IsNotNull(metrics.FirstOrDefault(m => m.Name == "Latency" && m.Value == 1.438));
42+
Assert.IsNotNull(metrics.FirstOrDefault(m => m.Name == "Latency" && m.Value == 1.506));
43+
Assert.IsNotNull(metrics.FirstOrDefault(m => m.Name == "Latency" && m.Value == 1.612));
4444
}
4545
}
4646
}

src/VirtualClient/VirtualClient.Actions/LMbench/LMbenchExecutor.cs

Lines changed: 30 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -170,7 +170,16 @@ protected override async Task ExecuteAsync(EventContext telemetryContext, Cancel
170170
await this.LogProcessDetailsAsync(executeBinary, telemetryContext);
171171
executeBinary.ThrowIfErrored<WorkloadException>(ProcessProxy.DefaultSuccessCodes, errorReason: ErrorReason.WorkloadFailed);
172172
LatMemRdMetricsParser latMemRdMetricsParser = new LatMemRdMetricsParser($"{executeBinary.StandardOutput.ToString()}{executeBinary.StandardError.ToString()}");
173-
this.CaptureMetrics(executeBinary, latMemRdMetricsParser, telemetryContext, this.BinaryName);
173+
IList<Metric> metrics = latMemRdMetricsParser.Parse();
174+
175+
foreach (Metric metric in metrics)
176+
{
177+
IConvertible arraySize = null, strideSizeInBytes = null;
178+
metric.Metadata.TryGetValue("ArraySize", out arraySize);
179+
metric.Metadata.TryGetValue("StrideSizeInBytes", out strideSizeInBytes);
180+
string scenario = $"StrideSize_{strideSizeInBytes ?? string.Empty}_B_ArraySize_{arraySize ?? string.Empty}";
181+
this.CaptureMetric(metric, executeBinary, telemetryContext, $"LMBench\\{this.BinaryName}", scenario);
182+
}
174183
}
175184
}
176185
}
@@ -238,7 +247,7 @@ private Task BuildSourceCodeAsync(EventContext telemetryContext, CancellationTok
238247
});
239248
}
240249

241-
private void CaptureMetrics(IProcessProxy process, MetricsParser metricsParser, EventContext telemetryContext, string scenario)
250+
private void CaptureMetric(Metric metric, IProcessProxy process, EventContext telemetryContext, string toolName, string scenarioName)
242251
{
243252
this.MetadataContract.AddForScenario(
244253
"LMbench",
@@ -247,18 +256,18 @@ private void CaptureMetrics(IProcessProxy process, MetricsParser metricsParser,
247256

248257
this.MetadataContract.Apply(telemetryContext);
249258

250-
IList<Metric> metrics = metricsParser.Parse();
251-
252-
this.Logger.LogMetrics(
253-
toolName: "LMbench",
254-
scenarioName: scenario,
255-
process.StartTime,
256-
process.ExitTime,
257-
metrics,
258-
metricCategorization: null,
259-
scenarioArguments: process.FullCommand(),
260-
this.Tags,
261-
telemetryContext);
259+
this.Logger.LogMetric(
260+
toolName: toolName,
261+
scenarioName: scenarioName,
262+
process.StartTime,
263+
process.ExitTime,
264+
metric.Name,
265+
metric.Value,
266+
metric.Unit,
267+
metricCategorization: null,
268+
scenarioArguments: process.FullCommand(),
269+
this.Tags,
270+
telemetryContext);
262271
}
263272

264273
private Task ExecuteWorkloadAsync(EventContext telemetryContext, CancellationToken cancellationToken)
@@ -326,7 +335,13 @@ private Task ExecuteWorkloadAsync(EventContext telemetryContext, CancellationTok
326335
// The use of the original telemetry context created at the top
327336
// is purposeful.
328337
LMbenchMetricsParser lmbenchMetricsParser = new LMbenchMetricsParser(process.StandardOutput.ToString());
329-
this.CaptureMetrics(process, lmbenchMetricsParser, relatedContext, "Memory Benchmark");
338+
IList<Metric> metrics = lmbenchMetricsParser.Parse();
339+
340+
foreach (Metric metric in metrics)
341+
{
342+
string scenario = "Memory Benchmark";
343+
this.CaptureMetric(metric, process, telemetryContext, $"LMBench", scenario);
344+
}
330345
}
331346
});
332347
}

src/VirtualClient/VirtualClient.Actions/LMbench/LatMemRdMetricsParser.cs

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -41,11 +41,14 @@ public override IList<Metric> Parse()
4141
{
4242
var values = line.Split(' ');
4343
string strideSize = section.Key.Split('=')[1];
44-
var metadata = new Dictionary<string, IConvertible>();
45-
metadata.Add("StrideSizeBytes", strideSize);
46-
metadata.Add("ArraySizeInMiB", values[0]);
4744
long arraySizeInBytes = this.RoundOffToNearest512Multiple(double.Parse(values[0]) * 1024 * 1024) * 512;
48-
metrics.Add(new Metric($"Latency_StrideBytes_{strideSize}_Array_{this.MetricNameSuffix(arraySizeInBytes)}", double.Parse(values[1]), "ns", MetricRelativity.LowerIsBetter, null, $"Latency for memory read operation for Array size in MB {values[0]} & stride size {strideSize} in nano seconds", metadata));
45+
var metadata = new Dictionary<string, IConvertible>();
46+
47+
metadata.Add("StrideSizeInBytes", strideSize);
48+
metadata.Add("ArraySize", this.ArraySizeWithUnit(arraySizeInBytes));
49+
metadata.Add("ArraySizeInBytes", arraySizeInBytes);
50+
51+
metrics.Add(new Metric($"Latency", double.Parse(values[1]), "ns", MetricRelativity.LowerIsBetter, null, $"Latency for memory read operation for Array size in MB {values[0]} & stride size {strideSize} in nano seconds", metadata));
4952
}
5053
}
5154

@@ -65,7 +68,7 @@ private long RoundOffToNearest512Multiple(double number)
6568
return (long)Math.Round(number / 512.0);
6669
}
6770

68-
private string MetricNameSuffix(double bytes)
71+
private string ArraySizeWithUnit(double bytes)
6972
{
7073
if (bytes >= 1024 * 1024)
7174
{
@@ -79,7 +82,6 @@ private string MetricNameSuffix(double bytes)
7982
{
8083
return $"{bytes}_B";
8184
}
82-
8385
}
8486
}
8587
}

src/VirtualClient/VirtualClient.Main/profiles/PERF-MEM-LATRDMEM.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,8 @@
88
},
99
"Parameters": {
1010
"CompilerName": "gcc",
11-
"CompilerVersion": "10",
12-
"CompilerFlags": "CPPFLAGS=\"-I /usr/include/tirpc\""
11+
"CompilerVersion": "13",
12+
"CompilerFlags": "CPPFLAGS=\" -O2 -Wall -march=native -I /usr/include/tirpc\""
1313
},
1414
"Actions": [
1515
{

0 commit comments

Comments
 (0)