Improve total L2 size calculation logic on osx-arm64 - #75881

Closed
neon-sunset wants to merge 2 commits into
dotnet:mainfrom
neon-sunset:fix-osx-arm64-l2-size-calc
Closed

Improve total L2 size calculation logic on osx-arm64#75881
neon-sunset wants to merge 2 commits into
dotnet:mainfrom
neon-sunset:fix-osx-arm64-l2-size-calc

Conversation

@neon-sunset

Copy link
Copy Markdown
Contributor

While looking at #75854 and double-checking sysctl behavior, I've noticed that on M1 Pro the actual value reported for hw.perflevel0.l2cachesize is 12582912 instead of roughly 24MB which is its actual L2 cache size.

However, sysctl has another key hw.perflevel0.cpusperl2 which allows us to calculate the total size of L2 of all performance cores.

macOS 13.0 22A5342f arm64 | M1 Pro 2E+6P
hw.perflevel0.physicalcpu: 6
hw.perflevel0.physicalcpu_max: 6
hw.perflevel0.logicalcpu: 6
hw.perflevel0.logicalcpu_max: 6
hw.perflevel0.l1icachesize: 196608
hw.perflevel0.l1dcachesize: 131072
hw.perflevel0.l2cachesize: 12582912
hw.perflevel0.cpusperl2: 3
hw.perflevel0.name: Performance

@ghostghost added community-contribution Indicates that the PR has been added by a community member area-PAL-coreclr only for closed issues labels Sep 20, 2022
@neon-sunset
neon-sunset marked this pull request as ready for review September 20, 2022 11:50
@EgorBo

Copy link
Copy Markdown
Member

I am not sure we're interested in total size, L3 that we use to calculate gen0 budget is expected to be a single chip, like per core group or a unified one. It's likely that we already return total on other platform but we'd better fix those IMO.

The idea, how I understand it, is to be able to put the while gen0 into a single piece of cache memory in order to walk it efficiently (especially here on Workstation GC as macOS is unlikely to use Server GC)

@neon-sunset

neon-sunset commented Sep 20, 2022

Copy link
Copy Markdown
ContributorAuthor

Core groups within performance cluster on M1 chips (sorry, there's no official terminology so it's confusing) work mostly (as far as I understand) as power/clock domains, while they don't share L2, regular x86 don't do that either. They are, however, within the same cluster similar to single CCX of AMD CPU rather than two different ones.

This is mostly to account for the fact that no L3 data is available on osx-arm64. Even when not hitting L2, it appears that for now we can assume that SLC which effectively works like memory-side L3 is of similar/larger size to total L2 cache size. SLC for M1 is 8MB (12MB of L2$), Pro is 24MB and Max is 48MB.

My understanding is that other code paths already calculate total L2 size without even accounting for the fact whether it's shared or not if L3 number is unavailable so I think it will be reporting numbers closer to x86_64 counterparts.

If you have any benchmarks on hand or other links to look into to gauge the difference pre and post this change - please let me know!

As for which size of L2 is observable for CPU cores with low latency, it is unclear and reverse-engineered data varies.

See: https://www.realworldtech.com/forum/?threadid=205277&curpostid=205283 and https://www.anandtech.com/show/17024/apple-m1-max-performance-review/2

p.s.: fun cursed fact, performance cores on M1 have variable sizes of their respective L2 slices, M1 is 5-1-3-3 and M1 Pro/Max is 1-5-5-1 and 3-3-3-3 megabytes of L2$.

@EgorBo

Copy link
Copy Markdown
Member

If you have any benchmarks on hand or other links to look into to gauge the difference pre and post this change - please let me know!

You can try these #64576

and could you also measure the working set size difference, presumably it will be higher with this.

@mangod9

Copy link
Copy Markdown
Member

Hi @neon-sunset, is this an experimental PR, we could mark it as a draft. Looks like you are still running some perf tests to check what the impact is here?

@neon-sunset

neon-sunset commented Oct 24, 2022

Copy link
Copy Markdown
ContributorAuthor

Hi @neon-sunset, is this an experimental PR, we could mark it as a draft. Looks like you are still running some perf tests to check what the impact is here?

Yes, I haven't been able to work on it recently so if you could mark it as draft - please do and I will change it back to ready for review once there is data available to back up (or not) the suggested change. Thanks!

@ghost

Copy link
Copy Markdown

Draft Pull Request was automatically closed for 30 days of inactivity. Please let us know if you'd like to reopen it.

@ghostghost closed this Nov 23, 2022
@ghostghost locked as resolved and limited conversation to collaborators Dec 23, 2022
This pull request was closed.
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

area-PAL-coreclronly for closed issuescommunity-contributionIndicates that the PR has been added by a community member

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@neon-sunset@EgorBo@mangod9
, '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

