Speed up Matrix4x4.CreateScale - #79172

Merged
EgorBo merged 1 commit into
dotnet:mainfrom
SingleAccretion:Speed-Up-Matrix4x4-CreateScale
Dec 5, 2022
Merged

Speed up Matrix4x4.CreateScale#79172
EgorBo merged 1 commit into
dotnet:mainfrom
SingleAccretion:Speed-Up-Matrix4x4-CreateScale

Conversation

@SingleAccretion

Copy link
Copy Markdown
Contributor

In #76491 the Jit became a little more eager to optimize code using vectors as a whole. Unfortunately, this regressed Matrix4x4.CreateScale on some platforms because code for it is written in a way that favors promotion over whole-register access.

This change fixes the regression by using style that is more in line with what the Jit expects of vectors. It also optimizes related overloads by avoiding the relatively expensive get_Identity property call (that is not even inlined due to loading a value type field).

Linux x64 benchmark results:

MethodJobToolchainMeanErrorStdDevMedianMinMaxRatioRatioSDAllocatedAlloc Ratio
CreateScaleFromVectorBenchmarkJob-AFMBXBRoot/corerun12.575 ns0.1031 ns0.0861 ns12.555 ns12.452 ns12.770 ns0.740.01-NA
CreateScaleFromVectorBenchmarkJob-KPUHXS/crb/corerun16.988 ns0.1283 ns0.1138 ns16.959 ns16.789 ns17.189 ns1.000.00-NA
CreateScaleFromVectorWithCenterBenchmarkJob-AFMBXBRoot/corerun9.548 ns0.0628 ns0.0588 ns9.529 ns9.476 ns9.663 ns0.440.02-NA
CreateScaleFromVectorWithCenterBenchmarkJob-KPUHXS/crb/corerun21.963 ns0.9062 ns1.0435 ns21.291 ns21.155 ns24.310 ns1.000.00-NA
CreateScaleFromScalarBenchmarkJob-AFMBXBRoot/corerun9.321 ns0.0701 ns0.0655 ns9.329 ns9.207 ns9.442 ns0.540.00-NA
CreateScaleFromScalarBenchmarkJob-KPUHXS/crb/corerun17.138 ns0.0886 ns0.0828 ns17.154 ns16.954 ns17.255 ns1.000.00-NA
CreateScaleFromScalarWithCenterBenchmarkJob-AFMBXBRoot/corerun12.807 ns0.1044 ns0.0977 ns12.789 ns12.689 ns12.999 ns0.740.01-NA
CreateScaleFromScalarWithCenterBenchmarkJob-KPUHXS/crb/corerun17.203 ns0.0963 ns0.0901 ns17.216 ns16.980 ns17.342 ns1.000.00-NA
CreateScaleFromScalarXYZBenchmarkJob-AFMBXBRoot/corerun9.454 ns0.0688 ns0.0609 ns9.433 ns9.389 ns9.577 ns0.460.00-NA
CreateScaleFromScalarXYZBenchmarkJob-KPUHXS/crb/corerun20.481 ns0.1567 ns0.1466 ns20.431 ns20.296 ns20.769 ns1.000.00-NA
CreateScaleFromScalarXYZWithCenterBenchmarkJob-AFMBXBRoot/corerun9.434 ns0.0380 ns0.0297 ns9.438 ns9.384 ns9.477 ns0.550.00-NA
CreateScaleFromScalarXYZWithCenterBenchmarkJob-KPUHXS/crb/corerun17.160 ns0.1791 ns0.1588 ns17.171 ns16.901 ns17.433 ns1.000.00-NA

Where Root/corerun is this change and /crb/corerun is main.

Fixes#78977.

@ghostghost added area-CodeGen-coreclr CLR JIT compiler in src/coreclr/src/jit and related components such as SuperPMI community-contribution Indicates that the PR has been added by a community member labels Dec 2, 2022
@ghost

ghost commented Dec 2, 2022

Copy link
Copy Markdown

Tagging subscribers to this area: @JulieLeeMSFT, @jakobbotsch
See info in area-owners.md if you want to be subscribed.

Issue Details

In #76491 the Jit became a little more eager to optimize code using vectors as a whole. Unfortunately, this regressed Matrix4x4.CreateScale on some platforms because code for it is written in a way that favors promotion over whole-register access.

This change fixes the regression by using style that is more in line with what the Jit expects of vectors. It also optimizes related overloads by avoiding the relatively expensive get_Identity property call (that is not even inlined due to loading a value type field).

Linux x64 benchmark results:

MethodJobToolchainMeanErrorStdDevMedianMinMaxRatioRatioSDAllocatedAlloc Ratio
CreateScaleFromVectorBenchmarkJob-AFMBXBRoot/corerun12.575 ns0.1031 ns0.0861 ns12.555 ns12.452 ns12.770 ns0.740.01-NA
CreateScaleFromVectorBenchmarkJob-KPUHXS/crb/corerun16.988 ns0.1283 ns0.1138 ns16.959 ns16.789 ns17.189 ns1.000.00-NA
CreateScaleFromVectorWithCenterBenchmarkJob-AFMBXBRoot/corerun9.548 ns0.0628 ns0.0588 ns9.529 ns9.476 ns9.663 ns0.440.02-NA
CreateScaleFromVectorWithCenterBenchmarkJob-KPUHXS/crb/corerun21.963 ns0.9062 ns1.0435 ns21.291 ns21.155 ns24.310 ns1.000.00-NA
CreateScaleFromScalarBenchmarkJob-AFMBXBRoot/corerun9.321 ns0.0701 ns0.0655 ns9.329 ns9.207 ns9.442 ns0.540.00-NA
CreateScaleFromScalarBenchmarkJob-KPUHXS/crb/corerun17.138 ns0.0886 ns0.0828 ns17.154 ns16.954 ns17.255 ns1.000.00-NA
CreateScaleFromScalarWithCenterBenchmarkJob-AFMBXBRoot/corerun12.807 ns0.1044 ns0.0977 ns12.789 ns12.689 ns12.999 ns0.740.01-NA
CreateScaleFromScalarWithCenterBenchmarkJob-KPUHXS/crb/corerun17.203 ns0.0963 ns0.0901 ns17.216 ns16.980 ns17.342 ns1.000.00-NA
CreateScaleFromScalarXYZBenchmarkJob-AFMBXBRoot/corerun9.454 ns0.0688 ns0.0609 ns9.433 ns9.389 ns9.577 ns0.460.00-NA
CreateScaleFromScalarXYZBenchmarkJob-KPUHXS/crb/corerun20.481 ns0.1567 ns0.1466 ns20.431 ns20.296 ns20.769 ns1.000.00-NA
CreateScaleFromScalarXYZWithCenterBenchmarkJob-AFMBXBRoot/corerun9.434 ns0.0380 ns0.0297 ns9.438 ns9.384 ns9.477 ns0.550.00-NA
CreateScaleFromScalarXYZWithCenterBenchmarkJob-KPUHXS/crb/corerun17.160 ns0.1791 ns0.1588 ns17.171 ns16.901 ns17.433 ns1.000.00-NA

Where Root/corerun is this change and /crb/corerun is main.

Fixes #78977.

Author:SingleAccretion
Assignees:-
Labels:

area-CodeGen-coreclr

Milestone:-

@SingleAccretionSingleAccretion added area-System.Numerics and removed area-CodeGen-coreclr CLR JIT compiler in src/coreclr/src/jit and related components such as SuperPMI labels Dec 2, 2022
@SingleAccretion
SingleAccretion marked this pull request as ready for review December 2, 2022 23:11
@ghost

ghost commented Dec 2, 2022

Copy link
Copy Markdown

Tagging subscribers to this area: @dotnet/area-system-numerics
See info in area-owners.md if you want to be subscribed.

Issue Details

In #76491 the Jit became a little more eager to optimize code using vectors as a whole. Unfortunately, this regressed Matrix4x4.CreateScale on some platforms because code for it is written in a way that favors promotion over whole-register access.

This change fixes the regression by using style that is more in line with what the Jit expects of vectors. It also optimizes related overloads by avoiding the relatively expensive get_Identity property call (that is not even inlined due to loading a value type field).

Linux x64 benchmark results:

MethodJobToolchainMeanErrorStdDevMedianMinMaxRatioRatioSDAllocatedAlloc Ratio
CreateScaleFromVectorBenchmarkJob-AFMBXBRoot/corerun12.575 ns0.1031 ns0.0861 ns12.555 ns12.452 ns12.770 ns0.740.01-NA
CreateScaleFromVectorBenchmarkJob-KPUHXS/crb/corerun16.988 ns0.1283 ns0.1138 ns16.959 ns16.789 ns17.189 ns1.000.00-NA
CreateScaleFromVectorWithCenterBenchmarkJob-AFMBXBRoot/corerun9.548 ns0.0628 ns0.0588 ns9.529 ns9.476 ns9.663 ns0.440.02-NA
CreateScaleFromVectorWithCenterBenchmarkJob-KPUHXS/crb/corerun21.963 ns0.9062 ns1.0435 ns21.291 ns21.155 ns24.310 ns1.000.00-NA
CreateScaleFromScalarBenchmarkJob-AFMBXBRoot/corerun9.321 ns0.0701 ns0.0655 ns9.329 ns9.207 ns9.442 ns0.540.00-NA
CreateScaleFromScalarBenchmarkJob-KPUHXS/crb/corerun17.138 ns0.0886 ns0.0828 ns17.154 ns16.954 ns17.255 ns1.000.00-NA
CreateScaleFromScalarWithCenterBenchmarkJob-AFMBXBRoot/corerun12.807 ns0.1044 ns0.0977 ns12.789 ns12.689 ns12.999 ns0.740.01-NA
CreateScaleFromScalarWithCenterBenchmarkJob-KPUHXS/crb/corerun17.203 ns0.0963 ns0.0901 ns17.216 ns16.980 ns17.342 ns1.000.00-NA
CreateScaleFromScalarXYZBenchmarkJob-AFMBXBRoot/corerun9.454 ns0.0688 ns0.0609 ns9.433 ns9.389 ns9.577 ns0.460.00-NA
CreateScaleFromScalarXYZBenchmarkJob-KPUHXS/crb/corerun20.481 ns0.1567 ns0.1466 ns20.431 ns20.296 ns20.769 ns1.000.00-NA
CreateScaleFromScalarXYZWithCenterBenchmarkJob-AFMBXBRoot/corerun9.434 ns0.0380 ns0.0297 ns9.438 ns9.384 ns9.477 ns0.550.00-NA
CreateScaleFromScalarXYZWithCenterBenchmarkJob-KPUHXS/crb/corerun17.160 ns0.1791 ns0.1588 ns17.171 ns16.901 ns17.433 ns1.000.00-NA

Where Root/corerun is this change and /crb/corerun is main.

Fixes #78977.

Author:SingleAccretion
Assignees:-
Labels:

area-System.Numerics, community-contribution

Milestone:-

@EgorBo
EgorBo merged commit c782569 into dotnet:mainDec 5, 2022
@EgorBo

Copy link
Copy Markdown
Member

Thanks for the workaround!

@SingleAccretion
SingleAccretion deleted the Speed-Up-Matrix4x4-CreateScale branch December 7, 2022 17:27
@ghostghost locked as resolved and limited conversation to collaborators Jan 6, 2023
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

area-System.Numericscommunity-contributionIndicates that the PR has been added by a community member

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Regressions in System.Numerics.Tests.Perf_Matrix4x4

3 participants

