Repository navigation
Closed
Labels
PGOPriority:2Work that is important, but not critical for the releaseWork that is important, but not critical for the releasearch-x64area-CodeGen-coreclrCLR JIT compiler in src/coreclr/src/jit and related components such as SuperPMICLR JIT compiler in src/coreclr/src/jit and related components such as SuperPMIos-linuxLinux OS (any supported distro)Linux OS (any supported distro)runtime-coreclrspecific to the CoreCLR runtimespecific to the CoreCLR runtimetenet-performancePerformance related issuePerformance related issuetenet-performance-benchmarksIssue from performance benchmarkIssue from performance benchmark
Milestone
Description
Run Information
| Name | Value |
|---|---|
| Architecture | x64 |
| OS | ubuntu 22.04 |
| Queue | TigerUbuntu |
| Baseline | e4fbdb907bb187d7b5ba0668a84347c1058e3219 |
| Compare | 34bf55cd6448b3a19288623dca087151efe00367 |
| Diff | Diff |
| Configs | CompilationMode:tiered, RunKind:micro |
Regressions in LinqBenchmarks
| Benchmark | Baseline | Test | Test/Base | Test Quality | Edge Detector | Baseline IR | Compare IR | IR Ratio |
|---|---|---|---|---|---|---|---|---|
| 60.98 ms | 70.11 ms | 1.15 | 0.09 | True | ||||
| 58.93 ms | 69.51 ms | 1.18 | 0.07 | True |
Repro
General Docs link: https://github.com/dotnet/performance/blob/main/docs/benchmarking-workflow-dotnet-runtime.md
git clone https://github.com/dotnet/performance.git
python3 .\performance\scripts\benchmarks_ci.py -f net8.0 --filter 'LinqBenchmarks*'Details
Payloads
LinqBenchmarks.Order00LinqQueryX
ETL Files
Histogram
JIT Disasms
LinqBenchmarks.Order00LinqMethodX
ETL Files
Histogram
JIT Disasms
Docs
Profiling workflow for dotnet/runtime repository
Benchmarking workflow for dotnet/runtime repository
Run Information
| Name | Value |
|---|---|
| Architecture | x64 |
| OS | ubuntu 22.04 |
| Queue | TigerUbuntu |
| Baseline | e4fbdb907bb187d7b5ba0668a84347c1058e3219 |
| Compare | 34bf55cd6448b3a19288623dca087151efe00367 |
| Diff | Diff |
| Configs | CompilationMode:tiered, RunKind:micro |
Regressions in System.Linq.Tests.Perf_Enumerable
| Benchmark | Baseline | Test | Test/Base | Test Quality | Edge Detector | Baseline IR | Compare IR | IR Ratio |
|---|---|---|---|---|---|---|---|---|
| 216.78 ns | 259.35 ns | 1.20 | 0.11 | True |
Repro
General Docs link: https://github.com/dotnet/performance/blob/main/docs/benchmarking-workflow-dotnet-runtime.md
git clone https://github.com/dotnet/performance.git
python3 .\performance\scripts\benchmarks_ci.py -f net8.0 --filter 'System.Linq.Tests.Perf_Enumerable*'Details
Payloads
System.Linq.Tests.Perf_Enumerable.SingleWithPredicate_LastElementMatches(input: List)
ETL Files
Histogram
JIT Disasms
Docs
Profiling workflow for dotnet/runtime repository
Benchmarking workflow for dotnet/runtime repository
Metadata
Metadata
Assignees
Labels
PGOPriority:2Work that is important, but not critical for the releaseWork that is important, but not critical for the releasearch-x64area-CodeGen-coreclrCLR JIT compiler in src/coreclr/src/jit and related components such as SuperPMICLR JIT compiler in src/coreclr/src/jit and related components such as SuperPMIos-linuxLinux OS (any supported distro)Linux OS (any supported distro)runtime-coreclrspecific to the CoreCLR runtimespecific to the CoreCLR runtimetenet-performancePerformance related issuePerformance related issuetenet-performance-benchmarksIssue from performance benchmarkIssue from performance benchmark



Activity
cincuranet commentedon Nov 7, 2023
Likely caused by #94247.
cincuranet commentedon Nov 7, 2023
More:
Improvements:
2 remaining items
AndyAyersMS commentedon Jul 27, 2024
Collated Reports
1.16
1.19
1.18
1.15
1.12
1.11
1.11
1.07
1.20
0.91
AndyAyersMS commentedon Aug 8, 2024
LinqBenchmarks.Order00LinqQueryX
Regression has persisted... mostly on linux
AndyAyersMS commentedon Aug 8, 2024
Can repro locally. Tried diffing vs latest main but things have changed quite a bit, so will look at the diffs wrt the narrower range above.
AndyAyersMS commentedon Aug 9, 2024
Morphing in RPO causes a struct local to be marked as exposed before we see a block copy so we change our copy expansion strategy from field by field to block.
base codegen
diff codegen
Looks like the latter incurs a store-forwarding stall (likely on the
esiload). This is on linux WSL2, so I can't easily attribute samples to offsets. Will see if I can run this natively somewhere.@jakobbotsch this seems similar to the ldp issue, wonder if we should try something similar here. But late mitigation would be awkward (recommendation is to do a wider aligned load, and extract the part needed).
jakobbotsch commentedon Aug 9, 2024
Similar case: #96524 (comment)
If we handle one it would be nice to see if we can handle both cases.
The stall here is likely on one of the
xmmloads, I'd guess. It would probably be simple enough to just add the similar kind of heuristic in block morphing when determining if we should use the block copy for DNER locals. We would need to build loops I think, but that shouldn't be too expensive.AndyAyersMS commentedon Aug 12, 2024
Yeah, it could be the stall is earlier -- we have narrow stores and then a wide load:
AndyAyersMS commentedon Aug 13, 2024
Fixing this is probably too ambitious for .NET 9 at this point, so moving to 10.0.
AndyAyersMS commentedon Apr 29, 2025
The Linq benchmarks have since improved dramatically (via 34545d7) so not clear if they are still suffering from this.
Other benchmarks also seem to be improved. So will close.