Improve total L2 size calculation logic on osx-arm64 - #75881

Closed
neon-sunset wants to merge 2 commits into
dotnet:mainfrom
neon-sunset:fix-osx-arm64-l2-size-calc
Closed

Improve total L2 size calculation logic on osx-arm64#75881
neon-sunset wants to merge 2 commits into
dotnet:mainfrom
neon-sunset:fix-osx-arm64-l2-size-calc

Conversation

@neon-sunset

Copy link
Copy Markdown
Contributor

While looking at #75854 and double-checking sysctl behavior, I've noticed that on M1 Pro the actual value reported for hw.perflevel0.l2cachesize is 12582912 instead of roughly 24MB which is its actual L2 cache size.

However, sysctl has another key hw.perflevel0.cpusperl2 which allows us to calculate the total size of L2 of all performance cores.

macOS 13.0 22A5342f arm64 | M1 Pro 2E+6P
hw.perflevel0.physicalcpu: 6
hw.perflevel0.physicalcpu_max: 6
hw.perflevel0.logicalcpu: 6
hw.perflevel0.logicalcpu_max: 6
hw.perflevel0.l1icachesize: 196608
hw.perflevel0.l1dcachesize: 131072
hw.perflevel0.l2cachesize: 12582912
hw.perflevel0.cpusperl2: 3
hw.perflevel0.name: Performance

@ghostghost added community-contribution Indicates that the PR has been added by a community member area-PAL-coreclr only for closed issues labels Sep 20, 2022
@neon-sunset
neon-sunset marked this pull request as ready for review September 20, 2022 11:50
@EgorBo

Copy link
Copy Markdown
Member

I am not sure we're interested in total size, L3 that we use to calculate gen0 budget is expected to be a single chip, like per core group or a unified one. It's likely that we already return total on other platform but we'd better fix those IMO.

The idea, how I understand it, is to be able to put the while gen0 into a single piece of cache memory in order to walk it efficiently (especially here on Workstation GC as macOS is unlikely to use Server GC)

@neon-sunset

neon-sunset commented Sep 20, 2022

Copy link
Copy Markdown
ContributorAuthor

Core groups within performance cluster on M1 chips (sorry, there's no official terminology so it's confusing) work mostly (as far as I understand) as power/clock domains, while they don't share L2, regular x86 don't do that either. They are, however, within the same cluster similar to single CCX of AMD CPU rather than two different ones.

This is mostly to account for the fact that no L3 data is available on osx-arm64. Even when not hitting L2, it appears that for now we can assume that SLC which effectively works like memory-side L3 is of similar/larger size to total L2 cache size. SLC for M1 is 8MB (12MB of L2$), Pro is 24MB and Max is 48MB.

My understanding is that other code paths already calculate total L2 size without even accounting for the fact whether it's shared or not if L3 number is unavailable so I think it will be reporting numbers closer to x86_64 counterparts.

If you have any benchmarks on hand or other links to look into to gauge the difference pre and post this change - please let me know!

As for which size of L2 is observable for CPU cores with low latency, it is unclear and reverse-engineered data varies.

See: https://www.realworldtech.com/forum/?threadid=205277&curpostid=205283 and https://www.anandtech.com/show/17024/apple-m1-max-performance-review/2

p.s.: fun cursed fact, performance cores on M1 have variable sizes of their respective L2 slices, M1 is 5-1-3-3 and M1 Pro/Max is 1-5-5-1 and 3-3-3-3 megabytes of L2$.

@EgorBo

Copy link
Copy Markdown
Member

If you have any benchmarks on hand or other links to look into to gauge the difference pre and post this change - please let me know!

You can try these #64576

and could you also measure the working set size difference, presumably it will be higher with this.

@mangod9

Copy link
Copy Markdown
Member

Hi @neon-sunset, is this an experimental PR, we could mark it as a draft. Looks like you are still running some perf tests to check what the impact is here?

@neon-sunset

neon-sunset commented Oct 24, 2022

Copy link
Copy Markdown
ContributorAuthor

Hi @neon-sunset, is this an experimental PR, we could mark it as a draft. Looks like you are still running some perf tests to check what the impact is here?

Yes, I haven't been able to work on it recently so if you could mark it as draft - please do and I will change it back to ready for review once there is data available to back up (or not) the suggested change. Thanks!

@ghost

Copy link
Copy Markdown

Draft Pull Request was automatically closed for 30 days of inactivity. Please let us know if you'd like to reopen it.

@ghostghost closed this Nov 23, 2022
@ghostghost locked as resolved and limited conversation to collaborators Dec 23, 2022
This pull request was closed.
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

area-PAL-coreclronly for closed issuescommunity-contributionIndicates that the PR has been added by a community member

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@neon-sunset@EgorBo@mangod9
, '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