@SingleAccretion@EgorBo@dakersnar
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Speed up Matrix4x4.CreateScale - #79172

Merged
EgorBo merged 1 commit into
dotnet:mainfrom
SingleAccretion:Speed-Up-Matrix4x4-CreateScale
Dec 5, 2022
Merged

Speed up Matrix4x4.CreateScale#79172
EgorBo merged 1 commit into
dotnet:mainfrom
SingleAccretion:Speed-Up-Matrix4x4-CreateScale

Conversation

@SingleAccretion

Copy link
Copy Markdown
Contributor

In #76491 the Jit became a little more eager to optimize code using vectors as a whole. Unfortunately, this regressed Matrix4x4.CreateScale on some platforms because code for it is written in a way that favors promotion over whole-register access.

This change fixes the regression by using style that is more in line with what the Jit expects of vectors. It also optimizes related overloads by avoiding the relatively expensive get_Identity property call (that is not even inlined due to loading a value type field).

Linux x64 benchmark results:

MethodJobToolchainMeanErrorStdDevMedianMinMaxRatioRatioSDAllocatedAlloc Ratio
CreateScaleFromVectorBenchmarkJob-AFMBXBRoot/corerun12.575 ns0.1031 ns0.0861 ns12.555 ns12.452 ns12.770 ns0.740.01-NA
CreateScaleFromVectorBenchmarkJob-KPUHXS/crb/corerun16.988 ns0.1283 ns0.1138 ns16.959 ns16.789 ns17.189 ns1.000.00-NA
CreateScaleFromVectorWithCenterBenchmarkJob-AFMBXBRoot/corerun9.548 ns0.0628 ns0.0588 ns9.529 ns9.476 ns9.663 ns0.440.02-NA
CreateScaleFromVectorWithCenterBenchmarkJob-KPUHXS/crb/corerun21.963 ns0.9062 ns1.0435 ns21.291 ns21.155 ns24.310 ns1.000.00-NA
CreateScaleFromScalarBenchmarkJob-AFMBXBRoot/corerun9.321 ns0.0701 ns0.0655 ns9.329 ns9.207 ns9.442 ns0.540.00-NA
CreateScaleFromScalarBenchmarkJob-KPUHXS/crb/corerun17.138 ns0.0886 ns0.0828 ns17.154 ns16.954 ns17.255 ns1.000.00-NA
CreateScaleFromScalarWithCenterBenchmarkJob-AFMBXBRoot/corerun12.807 ns0.1044 ns0.0977 ns12.789 ns12.689 ns12.999 ns0.740.01-NA
CreateScaleFromScalarWithCenterBenchmarkJob-KPUHXS/crb/corerun17.203 ns0.0963 ns0.0901 ns17.216 ns16.980 ns17.342 ns1.000.00-NA
CreateScaleFromScalarXYZBenchmarkJob-AFMBXBRoot/corerun9.454 ns0.0688 ns0.0609 ns9.433 ns9.389 ns9.577 ns0.460.00-NA
CreateScaleFromScalarXYZBenchmarkJob-KPUHXS/crb/corerun20.481 ns0.1567 ns0.1466 ns20.431 ns20.296 ns20.769 ns1.000.00-NA
CreateScaleFromScalarXYZWithCenterBenchmarkJob-AFMBXBRoot/corerun9.434 ns0.0380 ns0.0297 ns9.438 ns9.384 ns9.477 ns0.550.00-NA
CreateScaleFromScalarXYZWithCenterBenchmarkJob-KPUHXS/crb/corerun17.160 ns0.1791 ns0.1588 ns17.171 ns16.901 ns17.433 ns1.000.00-NA

Where Root/corerun is this change and /crb/corerun is main.

Fixes#78977.

@ghostghost added area-CodeGen-coreclr CLR JIT compiler in src/coreclr/src/jit and related components such as SuperPMI community-contribution Indicates that the PR has been added by a community member labels Dec 2, 2022
@ghost

ghost commented Dec 2, 2022

Copy link
Copy Markdown

Tagging subscribers to this area: @JulieLeeMSFT, @jakobbotsch
See info in area-owners.md if you want to be subscribed.

Issue Details

In #76491 the Jit became a little more eager to optimize code using vectors as a whole. Unfortunately, this regressed Matrix4x4.CreateScale on some platforms because code for it is written in a way that favors promotion over whole-register access.

This change fixes the regression by using style that is more in line with what the Jit expects of vectors. It also optimizes related overloads by avoiding the relatively expensive get_Identity property call (that is not even inlined due to loading a value type field).

Linux x64 benchmark results:

MethodJobToolchainMeanErrorStdDevMedianMinMaxRatioRatioSDAllocatedAlloc Ratio
CreateScaleFromVectorBenchmarkJob-AFMBXBRoot/corerun12.575 ns0.1031 ns0.0861 ns12.555 ns12.452 ns12.770 ns0.740.01-NA
CreateScaleFromVectorBenchmarkJob-KPUHXS/crb/corerun16.988 ns0.1283 ns0.1138 ns16.959 ns16.789 ns17.189 ns1.000.00-NA
CreateScaleFromVectorWithCenterBenchmarkJob-AFMBXBRoot/corerun9.548 ns0.0628 ns0.0588 ns9.529 ns9.476 ns9.663 ns0.440.02-NA
CreateScaleFromVectorWithCenterBenchmarkJob-KPUHXS/crb/corerun21.963 ns0.9062 ns1.0435 ns21.291 ns21.155 ns24.310 ns1.000.00-NA
CreateScaleFromScalarBenchmarkJob-AFMBXBRoot/corerun9.321 ns0.0701 ns0.0655 ns9.329 ns9.207 ns9.442 ns0.540.00-NA
CreateScaleFromScalarBenchmarkJob-KPUHXS/crb/corerun17.138 ns0.0886 ns0.0828 ns17.154 ns16.954 ns17.255 ns1.000.00-NA
CreateScaleFromScalarWithCenterBenchmarkJob-AFMBXBRoot/corerun12.807 ns0.1044 ns0.0977 ns12.789 ns12.689 ns12.999 ns0.740.01-NA
CreateScaleFromScalarWithCenterBenchmarkJob-KPUHXS/crb/corerun17.203 ns0.0963 ns0.0901 ns17.216 ns16.980 ns17.342 ns1.000.00-NA
CreateScaleFromScalarXYZBenchmarkJob-AFMBXBRoot/corerun9.454 ns0.0688 ns0.0609 ns9.433 ns9.389 ns9.577 ns0.460.00-NA
CreateScaleFromScalarXYZBenchmarkJob-KPUHXS/crb/corerun20.481 ns0.1567 ns0.1466 ns20.431 ns20.296 ns20.769 ns1.000.00-NA
CreateScaleFromScalarXYZWithCenterBenchmarkJob-AFMBXBRoot/corerun9.434 ns0.0380 ns0.0297 ns9.438 ns9.384 ns9.477 ns0.550.00-NA
CreateScaleFromScalarXYZWithCenterBenchmarkJob-KPUHXS/crb/corerun17.160 ns0.1791 ns0.1588 ns17.171 ns16.901 ns17.433 ns1.000.00-NA

Where Root/corerun is this change and /crb/corerun is main.

Fixes #78977.

Author:SingleAccretion
Assignees:-
Labels:

area-CodeGen-coreclr

Milestone:-

@SingleAccretionSingleAccretion added area-System.Numerics and removed area-CodeGen-coreclr CLR JIT compiler in src/coreclr/src/jit and related components such as SuperPMI labels Dec 2, 2022
@SingleAccretion
SingleAccretion marked this pull request as ready for review December 2, 2022 23:11
@ghost

ghost commented Dec 2, 2022

Copy link
Copy Markdown

Tagging subscribers to this area: @dotnet/area-system-numerics
See info in area-owners.md if you want to be subscribed.

Issue Details

In #76491 the Jit became a little more eager to optimize code using vectors as a whole. Unfortunately, this regressed Matrix4x4.CreateScale on some platforms because code for it is written in a way that favors promotion over whole-register access.

This change fixes the regression by using style that is more in line with what the Jit expects of vectors. It also optimizes related overloads by avoiding the relatively expensive get_Identity property call (that is not even inlined due to loading a value type field).

Linux x64 benchmark results:

MethodJobToolchainMeanErrorStdDevMedianMinMaxRatioRatioSDAllocatedAlloc Ratio
CreateScaleFromVectorBenchmarkJob-AFMBXBRoot/corerun12.575 ns0.1031 ns0.0861 ns12.555 ns12.452 ns12.770 ns0.740.01-NA
CreateScaleFromVectorBenchmarkJob-KPUHXS/crb/corerun16.988 ns0.1283 ns0.1138 ns16.959 ns16.789 ns17.189 ns1.000.00-NA
CreateScaleFromVectorWithCenterBenchmarkJob-AFMBXBRoot/corerun9.548 ns0.0628 ns0.0588 ns9.529 ns9.476 ns9.663 ns0.440.02-NA
CreateScaleFromVectorWithCenterBenchmarkJob-KPUHXS/crb/corerun21.963 ns0.9062 ns1.0435 ns21.291 ns21.155 ns24.310 ns1.000.00-NA
CreateScaleFromScalarBenchmarkJob-AFMBXBRoot/corerun9.321 ns0.0701 ns0.0655 ns9.329 ns9.207 ns9.442 ns0.540.00-NA
CreateScaleFromScalarBenchmarkJob-KPUHXS/crb/corerun17.138 ns0.0886 ns0.0828 ns17.154 ns16.954 ns17.255 ns1.000.00-NA
CreateScaleFromScalarWithCenterBenchmarkJob-AFMBXBRoot/corerun12.807 ns0.1044 ns0.0977 ns12.789 ns12.689 ns12.999 ns0.740.01-NA
CreateScaleFromScalarWithCenterBenchmarkJob-KPUHXS/crb/corerun17.203 ns0.0963 ns0.0901 ns17.216 ns16.980 ns17.342 ns1.000.00-NA
CreateScaleFromScalarXYZBenchmarkJob-AFMBXBRoot/corerun9.454 ns0.0688 ns0.0609 ns9.433 ns9.389 ns9.577 ns0.460.00-NA
CreateScaleFromScalarXYZBenchmarkJob-KPUHXS/crb/corerun20.481 ns0.1567 ns0.1466 ns20.431 ns20.296 ns20.769 ns1.000.00-NA
CreateScaleFromScalarXYZWithCenterBenchmarkJob-AFMBXBRoot/corerun9.434 ns0.0380 ns0.0297 ns9.438 ns9.384 ns9.477 ns0.550.00-NA
CreateScaleFromScalarXYZWithCenterBenchmarkJob-KPUHXS/crb/corerun17.160 ns0.1791 ns0.1588 ns17.171 ns16.901 ns17.433 ns1.000.00-NA

Where Root/corerun is this change and /crb/corerun is main.

Fixes #78977.

Author:SingleAccretion
Assignees:-
Labels:

area-System.Numerics, community-contribution

Milestone:-

@EgorBo
EgorBo merged commit c782569 into dotnet:mainDec 5, 2022
@EgorBo

Copy link
Copy Markdown
Member

Thanks for the workaround!

@SingleAccretion
SingleAccretion deleted the Speed-Up-Matrix4x4-CreateScale branch December 7, 2022 17:27
@ghostghost locked as resolved and limited conversation to collaborators Jan 6, 2023
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

area-System.Numericscommunity-contributionIndicates that the PR has been added by a community member

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Regressions in System.Numerics.Tests.Perf_Matrix4x4

3 participants

