From 2d62bf286c7a37aa2a25d0ceb1a08239c083956f Mon Sep 17 00:00:00 2001 From: Deepanshu Vaid Date: Thu, 12 Feb 2026 10:01:01 +0530 Subject: [PATCH 1/5] Updating gcc version from 10 to 13 for Lat Mem rd lmbench --- .../VirtualClient.Main/profiles/PERF-MEM-LATRDMEM.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/VirtualClient/VirtualClient.Main/profiles/PERF-MEM-LATRDMEM.json b/src/VirtualClient/VirtualClient.Main/profiles/PERF-MEM-LATRDMEM.json index e23637eb9b..08b13d953d 100644 --- a/src/VirtualClient/VirtualClient.Main/profiles/PERF-MEM-LATRDMEM.json +++ b/src/VirtualClient/VirtualClient.Main/profiles/PERF-MEM-LATRDMEM.json @@ -8,7 +8,7 @@ }, "Parameters": { "CompilerName": "gcc", - "CompilerVersion": "10", + "CompilerVersion": "13", "CompilerFlags": "CPPFLAGS=\"-I /usr/include/tirpc\"" }, "Actions": [ From d44ebfdcd5abb673b72a4c2601cddf2569185bcf Mon Sep 17 00:00:00 2001 From: Deepanshu Vaid Date: Thu, 12 Feb 2026 14:13:10 +0530 Subject: [PATCH 2/5] Updating C++ compiler command lines --- .../VirtualClient.Main/profiles/PERF-MEM-LATRDMEM.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/VirtualClient/VirtualClient.Main/profiles/PERF-MEM-LATRDMEM.json b/src/VirtualClient/VirtualClient.Main/profiles/PERF-MEM-LATRDMEM.json index 08b13d953d..81cf06e8e0 100644 --- a/src/VirtualClient/VirtualClient.Main/profiles/PERF-MEM-LATRDMEM.json +++ b/src/VirtualClient/VirtualClient.Main/profiles/PERF-MEM-LATRDMEM.json @@ -9,7 +9,7 @@ "Parameters": { "CompilerName": "gcc", "CompilerVersion": "13", - "CompilerFlags": "CPPFLAGS=\"-I /usr/include/tirpc\"" + "CompilerFlags": "CPPFLAGS=\" -O2 -Wall -march=native -I /usr/include/tirpc\"" }, "Actions": [ { From d0559ce644b16e114849e6a02a08bb45396ced91 Mon Sep 17 00:00:00 2001 From: Deepanshu Vaid Date: Tue, 17 Feb 2026 14:50:10 +0530 Subject: [PATCH 3/5] adding scenario name and toolname correctly --- .../LMbench/LMbenchExecutorTests.cs | 3 +- .../LMbench/LMbenchExecutor.cs | 48 +++++++++++++------ .../LMbench/LatMemRdMetricsParser.cs | 14 +++--- 3 files changed, 43 insertions(+), 22 deletions(-) diff --git a/src/VirtualClient/VirtualClient.Actions.UnitTests/LMbench/LMbenchExecutorTests.cs b/src/VirtualClient/VirtualClient.Actions.UnitTests/LMbench/LMbenchExecutorTests.cs index 45a2c23eb4..ddbbe558ec 100644 --- a/src/VirtualClient/VirtualClient.Actions.UnitTests/LMbench/LMbenchExecutorTests.cs +++ b/src/VirtualClient/VirtualClient.Actions.UnitTests/LMbench/LMbenchExecutorTests.cs @@ -35,7 +35,8 @@ public void SetupTest() this.Parameters = new Dictionary() { { nameof(LMbenchExecutor.PackageName), "lmbench" }, - { nameof(LMbenchExecutor.CompilerFlags), "CPPFLAGS=\"-I /usr/include/tirpc\"" } + { nameof(LMbenchExecutor.CompilerFlags), "CPPFLAGS=\"-I /usr/include/tirpc\"" }, + { nameof(LMbenchExecutor.Scenario), "Scenario" } }; this.ProcessManager.OnProcessCreated = (process) => diff --git a/src/VirtualClient/VirtualClient.Actions/LMbench/LMbenchExecutor.cs b/src/VirtualClient/VirtualClient.Actions/LMbench/LMbenchExecutor.cs index 2517e973be..1471f4d93a 100644 --- a/src/VirtualClient/VirtualClient.Actions/LMbench/LMbenchExecutor.cs +++ b/src/VirtualClient/VirtualClient.Actions/LMbench/LMbenchExecutor.cs @@ -170,7 +170,16 @@ protected override async Task ExecuteAsync(EventContext telemetryContext, Cancel await this.LogProcessDetailsAsync(executeBinary, telemetryContext); executeBinary.ThrowIfErrored(ProcessProxy.DefaultSuccessCodes, errorReason: ErrorReason.WorkloadFailed); LatMemRdMetricsParser latMemRdMetricsParser = new LatMemRdMetricsParser($"{executeBinary.StandardOutput.ToString()}{executeBinary.StandardError.ToString()}"); - this.CaptureMetrics(executeBinary, latMemRdMetricsParser, telemetryContext, this.BinaryName); + IList metrics = latMemRdMetricsParser.Parse(); + + foreach (Metric metric in metrics) + { + IConvertible arraySize = null, strideSizeInBytes = null; + metric.Metadata.TryGetValue("ArraySize", out arraySize); + metric.Metadata.TryGetValue("StrideSizeInBytes", out strideSizeInBytes); + string scenario = $"StrideSize_{strideSizeInBytes}_B_ArraySize_{arraySize}"; + this.CaptureMetric(metric, executeBinary, telemetryContext, $"LMBench\\{this.BinaryName}", scenario); + } } } } @@ -238,7 +247,7 @@ private Task BuildSourceCodeAsync(EventContext telemetryContext, CancellationTok }); } - private void CaptureMetrics(IProcessProxy process, MetricsParser metricsParser, EventContext telemetryContext, string scenario) + private void CaptureMetric(Metric metric, IProcessProxy process, EventContext telemetryContext, string toolName, string scenarioName) { this.MetadataContract.AddForScenario( "LMbench", @@ -247,18 +256,18 @@ private void CaptureMetrics(IProcessProxy process, MetricsParser metricsParser, this.MetadataContract.Apply(telemetryContext); - IList metrics = metricsParser.Parse(); - - this.Logger.LogMetrics( - toolName: "LMbench", - scenarioName: scenario, - process.StartTime, - process.ExitTime, - metrics, - metricCategorization: null, - scenarioArguments: process.FullCommand(), - this.Tags, - telemetryContext); + this.Logger.LogMetric( + toolName: toolName, + scenarioName: scenarioName, + process.StartTime, + process.ExitTime, + metric.Name, + metric.Value, + metric.Unit, + metricCategorization: null, + scenarioArguments: process.FullCommand(), + this.Tags, + telemetryContext); } private Task ExecuteWorkloadAsync(EventContext telemetryContext, CancellationToken cancellationToken) @@ -326,7 +335,16 @@ private Task ExecuteWorkloadAsync(EventContext telemetryContext, CancellationTok // The use of the original telemetry context created at the top // is purposeful. LMbenchMetricsParser lmbenchMetricsParser = new LMbenchMetricsParser(process.StandardOutput.ToString()); - this.CaptureMetrics(process, lmbenchMetricsParser, relatedContext, "Memory Benchmark"); + IList metrics = lmbenchMetricsParser.Parse(); + + foreach (Metric metric in metrics) + { + IConvertible arraySize = null, strideSizeInBytes = null; + metric.Metadata.TryGetValue("ArraySize", out arraySize); + metric.Metadata.TryGetValue("StrideSizepInBytes", out strideSizeInBytes); + string scenario = this.Scenario; + this.CaptureMetric(metric, process, telemetryContext, $"LMBench", scenario); + } } }); } diff --git a/src/VirtualClient/VirtualClient.Actions/LMbench/LatMemRdMetricsParser.cs b/src/VirtualClient/VirtualClient.Actions/LMbench/LatMemRdMetricsParser.cs index 3e0ad35c13..aa6218c807 100644 --- a/src/VirtualClient/VirtualClient.Actions/LMbench/LatMemRdMetricsParser.cs +++ b/src/VirtualClient/VirtualClient.Actions/LMbench/LatMemRdMetricsParser.cs @@ -41,11 +41,14 @@ public override IList Parse() { var values = line.Split(' '); string strideSize = section.Key.Split('=')[1]; - var metadata = new Dictionary(); - metadata.Add("StrideSizeBytes", strideSize); - metadata.Add("ArraySizeInMiB", values[0]); long arraySizeInBytes = this.RoundOffToNearest512Multiple(double.Parse(values[0]) * 1024 * 1024) * 512; - 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)); + var metadata = new Dictionary(); + + metadata.Add("StrideSizeInBytes", strideSize); + metadata.Add("ArraySize", this.ArraySizeWithUnit(arraySizeInBytes)); + metadata.Add("ArraySizeInBytes", arraySizeInBytes); + + 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)); } } @@ -65,7 +68,7 @@ private long RoundOffToNearest512Multiple(double number) return (long)Math.Round(number / 512.0); } - private string MetricNameSuffix(double bytes) + private string ArraySizeWithUnit(double bytes) { if (bytes >= 1024 * 1024) { @@ -79,7 +82,6 @@ private string MetricNameSuffix(double bytes) { return $"{bytes}_B"; } - } } } From 5f5ce7fef18d37e293fd7544fe180fba9a4dd807 Mon Sep 17 00:00:00 2001 From: Deepanshu Vaid Date: Wed, 18 Feb 2026 10:59:20 +0530 Subject: [PATCH 4/5] Adding LmBench executor --- .../LMbench/LMbenchExecutorTests.cs | 21 +++++++++++++++++++ .../LMbench/LMbenchExecutor.cs | 7 ++----- 2 files changed, 23 insertions(+), 5 deletions(-) diff --git a/src/VirtualClient/VirtualClient.Actions.UnitTests/LMbench/LMbenchExecutorTests.cs b/src/VirtualClient/VirtualClient.Actions.UnitTests/LMbench/LMbenchExecutorTests.cs index ddbbe558ec..fc246b6581 100644 --- a/src/VirtualClient/VirtualClient.Actions.UnitTests/LMbench/LMbenchExecutorTests.cs +++ b/src/VirtualClient/VirtualClient.Actions.UnitTests/LMbench/LMbenchExecutorTests.cs @@ -61,6 +61,27 @@ public async Task LMbenchExecutorExecutesTheExpectedWorkloadCommands() } } + [Test] + public async Task LMbenchExecutorExecutesTheExpectedCommandForLatMemRd() + { + this.Parameters[nameof(LMbenchExecutor.BinaryName)] = "lat_mem_rd"; + this.ProcessManager.OnProcessCreated = (process) => + { + string lmbenchOutput = System.IO.File.ReadAllText(this.Combine(LMbenchExecutorTests.Examples, "latmemrd_example_results.txt")); + process.StandardOutput.Append(lmbenchOutput); + }; + using (TestLMbenchExecutor lmbenchExecutor = new TestLMbenchExecutor(this.Dependencies, this.Parameters)) + { + await lmbenchExecutor.ExecuteAsync(EventContext.None, CancellationToken.None); + + Assert.IsTrue(this.ProcessManager.CommandsExecuted( + $"sudo chmod -R 2777 \"{this.mockPackage.Path}/scripts\"", + $"make build CPPFLAGS=\"-I /usr/include/tirpc\"", + $"bash -c \"echo -e '\n\n\n\n\n\n\n\n\n\n\n\n\nnone' | make results\"", + $"make summary")); + } + } + [Test] public async Task LMbenchExecutorExecutesTheExpectedLMbenchBenchmarks() { diff --git a/src/VirtualClient/VirtualClient.Actions/LMbench/LMbenchExecutor.cs b/src/VirtualClient/VirtualClient.Actions/LMbench/LMbenchExecutor.cs index 1471f4d93a..e4f5795d98 100644 --- a/src/VirtualClient/VirtualClient.Actions/LMbench/LMbenchExecutor.cs +++ b/src/VirtualClient/VirtualClient.Actions/LMbench/LMbenchExecutor.cs @@ -177,7 +177,7 @@ protected override async Task ExecuteAsync(EventContext telemetryContext, Cancel IConvertible arraySize = null, strideSizeInBytes = null; metric.Metadata.TryGetValue("ArraySize", out arraySize); metric.Metadata.TryGetValue("StrideSizeInBytes", out strideSizeInBytes); - string scenario = $"StrideSize_{strideSizeInBytes}_B_ArraySize_{arraySize}"; + string scenario = $"StrideSize_{strideSizeInBytes ?? string.Empty}_B_ArraySize_{arraySize ?? string.Empty}"; this.CaptureMetric(metric, executeBinary, telemetryContext, $"LMBench\\{this.BinaryName}", scenario); } } @@ -339,10 +339,7 @@ private Task ExecuteWorkloadAsync(EventContext telemetryContext, CancellationTok foreach (Metric metric in metrics) { - IConvertible arraySize = null, strideSizeInBytes = null; - metric.Metadata.TryGetValue("ArraySize", out arraySize); - metric.Metadata.TryGetValue("StrideSizepInBytes", out strideSizeInBytes); - string scenario = this.Scenario; + string scenario = "Memory Benchmark"; this.CaptureMetric(metric, process, telemetryContext, $"LMBench", scenario); } } From f25c6554e0358dbf10b27ffe021fc15d363eb67d Mon Sep 17 00:00:00 2001 From: Deepanshu Vaid Date: Fri, 20 Feb 2026 00:01:14 +0530 Subject: [PATCH 5/5] Fixing unit tests --- .../LMbench/LMbenchExecutorTests.cs | 5 ++--- .../LMbench/LatMemRdMetricsParserTests.cs | 8 ++++---- 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/src/VirtualClient/VirtualClient.Actions.UnitTests/LMbench/LMbenchExecutorTests.cs b/src/VirtualClient/VirtualClient.Actions.UnitTests/LMbench/LMbenchExecutorTests.cs index fc246b6581..5ef92c4c10 100644 --- a/src/VirtualClient/VirtualClient.Actions.UnitTests/LMbench/LMbenchExecutorTests.cs +++ b/src/VirtualClient/VirtualClient.Actions.UnitTests/LMbench/LMbenchExecutorTests.cs @@ -75,10 +75,9 @@ public async Task LMbenchExecutorExecutesTheExpectedCommandForLatMemRd() await lmbenchExecutor.ExecuteAsync(EventContext.None, CancellationToken.None); Assert.IsTrue(this.ProcessManager.CommandsExecuted( - $"sudo chmod -R 2777 \"{this.mockPackage.Path}/scripts\"", + $"sudo chmod -R 2777 \"/home/user/tools/VirtualClient/packages/lmbench/scripts\"", $"make build CPPFLAGS=\"-I /usr/include/tirpc\"", - $"bash -c \"echo -e '\n\n\n\n\n\n\n\n\n\n\n\n\nnone' | make results\"", - $"make summary")); + $"/home/user/tools/VirtualClient/packages/lmbench/bin/x86_64-Linux/lat_mem_rd")); } } diff --git a/src/VirtualClient/VirtualClient.Actions.UnitTests/LMbench/LatMemRdMetricsParserTests.cs b/src/VirtualClient/VirtualClient.Actions.UnitTests/LMbench/LatMemRdMetricsParserTests.cs index 3fdae8c733..6acfc8795b 100644 --- a/src/VirtualClient/VirtualClient.Actions.UnitTests/LMbench/LatMemRdMetricsParserTests.cs +++ b/src/VirtualClient/VirtualClient.Actions.UnitTests/LMbench/LatMemRdMetricsParserTests.cs @@ -37,10 +37,10 @@ public void LMbenchMetricsParserCapturesTheExpectedMetrics_1() IList metrics = parser.Parse(); Assert.IsTrue(metrics.Count == 54); - Assert.IsNotNull(metrics.FirstOrDefault(m => m.Name == "Latency_StrideBytes_64_Array_512_B" && m.Value == 1.438)); - Assert.IsNotNull(metrics.FirstOrDefault(m => m.Name == "Latency_StrideBytes_64_Array_1_KiB" && m.Value == 1.438)); - Assert.IsNotNull(metrics.FirstOrDefault(m => m.Name == "Latency_StrideBytes_32_Array_768_KiB" && m.Value == 1.506)); - Assert.IsNotNull(metrics.FirstOrDefault(m => m.Name == "Latency_StrideBytes_32_Array_32_MiB" && m.Value == 1.612)); + Assert.IsNotNull(metrics.FirstOrDefault(m => m.Name == "Latency" && m.Value == 1.438)); + Assert.IsNotNull(metrics.FirstOrDefault(m => m.Name == "Latency" && m.Value == 1.438)); + Assert.IsNotNull(metrics.FirstOrDefault(m => m.Name == "Latency" && m.Value == 1.506)); + Assert.IsNotNull(metrics.FirstOrDefault(m => m.Name == "Latency" && m.Value == 1.612)); } } } \ No newline at end of file