Improve total L2 size calculation logic on osx-arm64 - #75881

Closed
neon-sunset wants to merge 2 commits into
dotnet:mainfrom
neon-sunset:fix-osx-arm64-l2-size-calc
Closed

Improve total L2 size calculation logic on osx-arm64#75881
neon-sunset wants to merge 2 commits into
dotnet:mainfrom
neon-sunset:fix-osx-arm64-l2-size-calc

Conversation

@neon-sunset

Copy link
Copy Markdown
Contributor

While looking at #75854 and double-checking sysctl behavior, I've noticed that on M1 Pro the actual value reported for hw.perflevel0.l2cachesize is 12582912 instead of roughly 24MB which is its actual L2 cache size.

However, sysctl has another key hw.perflevel0.cpusperl2 which allows us to calculate the total size of L2 of all performance cores.

macOS 13.0 22A5342f arm64 | M1 Pro 2E+6P
hw.perflevel0.physicalcpu: 6
hw.perflevel0.physicalcpu_max: 6
hw.perflevel0.logicalcpu: 6
hw.perflevel0.logicalcpu_max: 6
hw.perflevel0.l1icachesize: 196608
hw.perflevel0.l1dcachesize: 131072
hw.perflevel0.l2cachesize: 12582912
hw.perflevel0.cpusperl2: 3
hw.perflevel0.name: Performance

@ghostghost added community-contribution Indicates that the PR has been added by a community member area-PAL-coreclr only for closed issues labels Sep 20, 2022
@neon-sunset
neon-sunset marked this pull request as ready for review September 20, 2022 11:50
@EgorBo

Copy link
Copy Markdown
Member

I am not sure we're interested in total size, L3 that we use to calculate gen0 budget is expected to be a single chip, like per core group or a unified one. It's likely that we already return total on other platform but we'd better fix those IMO.

The idea, how I understand it, is to be able to put the while gen0 into a single piece of cache memory in order to walk it efficiently (especially here on Workstation GC as macOS is unlikely to use Server GC)

@neon-sunset

neon-sunset commented Sep 20, 2022

Copy link
Copy Markdown
ContributorAuthor

Core groups within performance cluster on M1 chips (sorry, there's no official terminology so it's confusing) work mostly (as far as I understand) as power/clock domains, while they don't share L2, regular x86 don't do that either. They are, however, within the same cluster similar to single CCX of AMD CPU rather than two different ones.

This is mostly to account for the fact that no L3 data is available on osx-arm64. Even when not hitting L2, it appears that for now we can assume that SLC which effectively works like memory-side L3 is of similar/larger size to total L2 cache size. SLC for M1 is 8MB (12MB of L2$), Pro is 24MB and Max is 48MB.

My understanding is that other code paths already calculate total L2 size without even accounting for the fact whether it's shared or not if L3 number is unavailable so I think it will be reporting numbers closer to x86_64 counterparts.

If you have any benchmarks on hand or other links to look into to gauge the difference pre and post this change - please let me know!

As for which size of L2 is observable for CPU cores with low latency, it is unclear and reverse-engineered data varies.

See: https://www.realworldtech.com/forum/?threadid=205277&curpostid=205283 and https://www.anandtech.com/show/17024/apple-m1-max-performance-review/2

p.s.: fun cursed fact, performance cores on M1 have variable sizes of their respective L2 slices, M1 is 5-1-3-3 and M1 Pro/Max is 1-5-5-1 and 3-3-3-3 megabytes of L2$.

@EgorBo

Copy link
Copy Markdown
Member

If you have any benchmarks on hand or other links to look into to gauge the difference pre and post this change - please let me know!

You can try these #64576

and could you also measure the working set size difference, presumably it will be higher with this.

@mangod9

Copy link
Copy Markdown
Member

Hi @neon-sunset, is this an experimental PR, we could mark it as a draft. Looks like you are still running some perf tests to check what the impact is here?

@neon-sunset

neon-sunset commented Oct 24, 2022

Copy link
Copy Markdown
ContributorAuthor

Hi @neon-sunset, is this an experimental PR, we could mark it as a draft. Looks like you are still running some perf tests to check what the impact is here?

Yes, I haven't been able to work on it recently so if you could mark it as draft - please do and I will change it back to ready for review once there is data available to back up (or not) the suggested change. Thanks!

@ghost

Copy link
Copy Markdown

Draft Pull Request was automatically closed for 30 days of inactivity. Please let us know if you'd like to reopen it.

@ghostghost closed this Nov 23, 2022
@ghostghost locked as resolved and limited conversation to collaborators Dec 23, 2022
This pull request was closed.
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

area-PAL-coreclronly for closed issuescommunity-contributionIndicates that the PR has been added by a community member

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@neon-sunset@EgorBo@mangod9
, '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