@SingleAccretion@EgorBo@dakersnar
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Speed up Matrix4x4.CreateScale - #79172

Merged
EgorBo merged 1 commit into
dotnet:mainfrom
SingleAccretion:Speed-Up-Matrix4x4-CreateScale
Dec 5, 2022
Merged

Speed up Matrix4x4.CreateScale#79172
EgorBo merged 1 commit into
dotnet:mainfrom
SingleAccretion:Speed-Up-Matrix4x4-CreateScale

Conversation

@SingleAccretion

Copy link
Copy Markdown
Contributor

In #76491 the Jit became a little more eager to optimize code using vectors as a whole. Unfortunately, this regressed Matrix4x4.CreateScale on some platforms because code for it is written in a way that favors promotion over whole-register access.

This change fixes the regression by using style that is more in line with what the Jit expects of vectors. It also optimizes related overloads by avoiding the relatively expensive get_Identity property call (that is not even inlined due to loading a value type field).

Linux x64 benchmark results:

MethodJobToolchainMeanErrorStdDevMedianMinMaxRatioRatioSDAllocatedAlloc Ratio
CreateScaleFromVectorBenchmarkJob-AFMBXBRoot/corerun12.575 ns0.1031 ns0.0861 ns12.555 ns12.452 ns12.770 ns0.740.01-NA
CreateScaleFromVectorBenchmarkJob-KPUHXS/crb/corerun16.988 ns0.1283 ns0.1138 ns16.959 ns16.789 ns17.189 ns1.000.00-NA
CreateScaleFromVectorWithCenterBenchmarkJob-AFMBXBRoot/corerun9.548 ns0.0628 ns0.0588 ns9.529 ns9.476 ns9.663 ns0.440.02-NA
CreateScaleFromVectorWithCenterBenchmarkJob-KPUHXS/crb/corerun21.963 ns0.9062 ns1.0435 ns21.291 ns21.155 ns24.310 ns1.000.00-NA
CreateScaleFromScalarBenchmarkJob-AFMBXBRoot/corerun9.321 ns0.0701 ns0.0655 ns9.329 ns9.207 ns9.442 ns0.540.00-NA
CreateScaleFromScalarBenchmarkJob-KPUHXS/crb/corerun17.138 ns0.0886 ns0.0828 ns17.154 ns16.954 ns17.255 ns1.000.00-NA
CreateScaleFromScalarWithCenterBenchmarkJob-AFMBXBRoot/corerun12.807 ns0.1044 ns0.0977 ns12.789 ns12.689 ns12.999 ns0.740.01-NA
CreateScaleFromScalarWithCenterBenchmarkJob-KPUHXS/crb/corerun17.203 ns0.0963 ns0.0901 ns17.216 ns16.980 ns17.342 ns1.000.00-NA
CreateScaleFromScalarXYZBenchmarkJob-AFMBXBRoot/corerun9.454 ns0.0688 ns0.0609 ns9.433 ns9.389 ns9.577 ns0.460.00-NA
CreateScaleFromScalarXYZBenchmarkJob-KPUHXS/crb/corerun20.481 ns0.1567 ns0.1466 ns20.431 ns20.296 ns20.769 ns1.000.00-NA
CreateScaleFromScalarXYZWithCenterBenchmarkJob-AFMBXBRoot/corerun9.434 ns0.0380 ns0.0297 ns9.438 ns9.384 ns9.477 ns0.550.00-NA
CreateScaleFromScalarXYZWithCenterBenchmarkJob-KPUHXS/crb/corerun17.160 ns0.1791 ns0.1588 ns17.171 ns16.901 ns17.433 ns1.000.00-NA

Where Root/corerun is this change and /crb/corerun is main.

Fixes#78977.

@ghostghost added area-CodeGen-coreclr CLR JIT compiler in src/coreclr/src/jit and related components such as SuperPMI community-contribution Indicates that the PR has been added by a community member labels Dec 2, 2022
@ghost

ghost commented Dec 2, 2022

Copy link
Copy Markdown

Tagging subscribers to this area: @JulieLeeMSFT, @jakobbotsch
See info in area-owners.md if you want to be subscribed.

Issue Details

In #76491 the Jit became a little more eager to optimize code using vectors as a whole. Unfortunately, this regressed Matrix4x4.CreateScale on some platforms because code for it is written in a way that favors promotion over whole-register access.

This change fixes the regression by using style that is more in line with what the Jit expects of vectors. It also optimizes related overloads by avoiding the relatively expensive get_Identity property call (that is not even inlined due to loading a value type field).

Linux x64 benchmark results:

MethodJobToolchainMeanErrorStdDevMedianMinMaxRatioRatioSDAllocatedAlloc Ratio
CreateScaleFromVectorBenchmarkJob-AFMBXBRoot/corerun12.575 ns0.1031 ns0.0861 ns12.555 ns12.452 ns12.770 ns0.740.01-NA
CreateScaleFromVectorBenchmarkJob-KPUHXS/crb/corerun16.988 ns0.1283 ns0.1138 ns16.959 ns16.789 ns17.189 ns1.000.00-NA
CreateScaleFromVectorWithCenterBenchmarkJob-AFMBXBRoot/corerun9.548 ns0.0628 ns0.0588 ns9.529 ns9.476 ns9.663 ns0.440.02-NA
CreateScaleFromVectorWithCenterBenchmarkJob-KPUHXS/crb/corerun21.963 ns0.9062 ns1.0435 ns21.291 ns21.155 ns24.310 ns1.000.00-NA
CreateScaleFromScalarBenchmarkJob-AFMBXBRoot/corerun9.321 ns0.0701 ns0.0655 ns9.329 ns9.207 ns9.442 ns0.540.00-NA
CreateScaleFromScalarBenchmarkJob-KPUHXS/crb/corerun17.138 ns0.0886 ns0.0828 ns17.154 ns16.954 ns17.255 ns1.000.00-NA
CreateScaleFromScalarWithCenterBenchmarkJob-AFMBXBRoot/corerun12.807 ns0.1044 ns0.0977 ns12.789 ns12.689 ns12.999 ns0.740.01-NA
CreateScaleFromScalarWithCenterBenchmarkJob-KPUHXS/crb/corerun17.203 ns0.0963 ns0.0901 ns17.216 ns16.980 ns17.342 ns1.000.00-NA
CreateScaleFromScalarXYZBenchmarkJob-AFMBXBRoot/corerun9.454 ns0.0688 ns0.0609 ns9.433 ns9.389 ns9.577 ns0.460.00-NA
CreateScaleFromScalarXYZBenchmarkJob-KPUHXS/crb/corerun20.481 ns0.1567 ns0.1466 ns20.431 ns20.296 ns20.769 ns1.000.00-NA
CreateScaleFromScalarXYZWithCenterBenchmarkJob-AFMBXBRoot/corerun9.434 ns0.0380 ns0.0297 ns9.438 ns9.384 ns9.477 ns0.550.00-NA
CreateScaleFromScalarXYZWithCenterBenchmarkJob-KPUHXS/crb/corerun17.160 ns0.1791 ns0.1588 ns17.171 ns16.901 ns17.433 ns1.000.00-NA

Where Root/corerun is this change and /crb/corerun is main.

Fixes #78977.

Author:SingleAccretion
Assignees:-
Labels:

area-CodeGen-coreclr

Milestone:-

@SingleAccretionSingleAccretion added area-System.Numerics and removed area-CodeGen-coreclr CLR JIT compiler in src/coreclr/src/jit and related components such as SuperPMI labels Dec 2, 2022
@SingleAccretion
SingleAccretion marked this pull request as ready for review December 2, 2022 23:11
@ghost

ghost commented Dec 2, 2022

Copy link
Copy Markdown

Tagging subscribers to this area: @dotnet/area-system-numerics
See info in area-owners.md if you want to be subscribed.

Issue Details

In #76491 the Jit became a little more eager to optimize code using vectors as a whole. Unfortunately, this regressed Matrix4x4.CreateScale on some platforms because code for it is written in a way that favors promotion over whole-register access.

This change fixes the regression by using style that is more in line with what the Jit expects of vectors. It also optimizes related overloads by avoiding the relatively expensive get_Identity property call (that is not even inlined due to loading a value type field).

Linux x64 benchmark results:

MethodJobToolchainMeanErrorStdDevMedianMinMaxRatioRatioSDAllocatedAlloc Ratio
CreateScaleFromVectorBenchmarkJob-AFMBXBRoot/corerun12.575 ns0.1031 ns0.0861 ns12.555 ns12.452 ns12.770 ns0.740.01-NA
CreateScaleFromVectorBenchmarkJob-KPUHXS/crb/corerun16.988 ns0.1283 ns0.1138 ns16.959 ns16.789 ns17.189 ns1.000.00-NA
CreateScaleFromVectorWithCenterBenchmarkJob-AFMBXBRoot/corerun9.548 ns0.0628 ns0.0588 ns9.529 ns9.476 ns9.663 ns0.440.02-NA
CreateScaleFromVectorWithCenterBenchmarkJob-KPUHXS/crb/corerun21.963 ns0.9062 ns1.0435 ns21.291 ns21.155 ns24.310 ns1.000.00-NA
CreateScaleFromScalarBenchmarkJob-AFMBXBRoot/corerun9.321 ns0.0701 ns0.0655 ns9.329 ns9.207 ns9.442 ns0.540.00-NA
CreateScaleFromScalarBenchmarkJob-KPUHXS/crb/corerun17.138 ns0.0886 ns0.0828 ns17.154 ns16.954 ns17.255 ns1.000.00-NA
CreateScaleFromScalarWithCenterBenchmarkJob-AFMBXBRoot/corerun12.807 ns0.1044 ns0.0977 ns12.789 ns12.689 ns12.999 ns0.740.01-NA
CreateScaleFromScalarWithCenterBenchmarkJob-KPUHXS/crb/corerun17.203 ns0.0963 ns0.0901 ns17.216 ns16.980 ns17.342 ns1.000.00-NA
CreateScaleFromScalarXYZBenchmarkJob-AFMBXBRoot/corerun9.454 ns0.0688 ns0.0609 ns9.433 ns9.389 ns9.577 ns0.460.00-NA
CreateScaleFromScalarXYZBenchmarkJob-KPUHXS/crb/corerun20.481 ns0.1567 ns0.1466 ns20.431 ns20.296 ns20.769 ns1.000.00-NA
CreateScaleFromScalarXYZWithCenterBenchmarkJob-AFMBXBRoot/corerun9.434 ns0.0380 ns0.0297 ns9.438 ns9.384 ns9.477 ns0.550.00-NA
CreateScaleFromScalarXYZWithCenterBenchmarkJob-KPUHXS/crb/corerun17.160 ns0.1791 ns0.1588 ns17.171 ns16.901 ns17.433 ns1.000.00-NA

Where Root/corerun is this change and /crb/corerun is main.

Fixes #78977.

Author:SingleAccretion
Assignees:-
Labels:

area-System.Numerics, community-contribution

Milestone:-

@EgorBo
EgorBo merged commit c782569 into dotnet:mainDec 5, 2022
@EgorBo

Copy link
Copy Markdown
Member

Thanks for the workaround!

@SingleAccretion
SingleAccretion deleted the Speed-Up-Matrix4x4-CreateScale branch December 7, 2022 17:27
@ghostghost locked as resolved and limited conversation to collaborators Jan 6, 2023
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

area-System.Numericscommunity-contributionIndicates that the PR has been added by a community member

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Regressions in System.Numerics.Tests.Perf_Matrix4x4

3 participants