Improve total L2 size calculation logic on osx-arm64 - #75881

Closed
neon-sunset wants to merge 2 commits into
dotnet:mainfrom
neon-sunset:fix-osx-arm64-l2-size-calc
Closed

Improve total L2 size calculation logic on osx-arm64#75881
neon-sunset wants to merge 2 commits into
dotnet:mainfrom
neon-sunset:fix-osx-arm64-l2-size-calc

Conversation

@neon-sunset

Copy link
Copy Markdown
Contributor

While looking at #75854 and double-checking sysctl behavior, I've noticed that on M1 Pro the actual value reported for hw.perflevel0.l2cachesize is 12582912 instead of roughly 24MB which is its actual L2 cache size.

However, sysctl has another key hw.perflevel0.cpusperl2 which allows us to calculate the total size of L2 of all performance cores.

macOS 13.0 22A5342f arm64 | M1 Pro 2E+6P
hw.perflevel0.physicalcpu: 6
hw.perflevel0.physicalcpu_max: 6
hw.perflevel0.logicalcpu: 6
hw.perflevel0.logicalcpu_max: 6
hw.perflevel0.l1icachesize: 196608
hw.perflevel0.l1dcachesize: 131072
hw.perflevel0.l2cachesize: 12582912
hw.perflevel0.cpusperl2: 3
hw.perflevel0.name: Performance

@ghostghost added community-contribution Indicates that the PR has been added by a community member area-PAL-coreclr only for closed issues labels Sep 20, 2022
@neon-sunset
neon-sunset marked this pull request as ready for review September 20, 2022 11:50
@EgorBo

Copy link
Copy Markdown
Member

I am not sure we're interested in total size, L3 that we use to calculate gen0 budget is expected to be a single chip, like per core group or a unified one. It's likely that we already return total on other platform but we'd better fix those IMO.

The idea, how I understand it, is to be able to put the while gen0 into a single piece of cache memory in order to walk it efficiently (especially here on Workstation GC as macOS is unlikely to use Server GC)

@neon-sunset

neon-sunset commented Sep 20, 2022

Copy link
Copy Markdown
ContributorAuthor

Core groups within performance cluster on M1 chips (sorry, there's no official terminology so it's confusing) work mostly (as far as I understand) as power/clock domains, while they don't share L2, regular x86 don't do that either. They are, however, within the same cluster similar to single CCX of AMD CPU rather than two different ones.

This is mostly to account for the fact that no L3 data is available on osx-arm64. Even when not hitting L2, it appears that for now we can assume that SLC which effectively works like memory-side L3 is of similar/larger size to total L2 cache size. SLC for M1 is 8MB (12MB of L2$), Pro is 24MB and Max is 48MB.

My understanding is that other code paths already calculate total L2 size without even accounting for the fact whether it's shared or not if L3 number is unavailable so I think it will be reporting numbers closer to x86_64 counterparts.

If you have any benchmarks on hand or other links to look into to gauge the difference pre and post this change - please let me know!

As for which size of L2 is observable for CPU cores with low latency, it is unclear and reverse-engineered data varies.

See: https://www.realworldtech.com/forum/?threadid=205277&curpostid=205283 and https://www.anandtech.com/show/17024/apple-m1-max-performance-review/2

p.s.: fun cursed fact, performance cores on M1 have variable sizes of their respective L2 slices, M1 is 5-1-3-3 and M1 Pro/Max is 1-5-5-1 and 3-3-3-3 megabytes of L2$.

@EgorBo

Copy link
Copy Markdown
Member

If you have any benchmarks on hand or other links to look into to gauge the difference pre and post this change - please let me know!

You can try these #64576

and could you also measure the working set size difference, presumably it will be higher with this.

@mangod9

Copy link
Copy Markdown
Member

Hi @neon-sunset, is this an experimental PR, we could mark it as a draft. Looks like you are still running some perf tests to check what the impact is here?

@neon-sunset

neon-sunset commented Oct 24, 2022

Copy link
Copy Markdown
ContributorAuthor

Hi @neon-sunset, is this an experimental PR, we could mark it as a draft. Looks like you are still running some perf tests to check what the impact is here?

Yes, I haven't been able to work on it recently so if you could mark it as draft - please do and I will change it back to ready for review once there is data available to back up (or not) the suggested change. Thanks!

@ghost

Copy link
Copy Markdown

Draft Pull Request was automatically closed for 30 days of inactivity. Please let us know if you'd like to reopen it.

@ghostghost closed this Nov 23, 2022
@ghostghost locked as resolved and limited conversation to collaborators Dec 23, 2022
This pull request was closed.
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

area-PAL-coreclronly for closed issuescommunity-contributionIndicates that the PR has been added by a community member

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@neon-sunset@EgorBo@mangod9
, '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