@SingleAccretion@EgorBo@dakersnar
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Speed up Matrix4x4.CreateScale - #79172

Merged
EgorBo merged 1 commit into
dotnet:mainfrom
SingleAccretion:Speed-Up-Matrix4x4-CreateScale
Dec 5, 2022
Merged

Speed up Matrix4x4.CreateScale#79172
EgorBo merged 1 commit into
dotnet:mainfrom
SingleAccretion:Speed-Up-Matrix4x4-CreateScale

Conversation

@SingleAccretion

Copy link
Copy Markdown
Contributor

In #76491 the Jit became a little more eager to optimize code using vectors as a whole. Unfortunately, this regressed Matrix4x4.CreateScale on some platforms because code for it is written in a way that favors promotion over whole-register access.

This change fixes the regression by using style that is more in line with what the Jit expects of vectors. It also optimizes related overloads by avoiding the relatively expensive get_Identity property call (that is not even inlined due to loading a value type field).

Linux x64 benchmark results:

MethodJobToolchainMeanErrorStdDevMedianMinMaxRatioRatioSDAllocatedAlloc Ratio
CreateScaleFromVectorBenchmarkJob-AFMBXBRoot/corerun12.575 ns0.1031 ns0.0861 ns12.555 ns12.452 ns12.770 ns0.740.01-NA
CreateScaleFromVectorBenchmarkJob-KPUHXS/crb/corerun16.988 ns0.1283 ns0.1138 ns16.959 ns16.789 ns17.189 ns1.000.00-NA
CreateScaleFromVectorWithCenterBenchmarkJob-AFMBXBRoot/corerun9.548 ns0.0628 ns0.0588 ns9.529 ns9.476 ns9.663 ns0.440.02-NA
CreateScaleFromVectorWithCenterBenchmarkJob-KPUHXS/crb/corerun21.963 ns0.9062 ns1.0435 ns21.291 ns21.155 ns24.310 ns1.000.00-NA
CreateScaleFromScalarBenchmarkJob-AFMBXBRoot/corerun9.321 ns0.0701 ns0.0655 ns9.329 ns9.207 ns9.442 ns0.540.00-NA
CreateScaleFromScalarBenchmarkJob-KPUHXS/crb/corerun17.138 ns0.0886 ns0.0828 ns17.154 ns16.954 ns17.255 ns1.000.00-NA
CreateScaleFromScalarWithCenterBenchmarkJob-AFMBXBRoot/corerun12.807 ns0.1044 ns0.0977 ns12.789 ns12.689 ns12.999 ns0.740.01-NA
CreateScaleFromScalarWithCenterBenchmarkJob-KPUHXS/crb/corerun17.203 ns0.0963 ns0.0901 ns17.216 ns16.980 ns17.342 ns1.000.00-NA
CreateScaleFromScalarXYZBenchmarkJob-AFMBXBRoot/corerun9.454 ns0.0688 ns0.0609 ns9.433 ns9.389 ns9.577 ns0.460.00-NA
CreateScaleFromScalarXYZBenchmarkJob-KPUHXS/crb/corerun20.481 ns0.1567 ns0.1466 ns20.431 ns20.296 ns20.769 ns1.000.00-NA
CreateScaleFromScalarXYZWithCenterBenchmarkJob-AFMBXBRoot/corerun9.434 ns0.0380 ns0.0297 ns9.438 ns9.384 ns9.477 ns0.550.00-NA
CreateScaleFromScalarXYZWithCenterBenchmarkJob-KPUHXS/crb/corerun17.160 ns0.1791 ns0.1588 ns17.171 ns16.901 ns17.433 ns1.000.00-NA

Where Root/corerun is this change and /crb/corerun is main.

Fixes#78977.

@ghostghost added area-CodeGen-coreclr CLR JIT compiler in src/coreclr/src/jit and related components such as SuperPMI community-contribution Indicates that the PR has been added by a community member labels Dec 2, 2022
@ghost

ghost commented Dec 2, 2022

Copy link
Copy Markdown

Tagging subscribers to this area: @JulieLeeMSFT, @jakobbotsch
See info in area-owners.md if you want to be subscribed.

Issue Details

In #76491 the Jit became a little more eager to optimize code using vectors as a whole. Unfortunately, this regressed Matrix4x4.CreateScale on some platforms because code for it is written in a way that favors promotion over whole-register access.

This change fixes the regression by using style that is more in line with what the Jit expects of vectors. It also optimizes related overloads by avoiding the relatively expensive get_Identity property call (that is not even inlined due to loading a value type field).

Linux x64 benchmark results:

MethodJobToolchainMeanErrorStdDevMedianMinMaxRatioRatioSDAllocatedAlloc Ratio
CreateScaleFromVectorBenchmarkJob-AFMBXBRoot/corerun12.575 ns0.1031 ns0.0861 ns12.555 ns12.452 ns12.770 ns0.740.01-NA
CreateScaleFromVectorBenchmarkJob-KPUHXS/crb/corerun16.988 ns0.1283 ns0.1138 ns16.959 ns16.789 ns17.189 ns1.000.00-NA
CreateScaleFromVectorWithCenterBenchmarkJob-AFMBXBRoot/corerun9.548 ns0.0628 ns0.0588 ns9.529 ns9.476 ns9.663 ns0.440.02-NA
CreateScaleFromVectorWithCenterBenchmarkJob-KPUHXS/crb/corerun21.963 ns0.9062 ns1.0435 ns21.291 ns21.155 ns24.310 ns1.000.00-NA
CreateScaleFromScalarBenchmarkJob-AFMBXBRoot/corerun9.321 ns0.0701 ns0.0655 ns9.329 ns9.207 ns9.442 ns0.540.00-NA
CreateScaleFromScalarBenchmarkJob-KPUHXS/crb/corerun17.138 ns0.0886 ns0.0828 ns17.154 ns16.954 ns17.255 ns1.000.00-NA
CreateScaleFromScalarWithCenterBenchmarkJob-AFMBXBRoot/corerun12.807 ns0.1044 ns0.0977 ns12.789 ns12.689 ns12.999 ns0.740.01-NA
CreateScaleFromScalarWithCenterBenchmarkJob-KPUHXS/crb/corerun17.203 ns0.0963 ns0.0901 ns17.216 ns16.980 ns17.342 ns1.000.00-NA
CreateScaleFromScalarXYZBenchmarkJob-AFMBXBRoot/corerun9.454 ns0.0688 ns0.0609 ns9.433 ns9.389 ns9.577 ns0.460.00-NA
CreateScaleFromScalarXYZBenchmarkJob-KPUHXS/crb/corerun20.481 ns0.1567 ns0.1466 ns20.431 ns20.296 ns20.769 ns1.000.00-NA
CreateScaleFromScalarXYZWithCenterBenchmarkJob-AFMBXBRoot/corerun9.434 ns0.0380 ns0.0297 ns9.438 ns9.384 ns9.477 ns0.550.00-NA
CreateScaleFromScalarXYZWithCenterBenchmarkJob-KPUHXS/crb/corerun17.160 ns0.1791 ns0.1588 ns17.171 ns16.901 ns17.433 ns1.000.00-NA

Where Root/corerun is this change and /crb/corerun is main.

Fixes #78977.

Author:SingleAccretion
Assignees:-
Labels:

area-CodeGen-coreclr

Milestone:-

@SingleAccretionSingleAccretion added area-System.Numerics and removed area-CodeGen-coreclr CLR JIT compiler in src/coreclr/src/jit and related components such as SuperPMI labels Dec 2, 2022
@SingleAccretion
SingleAccretion marked this pull request as ready for review December 2, 2022 23:11
@ghost

ghost commented Dec 2, 2022

Copy link
Copy Markdown

Tagging subscribers to this area: @dotnet/area-system-numerics
See info in area-owners.md if you want to be subscribed.

Issue Details

In #76491 the Jit became a little more eager to optimize code using vectors as a whole. Unfortunately, this regressed Matrix4x4.CreateScale on some platforms because code for it is written in a way that favors promotion over whole-register access.

This change fixes the regression by using style that is more in line with what the Jit expects of vectors. It also optimizes related overloads by avoiding the relatively expensive get_Identity property call (that is not even inlined due to loading a value type field).

Linux x64 benchmark results:

MethodJobToolchainMeanErrorStdDevMedianMinMaxRatioRatioSDAllocatedAlloc Ratio
CreateScaleFromVectorBenchmarkJob-AFMBXBRoot/corerun12.575 ns0.1031 ns0.0861 ns12.555 ns12.452 ns12.770 ns0.740.01-NA
CreateScaleFromVectorBenchmarkJob-KPUHXS/crb/corerun16.988 ns0.1283 ns0.1138 ns16.959 ns16.789 ns17.189 ns1.000.00-NA
CreateScaleFromVectorWithCenterBenchmarkJob-AFMBXBRoot/corerun9.548 ns0.0628 ns0.0588 ns9.529 ns9.476 ns9.663 ns0.440.02-NA
CreateScaleFromVectorWithCenterBenchmarkJob-KPUHXS/crb/corerun21.963 ns0.9062 ns1.0435 ns21.291 ns21.155 ns24.310 ns1.000.00-NA
CreateScaleFromScalarBenchmarkJob-AFMBXBRoot/corerun9.321 ns0.0701 ns0.0655 ns9.329 ns9.207 ns9.442 ns0.540.00-NA
CreateScaleFromScalarBenchmarkJob-KPUHXS/crb/corerun17.138 ns0.0886 ns0.0828 ns17.154 ns16.954 ns17.255 ns1.000.00-NA
CreateScaleFromScalarWithCenterBenchmarkJob-AFMBXBRoot/corerun12.807 ns0.1044 ns0.0977 ns12.789 ns12.689 ns12.999 ns0.740.01-NA
CreateScaleFromScalarWithCenterBenchmarkJob-KPUHXS/crb/corerun17.203 ns0.0963 ns0.0901 ns17.216 ns16.980 ns17.342 ns1.000.00-NA
CreateScaleFromScalarXYZBenchmarkJob-AFMBXBRoot/corerun9.454 ns0.0688 ns0.0609 ns9.433 ns9.389 ns9.577 ns0.460.00-NA
CreateScaleFromScalarXYZBenchmarkJob-KPUHXS/crb/corerun20.481 ns0.1567 ns0.1466 ns20.431 ns20.296 ns20.769 ns1.000.00-NA
CreateScaleFromScalarXYZWithCenterBenchmarkJob-AFMBXBRoot/corerun9.434 ns0.0380 ns0.0297 ns9.438 ns9.384 ns9.477 ns0.550.00-NA
CreateScaleFromScalarXYZWithCenterBenchmarkJob-KPUHXS/crb/corerun17.160 ns0.1791 ns0.1588 ns17.171 ns16.901 ns17.433 ns1.000.00-NA

Where Root/corerun is this change and /crb/corerun is main.

Fixes #78977.

Author:SingleAccretion
Assignees:-
Labels:

area-System.Numerics, community-contribution

Milestone:-

@EgorBo
EgorBo merged commit c782569 into dotnet:mainDec 5, 2022
@EgorBo

Copy link
Copy Markdown
Member

Thanks for the workaround!

@SingleAccretion
SingleAccretion deleted the Speed-Up-Matrix4x4-CreateScale branch December 7, 2022 17:27
@ghostghost locked as resolved and limited conversation to collaborators Jan 6, 2023
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

area-System.Numericscommunity-contributionIndicates that the PR has been added by a community member

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Regressions in System.Numerics.Tests.Perf_Matrix4x4

3 participants