Improve total L2 size calculation logic on osx-arm64 - #75881

Closed
neon-sunset wants to merge 2 commits into
dotnet:mainfrom
neon-sunset:fix-osx-arm64-l2-size-calc
Closed

Improve total L2 size calculation logic on osx-arm64#75881
neon-sunset wants to merge 2 commits into
dotnet:mainfrom
neon-sunset:fix-osx-arm64-l2-size-calc

Conversation

@neon-sunset

Copy link
Copy Markdown
Contributor

While looking at #75854 and double-checking sysctl behavior, I've noticed that on M1 Pro the actual value reported for hw.perflevel0.l2cachesize is 12582912 instead of roughly 24MB which is its actual L2 cache size.

However, sysctl has another key hw.perflevel0.cpusperl2 which allows us to calculate the total size of L2 of all performance cores.

macOS 13.0 22A5342f arm64 | M1 Pro 2E+6P
hw.perflevel0.physicalcpu: 6
hw.perflevel0.physicalcpu_max: 6
hw.perflevel0.logicalcpu: 6
hw.perflevel0.logicalcpu_max: 6
hw.perflevel0.l1icachesize: 196608
hw.perflevel0.l1dcachesize: 131072
hw.perflevel0.l2cachesize: 12582912
hw.perflevel0.cpusperl2: 3
hw.perflevel0.name: Performance

@ghostghost added community-contribution Indicates that the PR has been added by a community member area-PAL-coreclr only for closed issues labels Sep 20, 2022
@neon-sunset
neon-sunset marked this pull request as ready for review September 20, 2022 11:50
@EgorBo

Copy link
Copy Markdown
Member

I am not sure we're interested in total size, L3 that we use to calculate gen0 budget is expected to be a single chip, like per core group or a unified one. It's likely that we already return total on other platform but we'd better fix those IMO.

The idea, how I understand it, is to be able to put the while gen0 into a single piece of cache memory in order to walk it efficiently (especially here on Workstation GC as macOS is unlikely to use Server GC)

@neon-sunset

neon-sunset commented Sep 20, 2022

Copy link
Copy Markdown
ContributorAuthor

Core groups within performance cluster on M1 chips (sorry, there's no official terminology so it's confusing) work mostly (as far as I understand) as power/clock domains, while they don't share L2, regular x86 don't do that either. They are, however, within the same cluster similar to single CCX of AMD CPU rather than two different ones.

This is mostly to account for the fact that no L3 data is available on osx-arm64. Even when not hitting L2, it appears that for now we can assume that SLC which effectively works like memory-side L3 is of similar/larger size to total L2 cache size. SLC for M1 is 8MB (12MB of L2$), Pro is 24MB and Max is 48MB.

My understanding is that other code paths already calculate total L2 size without even accounting for the fact whether it's shared or not if L3 number is unavailable so I think it will be reporting numbers closer to x86_64 counterparts.

If you have any benchmarks on hand or other links to look into to gauge the difference pre and post this change - please let me know!

As for which size of L2 is observable for CPU cores with low latency, it is unclear and reverse-engineered data varies.

See: https://www.realworldtech.com/forum/?threadid=205277&curpostid=205283 and https://www.anandtech.com/show/17024/apple-m1-max-performance-review/2

p.s.: fun cursed fact, performance cores on M1 have variable sizes of their respective L2 slices, M1 is 5-1-3-3 and M1 Pro/Max is 1-5-5-1 and 3-3-3-3 megabytes of L2$.

@EgorBo

Copy link
Copy Markdown
Member

If you have any benchmarks on hand or other links to look into to gauge the difference pre and post this change - please let me know!

You can try these #64576

and could you also measure the working set size difference, presumably it will be higher with this.

@mangod9

Copy link
Copy Markdown
Member

Hi @neon-sunset, is this an experimental PR, we could mark it as a draft. Looks like you are still running some perf tests to check what the impact is here?

@neon-sunset

neon-sunset commented Oct 24, 2022

Copy link
Copy Markdown
ContributorAuthor

Hi @neon-sunset, is this an experimental PR, we could mark it as a draft. Looks like you are still running some perf tests to check what the impact is here?

Yes, I haven't been able to work on it recently so if you could mark it as draft - please do and I will change it back to ready for review once there is data available to back up (or not) the suggested change. Thanks!

@ghost

Copy link
Copy Markdown

Draft Pull Request was automatically closed for 30 days of inactivity. Please let us know if you'd like to reopen it.

@ghostghost closed this Nov 23, 2022
@ghostghost locked as resolved and limited conversation to collaborators Dec 23, 2022
This pull request was closed.
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

area-PAL-coreclronly for closed issuescommunity-contributionIndicates that the PR has been added by a community member

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@neon-sunset@EgorBo@mangod9
, '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

Improve total L2 size calculation logic on osx-arm64 - #75881

Closed
neon-sunset wants to merge 2 commits into
dotnet:mainfrom
neon-sunset:fix-osx-arm64-l2-size-calc
Closed

Improve total L2 size calculation logic on osx-arm64#75881
neon-sunset wants to merge 2 commits into
dotnet:mainfrom
neon-sunset:fix-osx-arm64-l2-size-calc

Conversation

@neon-sunset

Copy link
Copy Markdown
Contributor

While looking at #75854 and double-checking sysctl behavior, I've noticed that on M1 Pro the actual value reported for hw.perflevel0.l2cachesize is 12582912 instead of roughly 24MB which is its actual L2 cache size.

However, sysctl has another key hw.perflevel0.cpusperl2 which allows us to calculate the total size of L2 of all performance cores.

macOS 13.0 22A5342f arm64 | M1 Pro 2E+6P
hw.perflevel0.physicalcpu: 6
hw.perflevel0.physicalcpu_max: 6
hw.perflevel0.logicalcpu: 6
hw.perflevel0.logicalcpu_max: 6
hw.perflevel0.l1icachesize: 196608
hw.perflevel0.l1dcachesize: 131072
hw.perflevel0.l2cachesize: 12582912
hw.perflevel0.cpusperl2: 3
hw.perflevel0.name: Performance

@ghostghost added community-contribution Indicates that the PR has been added by a community member area-PAL-coreclr only for closed issues labels Sep 20, 2022
@neon-sunset
neon-sunset marked this pull request as ready for review September 20, 2022 11:50
@EgorBo

Copy link
Copy Markdown
Member

I am not sure we're interested in total size, L3 that we use to calculate gen0 budget is expected to be a single chip, like per core group or a unified one. It's likely that we already return total on other platform but we'd better fix those IMO.

The idea, how I understand it, is to be able to put the while gen0 into a single piece of cache memory in order to walk it efficiently (especially here on Workstation GC as macOS is unlikely to use Server GC)

@neon-sunset

neon-sunset commented Sep 20, 2022

Copy link
Copy Markdown
ContributorAuthor

Core groups within performance cluster on M1 chips (sorry, there's no official terminology so it's confusing) work mostly (as far as I understand) as power/clock domains, while they don't share L2, regular x86 don't do that either. They are, however, within the same cluster similar to single CCX of AMD CPU rather than two different ones.

This is mostly to account for the fact that no L3 data is available on osx-arm64. Even when not hitting L2, it appears that for now we can assume that SLC which effectively works like memory-side L3 is of similar/larger size to total L2 cache size. SLC for M1 is 8MB (12MB of L2$), Pro is 24MB and Max is 48MB.

My understanding is that other code paths already calculate total L2 size without even accounting for the fact whether it's shared or not if L3 number is unavailable so I think it will be reporting numbers closer to x86_64 counterparts.

If you have any benchmarks on hand or other links to look into to gauge the difference pre and post this change - please let me know!

As for which size of L2 is observable for CPU cores with low latency, it is unclear and reverse-engineered data varies.

See: https://www.realworldtech.com/forum/?threadid=205277&curpostid=205283 and https://www.anandtech.com/show/17024/apple-m1-max-performance-review/2

p.s.: fun cursed fact, performance cores on M1 have variable sizes of their respective L2 slices, M1 is 5-1-3-3 and M1 Pro/Max is 1-5-5-1 and 3-3-3-3 megabytes of L2$.

@EgorBo

Copy link
Copy Markdown
Member

If you have any benchmarks on hand or other links to look into to gauge the difference pre and post this change - please let me know!

You can try these #64576

and could you also measure the working set size difference, presumably it will be higher with this.

@mangod9

Copy link
Copy Markdown
Member

Hi @neon-sunset, is this an experimental PR, we could mark it as a draft. Looks like you are still running some perf tests to check what the impact is here?

@neon-sunset

neon-sunset commented Oct 24, 2022

Copy link
Copy Markdown
ContributorAuthor

Hi @neon-sunset, is this an experimental PR, we could mark it as a draft. Looks like you are still running some perf tests to check what the impact is here?

Yes, I haven't been able to work on it recently so if you could mark it as draft - please do and I will change it back to ready for review once there is data available to back up (or not) the suggested change. Thanks!

@ghost

Copy link
Copy Markdown

Draft Pull Request was automatically closed for 30 days of inactivity. Please let us know if you'd like to reopen it.

@ghostghost closed this Nov 23, 2022
@ghostghost locked as resolved and limited conversation to collaborators Dec 23, 2022
This pull request was closed.
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

area-PAL-coreclronly for closed issuescommunity-contributionIndicates that the PR has been added by a community member

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@neon-sunset@EgorBo@mangod9
, '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