@SingleAccretion@EgorBo@dakersnar
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Speed up Matrix4x4.CreateScale - #79172

Merged
EgorBo merged 1 commit into
dotnet:mainfrom
SingleAccretion:Speed-Up-Matrix4x4-CreateScale
Dec 5, 2022
Merged

Speed up Matrix4x4.CreateScale#79172
EgorBo merged 1 commit into
dotnet:mainfrom
SingleAccretion:Speed-Up-Matrix4x4-CreateScale

Conversation

@SingleAccretion

Copy link
Copy Markdown
Contributor

In #76491 the Jit became a little more eager to optimize code using vectors as a whole. Unfortunately, this regressed Matrix4x4.CreateScale on some platforms because code for it is written in a way that favors promotion over whole-register access.

This change fixes the regression by using style that is more in line with what the Jit expects of vectors. It also optimizes related overloads by avoiding the relatively expensive get_Identity property call (that is not even inlined due to loading a value type field).

Linux x64 benchmark results:

MethodJobToolchainMeanErrorStdDevMedianMinMaxRatioRatioSDAllocatedAlloc Ratio
CreateScaleFromVectorBenchmarkJob-AFMBXBRoot/corerun12.575 ns0.1031 ns0.0861 ns12.555 ns12.452 ns12.770 ns0.740.01-NA
CreateScaleFromVectorBenchmarkJob-KPUHXS/crb/corerun16.988 ns0.1283 ns0.1138 ns16.959 ns16.789 ns17.189 ns1.000.00-NA
CreateScaleFromVectorWithCenterBenchmarkJob-AFMBXBRoot/corerun9.548 ns0.0628 ns0.0588 ns9.529 ns9.476 ns9.663 ns0.440.02-NA
CreateScaleFromVectorWithCenterBenchmarkJob-KPUHXS/crb/corerun21.963 ns0.9062 ns1.0435 ns21.291 ns21.155 ns24.310 ns1.000.00-NA
CreateScaleFromScalarBenchmarkJob-AFMBXBRoot/corerun9.321 ns0.0701 ns0.0655 ns9.329 ns9.207 ns9.442 ns0.540.00-NA
CreateScaleFromScalarBenchmarkJob-KPUHXS/crb/corerun17.138 ns0.0886 ns0.0828 ns17.154 ns16.954 ns17.255 ns1.000.00-NA
CreateScaleFromScalarWithCenterBenchmarkJob-AFMBXBRoot/corerun12.807 ns0.1044 ns0.0977 ns12.789 ns12.689 ns12.999 ns0.740.01-NA
CreateScaleFromScalarWithCenterBenchmarkJob-KPUHXS/crb/corerun17.203 ns0.0963 ns0.0901 ns17.216 ns16.980 ns17.342 ns1.000.00-NA
CreateScaleFromScalarXYZBenchmarkJob-AFMBXBRoot/corerun9.454 ns0.0688 ns0.0609 ns9.433 ns9.389 ns9.577 ns0.460.00-NA
CreateScaleFromScalarXYZBenchmarkJob-KPUHXS/crb/corerun20.481 ns0.1567 ns0.1466 ns20.431 ns20.296 ns20.769 ns1.000.00-NA
CreateScaleFromScalarXYZWithCenterBenchmarkJob-AFMBXBRoot/corerun9.434 ns0.0380 ns0.0297 ns9.438 ns9.384 ns9.477 ns0.550.00-NA
CreateScaleFromScalarXYZWithCenterBenchmarkJob-KPUHXS/crb/corerun17.160 ns0.1791 ns0.1588 ns17.171 ns16.901 ns17.433 ns1.000.00-NA

Where Root/corerun is this change and /crb/corerun is main.

Fixes#78977.

@ghostghost added area-CodeGen-coreclr CLR JIT compiler in src/coreclr/src/jit and related components such as SuperPMI community-contribution Indicates that the PR has been added by a community member labels Dec 2, 2022
@ghost

ghost commented Dec 2, 2022

Copy link
Copy Markdown

Tagging subscribers to this area: @JulieLeeMSFT, @jakobbotsch
See info in area-owners.md if you want to be subscribed.

Issue Details

In #76491 the Jit became a little more eager to optimize code using vectors as a whole. Unfortunately, this regressed Matrix4x4.CreateScale on some platforms because code for it is written in a way that favors promotion over whole-register access.

This change fixes the regression by using style that is more in line with what the Jit expects of vectors. It also optimizes related overloads by avoiding the relatively expensive get_Identity property call (that is not even inlined due to loading a value type field).

Linux x64 benchmark results:

MethodJobToolchainMeanErrorStdDevMedianMinMaxRatioRatioSDAllocatedAlloc Ratio
CreateScaleFromVectorBenchmarkJob-AFMBXBRoot/corerun12.575 ns0.1031 ns0.0861 ns12.555 ns12.452 ns12.770 ns0.740.01-NA
CreateScaleFromVectorBenchmarkJob-KPUHXS/crb/corerun16.988 ns0.1283 ns0.1138 ns16.959 ns16.789 ns17.189 ns1.000.00-NA
CreateScaleFromVectorWithCenterBenchmarkJob-AFMBXBRoot/corerun9.548 ns0.0628 ns0.0588 ns9.529 ns9.476 ns9.663 ns0.440.02-NA
CreateScaleFromVectorWithCenterBenchmarkJob-KPUHXS/crb/corerun21.963 ns0.9062 ns1.0435 ns21.291 ns21.155 ns24.310 ns1.000.00-NA
CreateScaleFromScalarBenchmarkJob-AFMBXBRoot/corerun9.321 ns0.0701 ns0.0655 ns9.329 ns9.207 ns9.442 ns0.540.00-NA
CreateScaleFromScalarBenchmarkJob-KPUHXS/crb/corerun17.138 ns0.0886 ns0.0828 ns17.154 ns16.954 ns17.255 ns1.000.00-NA
CreateScaleFromScalarWithCenterBenchmarkJob-AFMBXBRoot/corerun12.807 ns0.1044 ns0.0977 ns12.789 ns12.689 ns12.999 ns0.740.01-NA
CreateScaleFromScalarWithCenterBenchmarkJob-KPUHXS/crb/corerun17.203 ns0.0963 ns0.0901 ns17.216 ns16.980 ns17.342 ns1.000.00-NA
CreateScaleFromScalarXYZBenchmarkJob-AFMBXBRoot/corerun9.454 ns0.0688 ns0.0609 ns9.433 ns9.389 ns9.577 ns0.460.00-NA
CreateScaleFromScalarXYZBenchmarkJob-KPUHXS/crb/corerun20.481 ns0.1567 ns0.1466 ns20.431 ns20.296 ns20.769 ns1.000.00-NA
CreateScaleFromScalarXYZWithCenterBenchmarkJob-AFMBXBRoot/corerun9.434 ns0.0380 ns0.0297 ns9.438 ns9.384 ns9.477 ns0.550.00-NA
CreateScaleFromScalarXYZWithCenterBenchmarkJob-KPUHXS/crb/corerun17.160 ns0.1791 ns0.1588 ns17.171 ns16.901 ns17.433 ns1.000.00-NA

Where Root/corerun is this change and /crb/corerun is main.

Fixes #78977.

Author:SingleAccretion
Assignees:-
Labels:

area-CodeGen-coreclr

Milestone:-

@SingleAccretionSingleAccretion added area-System.Numerics and removed area-CodeGen-coreclr CLR JIT compiler in src/coreclr/src/jit and related components such as SuperPMI labels Dec 2, 2022
@SingleAccretion
SingleAccretion marked this pull request as ready for review December 2, 2022 23:11
@ghost

ghost commented Dec 2, 2022

Copy link
Copy Markdown

Tagging subscribers to this area: @dotnet/area-system-numerics
See info in area-owners.md if you want to be subscribed.

Issue Details

In #76491 the Jit became a little more eager to optimize code using vectors as a whole. Unfortunately, this regressed Matrix4x4.CreateScale on some platforms because code for it is written in a way that favors promotion over whole-register access.

This change fixes the regression by using style that is more in line with what the Jit expects of vectors. It also optimizes related overloads by avoiding the relatively expensive get_Identity property call (that is not even inlined due to loading a value type field).

Linux x64 benchmark results:

MethodJobToolchainMeanErrorStdDevMedianMinMaxRatioRatioSDAllocatedAlloc Ratio
CreateScaleFromVectorBenchmarkJob-AFMBXBRoot/corerun12.575 ns0.1031 ns0.0861 ns12.555 ns12.452 ns12.770 ns0.740.01-NA
CreateScaleFromVectorBenchmarkJob-KPUHXS/crb/corerun16.988 ns0.1283 ns0.1138 ns16.959 ns16.789 ns17.189 ns1.000.00-NA
CreateScaleFromVectorWithCenterBenchmarkJob-AFMBXBRoot/corerun9.548 ns0.0628 ns0.0588 ns9.529 ns9.476 ns9.663 ns0.440.02-NA
CreateScaleFromVectorWithCenterBenchmarkJob-KPUHXS/crb/corerun21.963 ns0.9062 ns1.0435 ns21.291 ns21.155 ns24.310 ns1.000.00-NA
CreateScaleFromScalarBenchmarkJob-AFMBXBRoot/corerun9.321 ns0.0701 ns0.0655 ns9.329 ns9.207 ns9.442 ns0.540.00-NA
CreateScaleFromScalarBenchmarkJob-KPUHXS/crb/corerun17.138 ns0.0886 ns0.0828 ns17.154 ns16.954 ns17.255 ns1.000.00-NA
CreateScaleFromScalarWithCenterBenchmarkJob-AFMBXBRoot/corerun12.807 ns0.1044 ns0.0977 ns12.789 ns12.689 ns12.999 ns0.740.01-NA
CreateScaleFromScalarWithCenterBenchmarkJob-KPUHXS/crb/corerun17.203 ns0.0963 ns0.0901 ns17.216 ns16.980 ns17.342 ns1.000.00-NA
CreateScaleFromScalarXYZBenchmarkJob-AFMBXBRoot/corerun9.454 ns0.0688 ns0.0609 ns9.433 ns9.389 ns9.577 ns0.460.00-NA
CreateScaleFromScalarXYZBenchmarkJob-KPUHXS/crb/corerun20.481 ns0.1567 ns0.1466 ns20.431 ns20.296 ns20.769 ns1.000.00-NA
CreateScaleFromScalarXYZWithCenterBenchmarkJob-AFMBXBRoot/corerun9.434 ns0.0380 ns0.0297 ns9.438 ns9.384 ns9.477 ns0.550.00-NA
CreateScaleFromScalarXYZWithCenterBenchmarkJob-KPUHXS/crb/corerun17.160 ns0.1791 ns0.1588 ns17.171 ns16.901 ns17.433 ns1.000.00-NA

Where Root/corerun is this change and /crb/corerun is main.

Fixes #78977.

Author:SingleAccretion
Assignees:-
Labels:

area-System.Numerics, community-contribution

Milestone:-

@EgorBo
EgorBo merged commit c782569 into dotnet:mainDec 5, 2022
@EgorBo

Copy link
Copy Markdown
Member

Thanks for the workaround!

@SingleAccretion
SingleAccretion deleted the Speed-Up-Matrix4x4-CreateScale branch December 7, 2022 17:27
@ghostghost locked as resolved and limited conversation to collaborators Jan 6, 2023
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

area-System.Numericscommunity-contributionIndicates that the PR has been added by a community member

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Regressions in System.Numerics.Tests.Perf_Matrix4x4

3 participants

@SingleAccretion@EgorBo@dakersnar
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Speed up Matrix4x4.CreateScale - #79172

Merged
EgorBo merged 1 commit into
dotnet:mainfrom
SingleAccretion:Speed-Up-Matrix4x4-CreateScale
Dec 5, 2022
Merged

Speed up Matrix4x4.CreateScale#79172
EgorBo merged 1 commit into
dotnet:mainfrom
SingleAccretion:Speed-Up-Matrix4x4-CreateScale

Conversation

@SingleAccretion

Copy link
Copy Markdown
Contributor

In #76491 the Jit became a little more eager to optimize code using vectors as a whole. Unfortunately, this regressed Matrix4x4.CreateScale on some platforms because code for it is written in a way that favors promotion over whole-register access.

This change fixes the regression by using style that is more in line with what the Jit expects of vectors. It also optimizes related overloads by avoiding the relatively expensive get_Identity property call (that is not even inlined due to loading a value type field).

Linux x64 benchmark results:

MethodJobToolchainMeanErrorStdDevMedianMinMaxRatioRatioSDAllocatedAlloc Ratio
CreateScaleFromVectorBenchmarkJob-AFMBXBRoot/corerun12.575 ns0.1031 ns0.0861 ns12.555 ns12.452 ns12.770 ns0.740.01-NA
CreateScaleFromVectorBenchmarkJob-KPUHXS/crb/corerun16.988 ns0.1283 ns0.1138 ns16.959 ns16.789 ns17.189 ns1.000.00-NA
CreateScaleFromVectorWithCenterBenchmarkJob-AFMBXBRoot/corerun9.548 ns0.0628 ns0.0588 ns9.529 ns9.476 ns9.663 ns0.440.02-NA
CreateScaleFromVectorWithCenterBenchmarkJob-KPUHXS/crb/corerun21.963 ns0.9062 ns1.0435 ns21.291 ns21.155 ns24.310 ns1.000.00-NA
CreateScaleFromScalarBenchmarkJob-AFMBXBRoot/corerun9.321 ns0.0701 ns0.0655 ns9.329 ns9.207 ns9.442 ns0.540.00-NA
CreateScaleFromScalarBenchmarkJob-KPUHXS/crb/corerun17.138 ns0.0886 ns0.0828 ns17.154 ns16.954 ns17.255 ns1.000.00-NA
CreateScaleFromScalarWithCenterBenchmarkJob-AFMBXBRoot/corerun12.807 ns0.1044 ns0.0977 ns12.789 ns12.689 ns12.999 ns0.740.01-NA
CreateScaleFromScalarWithCenterBenchmarkJob-KPUHXS/crb/corerun17.203 ns0.0963 ns0.0901 ns17.216 ns16.980 ns17.342 ns1.000.00-NA
CreateScaleFromScalarXYZBenchmarkJob-AFMBXBRoot/corerun9.454 ns0.0688 ns0.0609 ns9.433 ns9.389 ns9.577 ns0.460.00-NA
CreateScaleFromScalarXYZBenchmarkJob-KPUHXS/crb/corerun20.481 ns0.1567 ns0.1466 ns20.431 ns20.296 ns20.769 ns1.000.00-NA
CreateScaleFromScalarXYZWithCenterBenchmarkJob-AFMBXBRoot/corerun9.434 ns0.0380 ns0.0297 ns9.438 ns9.384 ns9.477 ns0.550.00-NA
CreateScaleFromScalarXYZWithCenterBenchmarkJob-KPUHXS/crb/corerun17.160 ns0.1791 ns0.1588 ns17.171 ns16.901 ns17.433 ns1.000.00-NA

Where Root/corerun is this change and /crb/corerun is main.

Fixes#78977.

@ghostghost added area-CodeGen-coreclr CLR JIT compiler in src/coreclr/src/jit and related components such as SuperPMI community-contribution Indicates that the PR has been added by a community member labels Dec 2, 2022
@ghost

ghost commented Dec 2, 2022

Copy link
Copy Markdown

Tagging subscribers to this area: @JulieLeeMSFT, @jakobbotsch
See info in area-owners.md if you want to be subscribed.

Issue Details

In #76491 the Jit became a little more eager to optimize code using vectors as a whole. Unfortunately, this regressed Matrix4x4.CreateScale on some platforms because code for it is written in a way that favors promotion over whole-register access.

This change fixes the regression by using style that is more in line with what the Jit expects of vectors. It also optimizes related overloads by avoiding the relatively expensive get_Identity property call (that is not even inlined due to loading a value type field).

Linux x64 benchmark results:

MethodJobToolchainMeanErrorStdDevMedianMinMaxRatioRatioSDAllocatedAlloc Ratio
CreateScaleFromVectorBenchmarkJob-AFMBXBRoot/corerun12.575 ns0.1031 ns0.0861 ns12.555 ns12.452 ns12.770 ns0.740.01-NA
CreateScaleFromVectorBenchmarkJob-KPUHXS/crb/corerun16.988 ns0.1283 ns0.1138 ns16.959 ns16.789 ns17.189 ns1.000.00-NA
CreateScaleFromVectorWithCenterBenchmarkJob-AFMBXBRoot/corerun9.548 ns0.0628 ns0.0588 ns9.529 ns9.476 ns9.663 ns0.440.02-NA
CreateScaleFromVectorWithCenterBenchmarkJob-KPUHXS/crb/corerun21.963 ns0.9062 ns1.0435 ns21.291 ns21.155 ns24.310 ns1.000.00-NA
CreateScaleFromScalarBenchmarkJob-AFMBXBRoot/corerun9.321 ns0.0701 ns0.0655 ns9.329 ns9.207 ns9.442 ns0.540.00-NA
CreateScaleFromScalarBenchmarkJob-KPUHXS/crb/corerun17.138 ns0.0886 ns0.0828 ns17.154 ns16.954 ns17.255 ns1.000.00-NA
CreateScaleFromScalarWithCenterBenchmarkJob-AFMBXBRoot/corerun12.807 ns0.1044 ns0.0977 ns12.789 ns12.689 ns12.999 ns0.740.01-NA
CreateScaleFromScalarWithCenterBenchmarkJob-KPUHXS/crb/corerun17.203 ns0.0963 ns0.0901 ns17.216 ns16.980 ns17.342 ns1.000.00-NA
CreateScaleFromScalarXYZBenchmarkJob-AFMBXBRoot/corerun9.454 ns0.0688 ns0.0609 ns9.433 ns9.389 ns9.577 ns0.460.00-NA
CreateScaleFromScalarXYZBenchmarkJob-KPUHXS/crb/corerun20.481 ns0.1567 ns0.1466 ns20.431 ns20.296 ns20.769 ns1.000.00-NA
CreateScaleFromScalarXYZWithCenterBenchmarkJob-AFMBXBRoot/corerun9.434 ns0.0380 ns0.0297 ns9.438 ns9.384 ns9.477 ns0.550.00-NA
CreateScaleFromScalarXYZWithCenterBenchmarkJob-KPUHXS/crb/corerun17.160 ns0.1791 ns0.1588 ns17.171 ns16.901 ns17.433 ns1.000.00-NA

Where Root/corerun is this change and /crb/corerun is main.

Fixes #78977.

Author:SingleAccretion
Assignees:-
Labels:

area-CodeGen-coreclr

Milestone:-

@SingleAccretionSingleAccretion added area-System.Numerics and removed area-CodeGen-coreclr CLR JIT compiler in src/coreclr/src/jit and related components such as SuperPMI labels Dec 2, 2022
@SingleAccretion
SingleAccretion marked this pull request as ready for review December 2, 2022 23:11
@ghost

ghost commented Dec 2, 2022

Copy link
Copy Markdown

Tagging subscribers to this area: @dotnet/area-system-numerics
See info in area-owners.md if you want to be subscribed.

Issue Details

In #76491 the Jit became a little more eager to optimize code using vectors as a whole. Unfortunately, this regressed Matrix4x4.CreateScale on some platforms because code for it is written in a way that favors promotion over whole-register access.

This change fixes the regression by using style that is more in line with what the Jit expects of vectors. It also optimizes related overloads by avoiding the relatively expensive get_Identity property call (that is not even inlined due to loading a value type field).

Linux x64 benchmark results:

MethodJobToolchainMeanErrorStdDevMedianMinMaxRatioRatioSDAllocatedAlloc Ratio
CreateScaleFromVectorBenchmarkJob-AFMBXBRoot/corerun12.575 ns0.1031 ns0.0861 ns12.555 ns12.452 ns12.770 ns0.740.01-NA
CreateScaleFromVectorBenchmarkJob-KPUHXS/crb/corerun16.988 ns0.1283 ns0.1138 ns16.959 ns16.789 ns17.189 ns1.000.00-NA
CreateScaleFromVectorWithCenterBenchmarkJob-AFMBXBRoot/corerun9.548 ns0.0628 ns0.0588 ns9.529 ns9.476 ns9.663 ns0.440.02-NA
CreateScaleFromVectorWithCenterBenchmarkJob-KPUHXS/crb/corerun21.963 ns0.9062 ns1.0435 ns21.291 ns21.155 ns24.310 ns1.000.00-NA
CreateScaleFromScalarBenchmarkJob-AFMBXBRoot/corerun9.321 ns0.0701 ns0.0655 ns9.329 ns9.207 ns9.442 ns0.540.00-NA
CreateScaleFromScalarBenchmarkJob-KPUHXS/crb/corerun17.138 ns0.0886 ns0.0828 ns17.154 ns16.954 ns17.255 ns1.000.00-NA
CreateScaleFromScalarWithCenterBenchmarkJob-AFMBXBRoot/corerun12.807 ns0.1044 ns0.0977 ns12.789 ns12.689 ns12.999 ns0.740.01-NA
CreateScaleFromScalarWithCenterBenchmarkJob-KPUHXS/crb/corerun17.203 ns0.0963 ns0.0901 ns17.216 ns16.980 ns17.342 ns1.000.00-NA
CreateScaleFromScalarXYZBenchmarkJob-AFMBXBRoot/corerun9.454 ns0.0688 ns0.0609 ns9.433 ns9.389 ns9.577 ns0.460.00-NA
CreateScaleFromScalarXYZBenchmarkJob-KPUHXS/crb/corerun20.481 ns0.1567 ns0.1466 ns20.431 ns20.296 ns20.769 ns1.000.00-NA
CreateScaleFromScalarXYZWithCenterBenchmarkJob-AFMBXBRoot/corerun9.434 ns0.0380 ns0.0297 ns9.438 ns9.384 ns9.477 ns0.550.00-NA
CreateScaleFromScalarXYZWithCenterBenchmarkJob-KPUHXS/crb/corerun17.160 ns0.1791 ns0.1588 ns17.171 ns16.901 ns17.433 ns1.000.00-NA

Where Root/corerun is this change and /crb/corerun is main.

Fixes #78977.

Author:SingleAccretion
Assignees:-
Labels:

area-System.Numerics, community-contribution

Milestone:-

@EgorBo
EgorBo merged commit c782569 into dotnet:mainDec 5, 2022
@EgorBo

Copy link
Copy Markdown
Member

Thanks for the workaround!

@SingleAccretion
SingleAccretion deleted the Speed-Up-Matrix4x4-CreateScale branch December 7, 2022 17:27
@ghostghost locked as resolved and limited conversation to collaborators Jan 6, 2023
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

area-System.Numericscommunity-contributionIndicates that the PR has been added by a community member

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Regressions in System.Numerics.Tests.Perf_Matrix4x4

3 participants