Improve total L2 size calculation logic on osx-arm64 - #75881

Closed
neon-sunset wants to merge 2 commits into
dotnet:mainfrom
neon-sunset:fix-osx-arm64-l2-size-calc
Closed

Improve total L2 size calculation logic on osx-arm64#75881
neon-sunset wants to merge 2 commits into
dotnet:mainfrom
neon-sunset:fix-osx-arm64-l2-size-calc

Conversation

@neon-sunset

Copy link
Copy Markdown
Contributor

While looking at #75854 and double-checking sysctl behavior, I've noticed that on M1 Pro the actual value reported for hw.perflevel0.l2cachesize is 12582912 instead of roughly 24MB which is its actual L2 cache size.

However, sysctl has another key hw.perflevel0.cpusperl2 which allows us to calculate the total size of L2 of all performance cores.

macOS 13.0 22A5342f arm64 | M1 Pro 2E+6P
hw.perflevel0.physicalcpu: 6
hw.perflevel0.physicalcpu_max: 6
hw.perflevel0.logicalcpu: 6
hw.perflevel0.logicalcpu_max: 6
hw.perflevel0.l1icachesize: 196608
hw.perflevel0.l1dcachesize: 131072
hw.perflevel0.l2cachesize: 12582912
hw.perflevel0.cpusperl2: 3
hw.perflevel0.name: Performance

@ghostghost added community-contribution Indicates that the PR has been added by a community member area-PAL-coreclr only for closed issues labels Sep 20, 2022
@neon-sunset
neon-sunset marked this pull request as ready for review September 20, 2022 11:50
@EgorBo

Copy link
Copy Markdown
Member

I am not sure we're interested in total size, L3 that we use to calculate gen0 budget is expected to be a single chip, like per core group or a unified one. It's likely that we already return total on other platform but we'd better fix those IMO.

The idea, how I understand it, is to be able to put the while gen0 into a single piece of cache memory in order to walk it efficiently (especially here on Workstation GC as macOS is unlikely to use Server GC)

@neon-sunset

neon-sunset commented Sep 20, 2022

Copy link
Copy Markdown
ContributorAuthor

Core groups within performance cluster on M1 chips (sorry, there's no official terminology so it's confusing) work mostly (as far as I understand) as power/clock domains, while they don't share L2, regular x86 don't do that either. They are, however, within the same cluster similar to single CCX of AMD CPU rather than two different ones.

This is mostly to account for the fact that no L3 data is available on osx-arm64. Even when not hitting L2, it appears that for now we can assume that SLC which effectively works like memory-side L3 is of similar/larger size to total L2 cache size. SLC for M1 is 8MB (12MB of L2$), Pro is 24MB and Max is 48MB.

My understanding is that other code paths already calculate total L2 size without even accounting for the fact whether it's shared or not if L3 number is unavailable so I think it will be reporting numbers closer to x86_64 counterparts.

If you have any benchmarks on hand or other links to look into to gauge the difference pre and post this change - please let me know!

As for which size of L2 is observable for CPU cores with low latency, it is unclear and reverse-engineered data varies.

See: https://www.realworldtech.com/forum/?threadid=205277&curpostid=205283 and https://www.anandtech.com/show/17024/apple-m1-max-performance-review/2

p.s.: fun cursed fact, performance cores on M1 have variable sizes of their respective L2 slices, M1 is 5-1-3-3 and M1 Pro/Max is 1-5-5-1 and 3-3-3-3 megabytes of L2$.

@EgorBo

Copy link
Copy Markdown
Member

If you have any benchmarks on hand or other links to look into to gauge the difference pre and post this change - please let me know!

You can try these #64576

and could you also measure the working set size difference, presumably it will be higher with this.

@mangod9

Copy link
Copy Markdown
Member

Hi @neon-sunset, is this an experimental PR, we could mark it as a draft. Looks like you are still running some perf tests to check what the impact is here?

@neon-sunset

neon-sunset commented Oct 24, 2022

Copy link
Copy Markdown
ContributorAuthor

Hi @neon-sunset, is this an experimental PR, we could mark it as a draft. Looks like you are still running some perf tests to check what the impact is here?

Yes, I haven't been able to work on it recently so if you could mark it as draft - please do and I will change it back to ready for review once there is data available to back up (or not) the suggested change. Thanks!

@ghost

Copy link
Copy Markdown

Draft Pull Request was automatically closed for 30 days of inactivity. Please let us know if you'd like to reopen it.

@ghostghost closed this Nov 23, 2022
@ghostghost locked as resolved and limited conversation to collaborators Dec 23, 2022
This pull request was closed.
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

area-PAL-coreclronly for closed issuescommunity-contributionIndicates that the PR has been added by a community member

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@neon-sunset@EgorBo@mangod9
, '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