@SingleAccretion@EgorBo@dakersnar
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Speed up Matrix4x4.CreateScale - #79172

Merged
EgorBo merged 1 commit into
dotnet:mainfrom
SingleAccretion:Speed-Up-Matrix4x4-CreateScale
Dec 5, 2022
Merged

Speed up Matrix4x4.CreateScale#79172
EgorBo merged 1 commit into
dotnet:mainfrom
SingleAccretion:Speed-Up-Matrix4x4-CreateScale

Conversation

@SingleAccretion

Copy link
Copy Markdown
Contributor

In #76491 the Jit became a little more eager to optimize code using vectors as a whole. Unfortunately, this regressed Matrix4x4.CreateScale on some platforms because code for it is written in a way that favors promotion over whole-register access.

This change fixes the regression by using style that is more in line with what the Jit expects of vectors. It also optimizes related overloads by avoiding the relatively expensive get_Identity property call (that is not even inlined due to loading a value type field).

Linux x64 benchmark results:

MethodJobToolchainMeanErrorStdDevMedianMinMaxRatioRatioSDAllocatedAlloc Ratio
CreateScaleFromVectorBenchmarkJob-AFMBXBRoot/corerun12.575 ns0.1031 ns0.0861 ns12.555 ns12.452 ns12.770 ns0.740.01-NA
CreateScaleFromVectorBenchmarkJob-KPUHXS/crb/corerun16.988 ns0.1283 ns0.1138 ns16.959 ns16.789 ns17.189 ns1.000.00-NA
CreateScaleFromVectorWithCenterBenchmarkJob-AFMBXBRoot/corerun9.548 ns0.0628 ns0.0588 ns9.529 ns9.476 ns9.663 ns0.440.02-NA
CreateScaleFromVectorWithCenterBenchmarkJob-KPUHXS/crb/corerun21.963 ns0.9062 ns1.0435 ns21.291 ns21.155 ns24.310 ns1.000.00-NA
CreateScaleFromScalarBenchmarkJob-AFMBXBRoot/corerun9.321 ns0.0701 ns0.0655 ns9.329 ns9.207 ns9.442 ns0.540.00-NA
CreateScaleFromScalarBenchmarkJob-KPUHXS/crb/corerun17.138 ns0.0886 ns0.0828 ns17.154 ns16.954 ns17.255 ns1.000.00-NA
CreateScaleFromScalarWithCenterBenchmarkJob-AFMBXBRoot/corerun12.807 ns0.1044 ns0.0977 ns12.789 ns12.689 ns12.999 ns0.740.01-NA
CreateScaleFromScalarWithCenterBenchmarkJob-KPUHXS/crb/corerun17.203 ns0.0963 ns0.0901 ns17.216 ns16.980 ns17.342 ns1.000.00-NA
CreateScaleFromScalarXYZBenchmarkJob-AFMBXBRoot/corerun9.454 ns0.0688 ns0.0609 ns9.433 ns9.389 ns9.577 ns0.460.00-NA
CreateScaleFromScalarXYZBenchmarkJob-KPUHXS/crb/corerun20.481 ns0.1567 ns0.1466 ns20.431 ns20.296 ns20.769 ns1.000.00-NA
CreateScaleFromScalarXYZWithCenterBenchmarkJob-AFMBXBRoot/corerun9.434 ns0.0380 ns0.0297 ns9.438 ns9.384 ns9.477 ns0.550.00-NA
CreateScaleFromScalarXYZWithCenterBenchmarkJob-KPUHXS/crb/corerun17.160 ns0.1791 ns0.1588 ns17.171 ns16.901 ns17.433 ns1.000.00-NA

Where Root/corerun is this change and /crb/corerun is main.

Fixes#78977.

@ghostghost added area-CodeGen-coreclr CLR JIT compiler in src/coreclr/src/jit and related components such as SuperPMI community-contribution Indicates that the PR has been added by a community member labels Dec 2, 2022
@ghost

ghost commented Dec 2, 2022

Copy link
Copy Markdown

Tagging subscribers to this area: @JulieLeeMSFT, @jakobbotsch
See info in area-owners.md if you want to be subscribed.

Issue Details

In #76491 the Jit became a little more eager to optimize code using vectors as a whole. Unfortunately, this regressed Matrix4x4.CreateScale on some platforms because code for it is written in a way that favors promotion over whole-register access.

This change fixes the regression by using style that is more in line with what the Jit expects of vectors. It also optimizes related overloads by avoiding the relatively expensive get_Identity property call (that is not even inlined due to loading a value type field).

Linux x64 benchmark results:

MethodJobToolchainMeanErrorStdDevMedianMinMaxRatioRatioSDAllocatedAlloc Ratio
CreateScaleFromVectorBenchmarkJob-AFMBXBRoot/corerun12.575 ns0.1031 ns0.0861 ns12.555 ns12.452 ns12.770 ns0.740.01-NA
CreateScaleFromVectorBenchmarkJob-KPUHXS/crb/corerun16.988 ns0.1283 ns0.1138 ns16.959 ns16.789 ns17.189 ns1.000.00-NA
CreateScaleFromVectorWithCenterBenchmarkJob-AFMBXBRoot/corerun9.548 ns0.0628 ns0.0588 ns9.529 ns9.476 ns9.663 ns0.440.02-NA
CreateScaleFromVectorWithCenterBenchmarkJob-KPUHXS/crb/corerun21.963 ns0.9062 ns1.0435 ns21.291 ns21.155 ns24.310 ns1.000.00-NA
CreateScaleFromScalarBenchmarkJob-AFMBXBRoot/corerun9.321 ns0.0701 ns0.0655 ns9.329 ns9.207 ns9.442 ns0.540.00-NA
CreateScaleFromScalarBenchmarkJob-KPUHXS/crb/corerun17.138 ns0.0886 ns0.0828 ns17.154 ns16.954 ns17.255 ns1.000.00-NA
CreateScaleFromScalarWithCenterBenchmarkJob-AFMBXBRoot/corerun12.807 ns0.1044 ns0.0977 ns12.789 ns12.689 ns12.999 ns0.740.01-NA
CreateScaleFromScalarWithCenterBenchmarkJob-KPUHXS/crb/corerun17.203 ns0.0963 ns0.0901 ns17.216 ns16.980 ns17.342 ns1.000.00-NA
CreateScaleFromScalarXYZBenchmarkJob-AFMBXBRoot/corerun9.454 ns0.0688 ns0.0609 ns9.433 ns9.389 ns9.577 ns0.460.00-NA
CreateScaleFromScalarXYZBenchmarkJob-KPUHXS/crb/corerun20.481 ns0.1567 ns0.1466 ns20.431 ns20.296 ns20.769 ns1.000.00-NA
CreateScaleFromScalarXYZWithCenterBenchmarkJob-AFMBXBRoot/corerun9.434 ns0.0380 ns0.0297 ns9.438 ns9.384 ns9.477 ns0.550.00-NA
CreateScaleFromScalarXYZWithCenterBenchmarkJob-KPUHXS/crb/corerun17.160 ns0.1791 ns0.1588 ns17.171 ns16.901 ns17.433 ns1.000.00-NA

Where Root/corerun is this change and /crb/corerun is main.

Fixes #78977.

Author:SingleAccretion
Assignees:-
Labels:

area-CodeGen-coreclr

Milestone:-

@SingleAccretionSingleAccretion added area-System.Numerics and removed area-CodeGen-coreclr CLR JIT compiler in src/coreclr/src/jit and related components such as SuperPMI labels Dec 2, 2022
@SingleAccretion
SingleAccretion marked this pull request as ready for review December 2, 2022 23:11
@ghost

ghost commented Dec 2, 2022

Copy link
Copy Markdown

Tagging subscribers to this area: @dotnet/area-system-numerics
See info in area-owners.md if you want to be subscribed.

Issue Details

In #76491 the Jit became a little more eager to optimize code using vectors as a whole. Unfortunately, this regressed Matrix4x4.CreateScale on some platforms because code for it is written in a way that favors promotion over whole-register access.

This change fixes the regression by using style that is more in line with what the Jit expects of vectors. It also optimizes related overloads by avoiding the relatively expensive get_Identity property call (that is not even inlined due to loading a value type field).

Linux x64 benchmark results:

MethodJobToolchainMeanErrorStdDevMedianMinMaxRatioRatioSDAllocatedAlloc Ratio
CreateScaleFromVectorBenchmarkJob-AFMBXBRoot/corerun12.575 ns0.1031 ns0.0861 ns12.555 ns12.452 ns12.770 ns0.740.01-NA
CreateScaleFromVectorBenchmarkJob-KPUHXS/crb/corerun16.988 ns0.1283 ns0.1138 ns16.959 ns16.789 ns17.189 ns1.000.00-NA
CreateScaleFromVectorWithCenterBenchmarkJob-AFMBXBRoot/corerun9.548 ns0.0628 ns0.0588 ns9.529 ns9.476 ns9.663 ns0.440.02-NA
CreateScaleFromVectorWithCenterBenchmarkJob-KPUHXS/crb/corerun21.963 ns0.9062 ns1.0435 ns21.291 ns21.155 ns24.310 ns1.000.00-NA
CreateScaleFromScalarBenchmarkJob-AFMBXBRoot/corerun9.321 ns0.0701 ns0.0655 ns9.329 ns9.207 ns9.442 ns0.540.00-NA
CreateScaleFromScalarBenchmarkJob-KPUHXS/crb/corerun17.138 ns0.0886 ns0.0828 ns17.154 ns16.954 ns17.255 ns1.000.00-NA
CreateScaleFromScalarWithCenterBenchmarkJob-AFMBXBRoot/corerun12.807 ns0.1044 ns0.0977 ns12.789 ns12.689 ns12.999 ns0.740.01-NA
CreateScaleFromScalarWithCenterBenchmarkJob-KPUHXS/crb/corerun17.203 ns0.0963 ns0.0901 ns17.216 ns16.980 ns17.342 ns1.000.00-NA
CreateScaleFromScalarXYZBenchmarkJob-AFMBXBRoot/corerun9.454 ns0.0688 ns0.0609 ns9.433 ns9.389 ns9.577 ns0.460.00-NA
CreateScaleFromScalarXYZBenchmarkJob-KPUHXS/crb/corerun20.481 ns0.1567 ns0.1466 ns20.431 ns20.296 ns20.769 ns1.000.00-NA
CreateScaleFromScalarXYZWithCenterBenchmarkJob-AFMBXBRoot/corerun9.434 ns0.0380 ns0.0297 ns9.438 ns9.384 ns9.477 ns0.550.00-NA
CreateScaleFromScalarXYZWithCenterBenchmarkJob-KPUHXS/crb/corerun17.160 ns0.1791 ns0.1588 ns17.171 ns16.901 ns17.433 ns1.000.00-NA

Where Root/corerun is this change and /crb/corerun is main.

Fixes #78977.

Author:SingleAccretion
Assignees:-
Labels:

area-System.Numerics, community-contribution

Milestone:-

@EgorBo
EgorBo merged commit c782569 into dotnet:mainDec 5, 2022
@EgorBo

Copy link
Copy Markdown
Member

Thanks for the workaround!

@SingleAccretion
SingleAccretion deleted the Speed-Up-Matrix4x4-CreateScale branch December 7, 2022 17:27
@ghostghost locked as resolved and limited conversation to collaborators Jan 6, 2023
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

area-System.Numericscommunity-contributionIndicates that the PR has been added by a community member

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Regressions in System.Numerics.Tests.Perf_Matrix4x4

3 participants