Improve total L2 size calculation logic on osx-arm64 - #75881

Closed
neon-sunset wants to merge 2 commits into
dotnet:mainfrom
neon-sunset:fix-osx-arm64-l2-size-calc
Closed

Improve total L2 size calculation logic on osx-arm64#75881
neon-sunset wants to merge 2 commits into
dotnet:mainfrom
neon-sunset:fix-osx-arm64-l2-size-calc

Conversation

@neon-sunset

Copy link
Copy Markdown
Contributor

While looking at #75854 and double-checking sysctl behavior, I've noticed that on M1 Pro the actual value reported for hw.perflevel0.l2cachesize is 12582912 instead of roughly 24MB which is its actual L2 cache size.

However, sysctl has another key hw.perflevel0.cpusperl2 which allows us to calculate the total size of L2 of all performance cores.

macOS 13.0 22A5342f arm64 | M1 Pro 2E+6P
hw.perflevel0.physicalcpu: 6
hw.perflevel0.physicalcpu_max: 6
hw.perflevel0.logicalcpu: 6
hw.perflevel0.logicalcpu_max: 6
hw.perflevel0.l1icachesize: 196608
hw.perflevel0.l1dcachesize: 131072
hw.perflevel0.l2cachesize: 12582912
hw.perflevel0.cpusperl2: 3
hw.perflevel0.name: Performance

@ghostghost added community-contribution Indicates that the PR has been added by a community member area-PAL-coreclr only for closed issues labels Sep 20, 2022
@neon-sunset
neon-sunset marked this pull request as ready for review September 20, 2022 11:50
@EgorBo

Copy link
Copy Markdown
Member

I am not sure we're interested in total size, L3 that we use to calculate gen0 budget is expected to be a single chip, like per core group or a unified one. It's likely that we already return total on other platform but we'd better fix those IMO.

The idea, how I understand it, is to be able to put the while gen0 into a single piece of cache memory in order to walk it efficiently (especially here on Workstation GC as macOS is unlikely to use Server GC)

@neon-sunset

neon-sunset commented Sep 20, 2022

Copy link
Copy Markdown
ContributorAuthor

Core groups within performance cluster on M1 chips (sorry, there's no official terminology so it's confusing) work mostly (as far as I understand) as power/clock domains, while they don't share L2, regular x86 don't do that either. They are, however, within the same cluster similar to single CCX of AMD CPU rather than two different ones.

This is mostly to account for the fact that no L3 data is available on osx-arm64. Even when not hitting L2, it appears that for now we can assume that SLC which effectively works like memory-side L3 is of similar/larger size to total L2 cache size. SLC for M1 is 8MB (12MB of L2$), Pro is 24MB and Max is 48MB.

My understanding is that other code paths already calculate total L2 size without even accounting for the fact whether it's shared or not if L3 number is unavailable so I think it will be reporting numbers closer to x86_64 counterparts.

If you have any benchmarks on hand or other links to look into to gauge the difference pre and post this change - please let me know!

As for which size of L2 is observable for CPU cores with low latency, it is unclear and reverse-engineered data varies.

See: https://www.realworldtech.com/forum/?threadid=205277&curpostid=205283 and https://www.anandtech.com/show/17024/apple-m1-max-performance-review/2

p.s.: fun cursed fact, performance cores on M1 have variable sizes of their respective L2 slices, M1 is 5-1-3-3 and M1 Pro/Max is 1-5-5-1 and 3-3-3-3 megabytes of L2$.

@EgorBo

Copy link
Copy Markdown
Member

If you have any benchmarks on hand or other links to look into to gauge the difference pre and post this change - please let me know!

You can try these #64576

and could you also measure the working set size difference, presumably it will be higher with this.

@mangod9

Copy link
Copy Markdown
Member

Hi @neon-sunset, is this an experimental PR, we could mark it as a draft. Looks like you are still running some perf tests to check what the impact is here?

@neon-sunset

neon-sunset commented Oct 24, 2022

Copy link
Copy Markdown
ContributorAuthor

Hi @neon-sunset, is this an experimental PR, we could mark it as a draft. Looks like you are still running some perf tests to check what the impact is here?

Yes, I haven't been able to work on it recently so if you could mark it as draft - please do and I will change it back to ready for review once there is data available to back up (or not) the suggested change. Thanks!

@ghost

Copy link
Copy Markdown

Draft Pull Request was automatically closed for 30 days of inactivity. Please let us know if you'd like to reopen it.

@ghostghost closed this Nov 23, 2022
@ghostghost locked as resolved and limited conversation to collaborators Dec 23, 2022
This pull request was closed.
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

area-PAL-coreclronly for closed issuescommunity-contributionIndicates that the PR has been added by a community member

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@neon-sunset@EgorBo@mangod9