@SingleAccretion@EgorBo@dakersnar
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Speed up Matrix4x4.CreateScale - #79172

Merged
EgorBo merged 1 commit into
dotnet:mainfrom
SingleAccretion:Speed-Up-Matrix4x4-CreateScale
Dec 5, 2022
Merged

Speed up Matrix4x4.CreateScale#79172
EgorBo merged 1 commit into
dotnet:mainfrom
SingleAccretion:Speed-Up-Matrix4x4-CreateScale

Conversation

@SingleAccretion

Copy link
Copy Markdown
Contributor

In #76491 the Jit became a little more eager to optimize code using vectors as a whole. Unfortunately, this regressed Matrix4x4.CreateScale on some platforms because code for it is written in a way that favors promotion over whole-register access.

This change fixes the regression by using style that is more in line with what the Jit expects of vectors. It also optimizes related overloads by avoiding the relatively expensive get_Identity property call (that is not even inlined due to loading a value type field).

Linux x64 benchmark results:

MethodJobToolchainMeanErrorStdDevMedianMinMaxRatioRatioSDAllocatedAlloc Ratio
CreateScaleFromVectorBenchmarkJob-AFMBXBRoot/corerun12.575 ns0.1031 ns0.0861 ns12.555 ns12.452 ns12.770 ns0.740.01-NA
CreateScaleFromVectorBenchmarkJob-KPUHXS/crb/corerun16.988 ns0.1283 ns0.1138 ns16.959 ns16.789 ns17.189 ns1.000.00-NA
CreateScaleFromVectorWithCenterBenchmarkJob-AFMBXBRoot/corerun9.548 ns0.0628 ns0.0588 ns9.529 ns9.476 ns9.663 ns0.440.02-NA
CreateScaleFromVectorWithCenterBenchmarkJob-KPUHXS/crb/corerun21.963 ns0.9062 ns1.0435 ns21.291 ns21.155 ns24.310 ns1.000.00-NA
CreateScaleFromScalarBenchmarkJob-AFMBXBRoot/corerun9.321 ns0.0701 ns0.0655 ns9.329 ns9.207 ns9.442 ns0.540.00-NA
CreateScaleFromScalarBenchmarkJob-KPUHXS/crb/corerun17.138 ns0.0886 ns0.0828 ns17.154 ns16.954 ns17.255 ns1.000.00-NA
CreateScaleFromScalarWithCenterBenchmarkJob-AFMBXBRoot/corerun12.807 ns0.1044 ns0.0977 ns12.789 ns12.689 ns12.999 ns0.740.01-NA
CreateScaleFromScalarWithCenterBenchmarkJob-KPUHXS/crb/corerun17.203 ns0.0963 ns0.0901 ns17.216 ns16.980 ns17.342 ns1.000.00-NA
CreateScaleFromScalarXYZBenchmarkJob-AFMBXBRoot/corerun9.454 ns0.0688 ns0.0609 ns9.433 ns9.389 ns9.577 ns0.460.00-NA
CreateScaleFromScalarXYZBenchmarkJob-KPUHXS/crb/corerun20.481 ns0.1567 ns0.1466 ns20.431 ns20.296 ns20.769 ns1.000.00-NA
CreateScaleFromScalarXYZWithCenterBenchmarkJob-AFMBXBRoot/corerun9.434 ns0.0380 ns0.0297 ns9.438 ns9.384 ns9.477 ns0.550.00-NA
CreateScaleFromScalarXYZWithCenterBenchmarkJob-KPUHXS/crb/corerun17.160 ns0.1791 ns0.1588 ns17.171 ns16.901 ns17.433 ns1.000.00-NA

Where Root/corerun is this change and /crb/corerun is main.

Fixes#78977.

@ghostghost added area-CodeGen-coreclr CLR JIT compiler in src/coreclr/src/jit and related components such as SuperPMI community-contribution Indicates that the PR has been added by a community member labels Dec 2, 2022
@ghost

ghost commented Dec 2, 2022

Copy link
Copy Markdown

Tagging subscribers to this area: @JulieLeeMSFT, @jakobbotsch
See info in area-owners.md if you want to be subscribed.

Issue Details

In #76491 the Jit became a little more eager to optimize code using vectors as a whole. Unfortunately, this regressed Matrix4x4.CreateScale on some platforms because code for it is written in a way that favors promotion over whole-register access.

This change fixes the regression by using style that is more in line with what the Jit expects of vectors. It also optimizes related overloads by avoiding the relatively expensive get_Identity property call (that is not even inlined due to loading a value type field).

Linux x64 benchmark results:

MethodJobToolchainMeanErrorStdDevMedianMinMaxRatioRatioSDAllocatedAlloc Ratio
CreateScaleFromVectorBenchmarkJob-AFMBXBRoot/corerun12.575 ns0.1031 ns0.0861 ns12.555 ns12.452 ns12.770 ns0.740.01-NA
CreateScaleFromVectorBenchmarkJob-KPUHXS/crb/corerun16.988 ns0.1283 ns0.1138 ns16.959 ns16.789 ns17.189 ns1.000.00-NA
CreateScaleFromVectorWithCenterBenchmarkJob-AFMBXBRoot/corerun9.548 ns0.0628 ns0.0588 ns9.529 ns9.476 ns9.663 ns0.440.02-NA
CreateScaleFromVectorWithCenterBenchmarkJob-KPUHXS/crb/corerun21.963 ns0.9062 ns1.0435 ns21.291 ns21.155 ns24.310 ns1.000.00-NA
CreateScaleFromScalarBenchmarkJob-AFMBXBRoot/corerun9.321 ns0.0701 ns0.0655 ns9.329 ns9.207 ns9.442 ns0.540.00-NA
CreateScaleFromScalarBenchmarkJob-KPUHXS/crb/corerun17.138 ns0.0886 ns0.0828 ns17.154 ns16.954 ns17.255 ns1.000.00-NA
CreateScaleFromScalarWithCenterBenchmarkJob-AFMBXBRoot/corerun12.807 ns0.1044 ns0.0977 ns12.789 ns12.689 ns12.999 ns0.740.01-NA
CreateScaleFromScalarWithCenterBenchmarkJob-KPUHXS/crb/corerun17.203 ns0.0963 ns0.0901 ns17.216 ns16.980 ns17.342 ns1.000.00-NA
CreateScaleFromScalarXYZBenchmarkJob-AFMBXBRoot/corerun9.454 ns0.0688 ns0.0609 ns9.433 ns9.389 ns9.577 ns0.460.00-NA
CreateScaleFromScalarXYZBenchmarkJob-KPUHXS/crb/corerun20.481 ns0.1567 ns0.1466 ns20.431 ns20.296 ns20.769 ns1.000.00-NA
CreateScaleFromScalarXYZWithCenterBenchmarkJob-AFMBXBRoot/corerun9.434 ns0.0380 ns0.0297 ns9.438 ns9.384 ns9.477 ns0.550.00-NA
CreateScaleFromScalarXYZWithCenterBenchmarkJob-KPUHXS/crb/corerun17.160 ns0.1791 ns0.1588 ns17.171 ns16.901 ns17.433 ns1.000.00-NA

Where Root/corerun is this change and /crb/corerun is main.

Fixes #78977.

Author:SingleAccretion
Assignees:-
Labels:

area-CodeGen-coreclr

Milestone:-

@SingleAccretionSingleAccretion added area-System.Numerics and removed area-CodeGen-coreclr CLR JIT compiler in src/coreclr/src/jit and related components such as SuperPMI labels Dec 2, 2022
@SingleAccretion
SingleAccretion marked this pull request as ready for review December 2, 2022 23:11
@ghost

ghost commented Dec 2, 2022

Copy link
Copy Markdown

Tagging subscribers to this area: @dotnet/area-system-numerics
See info in area-owners.md if you want to be subscribed.

Issue Details

In #76491 the Jit became a little more eager to optimize code using vectors as a whole. Unfortunately, this regressed Matrix4x4.CreateScale on some platforms because code for it is written in a way that favors promotion over whole-register access.

This change fixes the regression by using style that is more in line with what the Jit expects of vectors. It also optimizes related overloads by avoiding the relatively expensive get_Identity property call (that is not even inlined due to loading a value type field).

Linux x64 benchmark results:

MethodJobToolchainMeanErrorStdDevMedianMinMaxRatioRatioSDAllocatedAlloc Ratio
CreateScaleFromVectorBenchmarkJob-AFMBXBRoot/corerun12.575 ns0.1031 ns0.0861 ns12.555 ns12.452 ns12.770 ns0.740.01-NA
CreateScaleFromVectorBenchmarkJob-KPUHXS/crb/corerun16.988 ns0.1283 ns0.1138 ns16.959 ns16.789 ns17.189 ns1.000.00-NA
CreateScaleFromVectorWithCenterBenchmarkJob-AFMBXBRoot/corerun9.548 ns0.0628 ns0.0588 ns9.529 ns9.476 ns9.663 ns0.440.02-NA
CreateScaleFromVectorWithCenterBenchmarkJob-KPUHXS/crb/corerun21.963 ns0.9062 ns1.0435 ns21.291 ns21.155 ns24.310 ns1.000.00-NA
CreateScaleFromScalarBenchmarkJob-AFMBXBRoot/corerun9.321 ns0.0701 ns0.0655 ns9.329 ns9.207 ns9.442 ns0.540.00-NA
CreateScaleFromScalarBenchmarkJob-KPUHXS/crb/corerun17.138 ns0.0886 ns0.0828 ns17.154 ns16.954 ns17.255 ns1.000.00-NA
CreateScaleFromScalarWithCenterBenchmarkJob-AFMBXBRoot/corerun12.807 ns0.1044 ns0.0977 ns12.789 ns12.689 ns12.999 ns0.740.01-NA
CreateScaleFromScalarWithCenterBenchmarkJob-KPUHXS/crb/corerun17.203 ns0.0963 ns0.0901 ns17.216 ns16.980 ns17.342 ns1.000.00-NA
CreateScaleFromScalarXYZBenchmarkJob-AFMBXBRoot/corerun9.454 ns0.0688 ns0.0609 ns9.433 ns9.389 ns9.577 ns0.460.00-NA
CreateScaleFromScalarXYZBenchmarkJob-KPUHXS/crb/corerun20.481 ns0.1567 ns0.1466 ns20.431 ns20.296 ns20.769 ns1.000.00-NA
CreateScaleFromScalarXYZWithCenterBenchmarkJob-AFMBXBRoot/corerun9.434 ns0.0380 ns0.0297 ns9.438 ns9.384 ns9.477 ns0.550.00-NA
CreateScaleFromScalarXYZWithCenterBenchmarkJob-KPUHXS/crb/corerun17.160 ns0.1791 ns0.1588 ns17.171 ns16.901 ns17.433 ns1.000.00-NA

Where Root/corerun is this change and /crb/corerun is main.

Fixes #78977.

Author:SingleAccretion
Assignees:-
Labels:

area-System.Numerics, community-contribution

Milestone:-

@EgorBo
EgorBo merged commit c782569 into dotnet:mainDec 5, 2022
@EgorBo

Copy link
Copy Markdown
Member

Thanks for the workaround!

@SingleAccretion
SingleAccretion deleted the Speed-Up-Matrix4x4-CreateScale branch December 7, 2022 17:27
@ghostghost locked as resolved and limited conversation to collaborators Jan 6, 2023
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

area-System.Numericscommunity-contributionIndicates that the PR has been added by a community member

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Regressions in System.Numerics.Tests.Perf_Matrix4x4

3 participants

@SingleAccretion@EgorBo@dakersnar