remove unnecessary Avx512VL ISA flags. - #103144

Merged
tannergooding merged 2 commits into
dotnet:mainfrom
Ruihan-Yin:compress-avx512-flags
Jun 29, 2024
Merged

remove unnecessary Avx512VL ISA flags.#103144
tannergooding merged 2 commits into
dotnet:mainfrom
Ruihan-Yin:compress-avx512-flags

Conversation

@Ruihan-Yin

Copy link
Copy Markdown
Member

More context in #103019 (comment)

To save some space in XArchIntrinsicConstants, this PR turns Avx512*_VL ISA flags per subset into a converged flag: Avx512F_VL, such that we can hold more ISAs within this enum, this will be the pre-work for the ongoing APX project.

@ghostghost added the needs-area-label An area label is needed to ensure this gets routed to the appropriate area owners label Jun 6, 2024
@dotnet-policy-servicedotnet-policy-serviceBot added the community-contribution Indicates that the PR has been added by a community member label Jun 6, 2024
@@ -73,17 +73,13 @@ private static class XArchIntrinsicConstants
public const int Avx512f = 0x8000;
public const int Avx512f_vl = 0x10000;

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can we just have this be Avx512vl, as that's the actual CPUID feature name and matches the casing we use elsewhere?

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I agree, will rename this part accordingly.

Comment on lines +81 to +82
public const int Avx10v1_v256 = 0x800000;
public const int Avx10v1_v512 = 0x1000000;

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It'd be nice to remove these as well.

The former is unnecessary and the latter is implied by Avx512F existing.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I can make this change, and just make sure, does this part have conflicting changes with the ongoing Avx10 PR? I know some changes happening there for this as well, but didn't follow closely.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

That PR is removing Avx10v1_v256, so removing it here as well should help avoid a conflict.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I saw Avx10v1_V256 was removed from InstructionSetDesc.txt, so what we want here is don't even define Avx10v1_V256 and Avx10v1_V512, and rely on EVEX to make sure JIT backend will correctly handle Avx10 nodes? Just to confirm.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Right. Avx10v1_v256 is just part of Avx10v1, so it's unnecessary.

Likewise, Avx10v1_v512 is really just Avx10v1 + Avx512, so doing those checks instead fits the need and saves us bits.

@Ruihan-YinRuihan-YinJun 11, 2024

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for the inputs,

There are duplicated implications there: https://github.com/dotnet/runtime/blob/main/src/coreclr/tools/Common/JitInterface/ThunkGenerator/InstructionSetDesc.txt#L141

Are they intended to be like this, or this shall be removed, I can make the changes if needed.

Edit:
If we remove Avx10v1_V512, then the node definitions here might need some refactoring? It looks fine to just remove it from XArchIntrinsicConstants but keep the definition as an ISA, and as mentioned, set InstructionSet_Avx10v1_V512 based on XArchIntrinsicConstants_Avx10v1 and XArchIntrinsicConstants_Avx512f

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Are they intended to be like this, or this shall be removed, I can make the changes if needed.

No and I'm actually fixing that in #103241

It looks fine to just remove it from XArchIntrinsicConstants but keep the definition as an ISA, and as mentioned, set InstructionSet_Avx10v1_V512 based on XArchIntrinsicConstants_Avx10v1 and XArchIntrinsicConstants_Avx512f

Right, this is what I had meant should happen.

Any refactoring that changes how InstructionSet_* works might be possible but would be a more involved change.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for the explanation, in that case, I can wait for this PR go in first, and I will handle the conflict accordingly.

@jkotas

Copy link
Copy Markdown
Member

You will also need to fix this to check that all feature bits are present for features described by multiple bits.

Comment on lines +52 to +65
switch (instructionSet)
{
case InstructionSet.X64_AVX10v1_V512:
case InstructionSet.X64_AVX10v1_V512_X64:
case InstructionSet.X64_AVX512F_VL:
case InstructionSet.X64_AVX512F_VL_X64:
case InstructionSet.X64_AVX512BW_VL:
case InstructionSet.X64_AVX512BW_VL_X64:
case InstructionSet.X64_AVX512CD_VL:
case InstructionSet.X64_AVX512CD_VL_X64:
case InstructionSet.X64_AVX512DQ_VL:
case InstructionSet.X64_AVX512DQ_VL_X64:
case InstructionSet.X64_AVX512VBMI_VL:
case InstructionSet.X64_AVX512VBMI_VL_X64:

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
switch(instructionSet)
{
caseInstructionSet.X64_AVX10v1_V512:
caseInstructionSet.X64_AVX10v1_V512_X64:
caseInstructionSet.X64_AVX512F_VL:
caseInstructionSet.X64_AVX512F_VL_X64:
caseInstructionSet.X64_AVX512BW_VL:
caseInstructionSet.X64_AVX512BW_VL_X64:
caseInstructionSet.X64_AVX512CD_VL:
caseInstructionSet.X64_AVX512CD_VL_X64:
caseInstructionSet.X64_AVX512DQ_VL:
caseInstructionSet.X64_AVX512DQ_VL_X64:
caseInstructionSet.X64_AVX512VBMI_VL:
caseInstructionSet.X64_AVX512VBMI_VL_X64:
if(!uint.IsPow2((uint)flag))
{

You should be able to just check whether the flag has one or more bits.

@Ruihan-Yin
Ruihan-Yinforce-pushed the compress-avx512-flags branch from 70c8947 to a1d8a65CompareJune 12, 2024 00:50
codeStream.EmitLdc(flag);
codeStream.Emit(ILOpcode.and);
codeStream.EmitLdc(flag);
codeStream.Emit(ILOpcode.beq);

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
codeStream.Emit(ILOpcode.beq);
codeStream.Emit(ILOpcode.ceq);

beq is "branch on equal". This is needs to be compare instead.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Corrected, thanks for pointing out!

@Ruihan-Yin

Copy link
Copy Markdown
MemberAuthor

rebased the branch to resolve conflicts.

I kept Avx10v1_V512 as an ISA to make it consistent with the node definition in hwintrinsicxarchlist.h. If we need further changes, I can try to make it within this PR.

The fails look like connection issue.

@Ruihan-Yin
Ruihan-Yin marked this pull request as ready for review June 12, 2024 16:30
@Ruihan-Yin

Ruihan-Yin commented Jun 18, 2024

Copy link
Copy Markdown
MemberAuthor

Hi @tannergooding,

Just making sure, I am looking at the #103241, in that PR, we have folded all the Avx512 bits into 1, is that expected moving on, or we are still looking for separate them out to be F+VL+BW+CD+DQ as discussed here. If not, I suppose the only thing left for this PR would be removing Avx10v1_V512?

Edit:
Conflicts have been resolved, I have only pushed the changes for Avx10v1 part first. For Avx512, I kept it to what has been changes in #103241, if we want to expand Avx512 flags, I will make the changes accordingly.

@Ruihan-Yin
Ruihan-Yinforce-pushed the compress-avx512-flags branch from ad4b0f9 to 613494eCompareJune 18, 2024 22:23
@am11am11 added area-CodeGen-coreclr CLR JIT compiler in src/coreclr/src/jit and related components such as SuperPMI avx512 Related to the AVX-512 architecture area-VM-coreclr and removed needs-area-label An area label is needed to ensure this gets routed to the appropriate area owners area-CodeGen-coreclr CLR JIT compiler in src/coreclr/src/jit and related components such as SuperPMI labels Jun 18, 2024
Comment threadsrc/native/minipal/cpufeatures.c
@dotnet-policy-service

Copy link
Copy Markdown
Contributor

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

Comment threadsrc/native/minipal/cpufeatures.c
@Ruihan-Yin

Copy link
Copy Markdown
MemberAuthor

Except known failures, the build fail looks like due to timeout, and not related the changes.

@tannergooding

Copy link
Copy Markdown
Member

Rerunning CI to get it in a clean state

@Ruihan-Yin

Copy link
Copy Markdown
MemberAuthor

Build Analysis has shown green, PR should be in clean state.

@tannergooding

Copy link
Copy Markdown
Member

@jkotas, did you have any other feedback here or can I merge once CI is showing green?

@jkotas

Copy link
Copy Markdown
Member

LGTM

@Ruihan-Yin

Copy link
Copy Markdown
MemberAuthor

image
I was not able to reproduce the CI fail locally.

From the call stack, it is more likely to be connection issue.

@tannergooding
tannergooding merged commit 9906682 into dotnet:mainJun 29, 2024
@Ruihan-Yin

Copy link
Copy Markdown
MemberAuthor

Thanks for all the suggestions and help!

@github-actionsgithub-actionsBot locked and limited conversation to collaborators Aug 1, 2024
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

area-System.Runtime.Intrinsicsavx512Related to the AVX-512 architecturecommunity-contributionIndicates that the PR has been added by a community member

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@Ruihan-Yin@jkotas@tannergooding@am11
, '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

remove unnecessary Avx512VL ISA flags. - #103144

Merged
tannergooding merged 2 commits into
dotnet:mainfrom
Ruihan-Yin:compress-avx512-flags
Jun 29, 2024
Merged

remove unnecessary Avx512VL ISA flags.#103144
tannergooding merged 2 commits into
dotnet:mainfrom
Ruihan-Yin:compress-avx512-flags

Conversation

@Ruihan-Yin

Copy link
Copy Markdown
Member

More context in #103019 (comment)

To save some space in XArchIntrinsicConstants, this PR turns Avx512*_VL ISA flags per subset into a converged flag: Avx512F_VL, such that we can hold more ISAs within this enum, this will be the pre-work for the ongoing APX project.

@ghostghost added the needs-area-label An area label is needed to ensure this gets routed to the appropriate area owners label Jun 6, 2024
@dotnet-policy-servicedotnet-policy-serviceBot added the community-contribution Indicates that the PR has been added by a community member label Jun 6, 2024
@@ -73,17 +73,13 @@ private static class XArchIntrinsicConstants
public const int Avx512f = 0x8000;
public const int Avx512f_vl = 0x10000;

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can we just have this be Avx512vl, as that's the actual CPUID feature name and matches the casing we use elsewhere?

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I agree, will rename this part accordingly.

Comment on lines +81 to +82
public const int Avx10v1_v256 = 0x800000;
public const int Avx10v1_v512 = 0x1000000;

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It'd be nice to remove these as well.

The former is unnecessary and the latter is implied by Avx512F existing.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I can make this change, and just make sure, does this part have conflicting changes with the ongoing Avx10 PR? I know some changes happening there for this as well, but didn't follow closely.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

That PR is removing Avx10v1_v256, so removing it here as well should help avoid a conflict.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I saw Avx10v1_V256 was removed from InstructionSetDesc.txt, so what we want here is don't even define Avx10v1_V256 and Avx10v1_V512, and rely on EVEX to make sure JIT backend will correctly handle Avx10 nodes? Just to confirm.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Right. Avx10v1_v256 is just part of Avx10v1, so it's unnecessary.

Likewise, Avx10v1_v512 is really just Avx10v1 + Avx512, so doing those checks instead fits the need and saves us bits.

@Ruihan-YinRuihan-YinJun 11, 2024

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for the inputs,

There are duplicated implications there: https://github.com/dotnet/runtime/blob/main/src/coreclr/tools/Common/JitInterface/ThunkGenerator/InstructionSetDesc.txt#L141

Are they intended to be like this, or this shall be removed, I can make the changes if needed.

Edit:
If we remove Avx10v1_V512, then the node definitions here might need some refactoring? It looks fine to just remove it from XArchIntrinsicConstants but keep the definition as an ISA, and as mentioned, set InstructionSet_Avx10v1_V512 based on XArchIntrinsicConstants_Avx10v1 and XArchIntrinsicConstants_Avx512f

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Are they intended to be like this, or this shall be removed, I can make the changes if needed.

No and I'm actually fixing that in #103241

It looks fine to just remove it from XArchIntrinsicConstants but keep the definition as an ISA, and as mentioned, set InstructionSet_Avx10v1_V512 based on XArchIntrinsicConstants_Avx10v1 and XArchIntrinsicConstants_Avx512f

Right, this is what I had meant should happen.

Any refactoring that changes how InstructionSet_* works might be possible but would be a more involved change.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for the explanation, in that case, I can wait for this PR go in first, and I will handle the conflict accordingly.

@jkotas

Copy link
Copy Markdown
Member

You will also need to fix this to check that all feature bits are present for features described by multiple bits.

Comment on lines +52 to +65
switch (instructionSet)
{
case InstructionSet.X64_AVX10v1_V512:
case InstructionSet.X64_AVX10v1_V512_X64:
case InstructionSet.X64_AVX512F_VL:
case InstructionSet.X64_AVX512F_VL_X64:
case InstructionSet.X64_AVX512BW_VL:
case InstructionSet.X64_AVX512BW_VL_X64:
case InstructionSet.X64_AVX512CD_VL:
case InstructionSet.X64_AVX512CD_VL_X64:
case InstructionSet.X64_AVX512DQ_VL:
case InstructionSet.X64_AVX512DQ_VL_X64:
case InstructionSet.X64_AVX512VBMI_VL:
case InstructionSet.X64_AVX512VBMI_VL_X64:

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
switch(instructionSet)
{
caseInstructionSet.X64_AVX10v1_V512:
caseInstructionSet.X64_AVX10v1_V512_X64:
caseInstructionSet.X64_AVX512F_VL:
caseInstructionSet.X64_AVX512F_VL_X64:
caseInstructionSet.X64_AVX512BW_VL:
caseInstructionSet.X64_AVX512BW_VL_X64:
caseInstructionSet.X64_AVX512CD_VL:
caseInstructionSet.X64_AVX512CD_VL_X64:
caseInstructionSet.X64_AVX512DQ_VL:
caseInstructionSet.X64_AVX512DQ_VL_X64:
caseInstructionSet.X64_AVX512VBMI_VL:
caseInstructionSet.X64_AVX512VBMI_VL_X64:
if(!uint.IsPow2((uint)flag))
{

You should be able to just check whether the flag has one or more bits.

@Ruihan-Yin
Ruihan-Yinforce-pushed the compress-avx512-flags branch from 70c8947 to a1d8a65CompareJune 12, 2024 00:50
codeStream.EmitLdc(flag);
codeStream.Emit(ILOpcode.and);
codeStream.EmitLdc(flag);
codeStream.Emit(ILOpcode.beq);

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
codeStream.Emit(ILOpcode.beq);
codeStream.Emit(ILOpcode.ceq);

beq is "branch on equal". This is needs to be compare instead.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Corrected, thanks for pointing out!

@Ruihan-Yin

Copy link
Copy Markdown
MemberAuthor

rebased the branch to resolve conflicts.

I kept Avx10v1_V512 as an ISA to make it consistent with the node definition in hwintrinsicxarchlist.h. If we need further changes, I can try to make it within this PR.

The fails look like connection issue.

@Ruihan-Yin
Ruihan-Yin marked this pull request as ready for review June 12, 2024 16:30
@Ruihan-Yin

Ruihan-Yin commented Jun 18, 2024

Copy link
Copy Markdown
MemberAuthor

Hi @tannergooding,

Just making sure, I am looking at the #103241, in that PR, we have folded all the Avx512 bits into 1, is that expected moving on, or we are still looking for separate them out to be F+VL+BW+CD+DQ as discussed here. If not, I suppose the only thing left for this PR would be removing Avx10v1_V512?

Edit:
Conflicts have been resolved, I have only pushed the changes for Avx10v1 part first. For Avx512, I kept it to what has been changes in #103241, if we want to expand Avx512 flags, I will make the changes accordingly.

@Ruihan-Yin
Ruihan-Yinforce-pushed the compress-avx512-flags branch from ad4b0f9 to 613494eCompareJune 18, 2024 22:23
@am11am11 added area-CodeGen-coreclr CLR JIT compiler in src/coreclr/src/jit and related components such as SuperPMI avx512 Related to the AVX-512 architecture area-VM-coreclr and removed needs-area-label An area label is needed to ensure this gets routed to the appropriate area owners area-CodeGen-coreclr CLR JIT compiler in src/coreclr/src/jit and related components such as SuperPMI labels Jun 18, 2024
Comment threadsrc/native/minipal/cpufeatures.c
@dotnet-policy-service

Copy link
Copy Markdown
Contributor

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

Comment threadsrc/native/minipal/cpufeatures.c
@Ruihan-Yin

Copy link
Copy Markdown
MemberAuthor

Except known failures, the build fail looks like due to timeout, and not related the changes.

@tannergooding

Copy link
Copy Markdown
Member

Rerunning CI to get it in a clean state

@Ruihan-Yin

Copy link
Copy Markdown
MemberAuthor

Build Analysis has shown green, PR should be in clean state.

@tannergooding

Copy link
Copy Markdown
Member

@jkotas, did you have any other feedback here or can I merge once CI is showing green?

@jkotas

Copy link
Copy Markdown
Member

LGTM

@Ruihan-Yin

Copy link
Copy Markdown
MemberAuthor

image
I was not able to reproduce the CI fail locally.

From the call stack, it is more likely to be connection issue.

@tannergooding
tannergooding merged commit 9906682 into dotnet:mainJun 29, 2024
@Ruihan-Yin

Copy link
Copy Markdown
MemberAuthor

Thanks for all the suggestions and help!

@github-actionsgithub-actionsBot locked and limited conversation to collaborators Aug 1, 2024
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

area-System.Runtime.Intrinsicsavx512Related to the AVX-512 architecturecommunity-contributionIndicates that the PR has been added by a community member

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@Ruihan-Yin@jkotas@tannergooding@am11
, '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

remove unnecessary Avx512VL ISA flags. - #103144

Merged
tannergooding merged 2 commits into
dotnet:mainfrom
Ruihan-Yin:compress-avx512-flags
Jun 29, 2024
Merged

remove unnecessary Avx512VL ISA flags.#103144
tannergooding merged 2 commits into
dotnet:mainfrom
Ruihan-Yin:compress-avx512-flags

Conversation

@Ruihan-Yin

Copy link
Copy Markdown
Member

More context in #103019 (comment)

To save some space in XArchIntrinsicConstants, this PR turns Avx512*_VL ISA flags per subset into a converged flag: Avx512F_VL, such that we can hold more ISAs within this enum, this will be the pre-work for the ongoing APX project.

@ghostghost added the needs-area-label An area label is needed to ensure this gets routed to the appropriate area owners label Jun 6, 2024
@dotnet-policy-servicedotnet-policy-serviceBot added the community-contribution Indicates that the PR has been added by a community member label Jun 6, 2024
@@ -73,17 +73,13 @@ private static class XArchIntrinsicConstants
public const int Avx512f = 0x8000;
public const int Avx512f_vl = 0x10000;

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can we just have this be Avx512vl, as that's the actual CPUID feature name and matches the casing we use elsewhere?

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I agree, will rename this part accordingly.

Comment on lines +81 to +82
public const int Avx10v1_v256 = 0x800000;
public const int Avx10v1_v512 = 0x1000000;

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It'd be nice to remove these as well.

The former is unnecessary and the latter is implied by Avx512F existing.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I can make this change, and just make sure, does this part have conflicting changes with the ongoing Avx10 PR? I know some changes happening there for this as well, but didn't follow closely.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

That PR is removing Avx10v1_v256, so removing it here as well should help avoid a conflict.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I saw Avx10v1_V256 was removed from InstructionSetDesc.txt, so what we want here is don't even define Avx10v1_V256 and Avx10v1_V512, and rely on EVEX to make sure JIT backend will correctly handle Avx10 nodes? Just to confirm.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Right. Avx10v1_v256 is just part of Avx10v1, so it's unnecessary.

Likewise, Avx10v1_v512 is really just Avx10v1 + Avx512, so doing those checks instead fits the need and saves us bits.

@Ruihan-YinRuihan-YinJun 11, 2024

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for the inputs,

There are duplicated implications there: https://github.com/dotnet/runtime/blob/main/src/coreclr/tools/Common/JitInterface/ThunkGenerator/InstructionSetDesc.txt#L141

Are they intended to be like this, or this shall be removed, I can make the changes if needed.

Edit:
If we remove Avx10v1_V512, then the node definitions here might need some refactoring? It looks fine to just remove it from XArchIntrinsicConstants but keep the definition as an ISA, and as mentioned, set InstructionSet_Avx10v1_V512 based on XArchIntrinsicConstants_Avx10v1 and XArchIntrinsicConstants_Avx512f

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Are they intended to be like this, or this shall be removed, I can make the changes if needed.

No and I'm actually fixing that in #103241

It looks fine to just remove it from XArchIntrinsicConstants but keep the definition as an ISA, and as mentioned, set InstructionSet_Avx10v1_V512 based on XArchIntrinsicConstants_Avx10v1 and XArchIntrinsicConstants_Avx512f

Right, this is what I had meant should happen.

Any refactoring that changes how InstructionSet_* works might be possible but would be a more involved change.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for the explanation, in that case, I can wait for this PR go in first, and I will handle the conflict accordingly.

@jkotas

Copy link
Copy Markdown
Member

You will also need to fix this to check that all feature bits are present for features described by multiple bits.

Comment on lines +52 to +65
switch (instructionSet)
{
case InstructionSet.X64_AVX10v1_V512:
case InstructionSet.X64_AVX10v1_V512_X64:
case InstructionSet.X64_AVX512F_VL:
case InstructionSet.X64_AVX512F_VL_X64:
case InstructionSet.X64_AVX512BW_VL:
case InstructionSet.X64_AVX512BW_VL_X64:
case InstructionSet.X64_AVX512CD_VL:
case InstructionSet.X64_AVX512CD_VL_X64:
case InstructionSet.X64_AVX512DQ_VL:
case InstructionSet.X64_AVX512DQ_VL_X64:
case InstructionSet.X64_AVX512VBMI_VL:
case InstructionSet.X64_AVX512VBMI_VL_X64:

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
switch(instructionSet)
{
caseInstructionSet.X64_AVX10v1_V512:
caseInstructionSet.X64_AVX10v1_V512_X64:
caseInstructionSet.X64_AVX512F_VL:
caseInstructionSet.X64_AVX512F_VL_X64:
caseInstructionSet.X64_AVX512BW_VL:
caseInstructionSet.X64_AVX512BW_VL_X64:
caseInstructionSet.X64_AVX512CD_VL:
caseInstructionSet.X64_AVX512CD_VL_X64:
caseInstructionSet.X64_AVX512DQ_VL:
caseInstructionSet.X64_AVX512DQ_VL_X64:
caseInstructionSet.X64_AVX512VBMI_VL:
caseInstructionSet.X64_AVX512VBMI_VL_X64:
if(!uint.IsPow2((uint)flag))
{

You should be able to just check whether the flag has one or more bits.

@Ruihan-Yin
Ruihan-Yinforce-pushed the compress-avx512-flags branch from 70c8947 to a1d8a65CompareJune 12, 2024 00:50
codeStream.EmitLdc(flag);
codeStream.Emit(ILOpcode.and);
codeStream.EmitLdc(flag);
codeStream.Emit(ILOpcode.beq);

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
codeStream.Emit(ILOpcode.beq);
codeStream.Emit(ILOpcode.ceq);

beq is "branch on equal". This is needs to be compare instead.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Corrected, thanks for pointing out!

@Ruihan-Yin

Copy link
Copy Markdown
MemberAuthor

rebased the branch to resolve conflicts.

I kept Avx10v1_V512 as an ISA to make it consistent with the node definition in hwintrinsicxarchlist.h. If we need further changes, I can try to make it within this PR.

The fails look like connection issue.

@Ruihan-Yin
Ruihan-Yin marked this pull request as ready for review June 12, 2024 16:30
@Ruihan-Yin

Ruihan-Yin commented Jun 18, 2024

Copy link
Copy Markdown
MemberAuthor

Hi @tannergooding,

Just making sure, I am looking at the #103241, in that PR, we have folded all the Avx512 bits into 1, is that expected moving on, or we are still looking for separate them out to be F+VL+BW+CD+DQ as discussed here. If not, I suppose the only thing left for this PR would be removing Avx10v1_V512?

Edit:
Conflicts have been resolved, I have only pushed the changes for Avx10v1 part first. For Avx512, I kept it to what has been changes in #103241, if we want to expand Avx512 flags, I will make the changes accordingly.

@Ruihan-Yin
Ruihan-Yinforce-pushed the compress-avx512-flags branch from ad4b0f9 to 613494eCompareJune 18, 2024 22:23
@am11am11 added area-CodeGen-coreclr CLR JIT compiler in src/coreclr/src/jit and related components such as SuperPMI avx512 Related to the AVX-512 architecture area-VM-coreclr and removed needs-area-label An area label is needed to ensure this gets routed to the appropriate area owners area-CodeGen-coreclr CLR JIT compiler in src/coreclr/src/jit and related components such as SuperPMI labels Jun 18, 2024
Comment threadsrc/native/minipal/cpufeatures.c
@dotnet-policy-service

Copy link
Copy Markdown
Contributor

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

Comment threadsrc/native/minipal/cpufeatures.c
@Ruihan-Yin

Copy link
Copy Markdown
MemberAuthor

Except known failures, the build fail looks like due to timeout, and not related the changes.

@tannergooding

Copy link
Copy Markdown
Member

Rerunning CI to get it in a clean state

@Ruihan-Yin

Copy link
Copy Markdown
MemberAuthor

Build Analysis has shown green, PR should be in clean state.

@tannergooding

Copy link
Copy Markdown
Member

@jkotas, did you have any other feedback here or can I merge once CI is showing green?

@jkotas

Copy link
Copy Markdown
Member

LGTM

@Ruihan-Yin

Copy link
Copy Markdown
MemberAuthor

image
I was not able to reproduce the CI fail locally.

From the call stack, it is more likely to be connection issue.

@tannergooding
tannergooding merged commit 9906682 into dotnet:mainJun 29, 2024
@Ruihan-Yin

Copy link
Copy Markdown
MemberAuthor

Thanks for all the suggestions and help!

@github-actionsgithub-actionsBot locked and limited conversation to collaborators Aug 1, 2024
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

area-System.Runtime.Intrinsicsavx512Related to the AVX-512 architecturecommunity-contributionIndicates that the PR has been added by a community member

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@Ruihan-Yin@jkotas@tannergooding@am11
, '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

remove unnecessary Avx512VL ISA flags. - #103144

Merged
tannergooding merged 2 commits into
dotnet:mainfrom
Ruihan-Yin:compress-avx512-flags
Jun 29, 2024
Merged

remove unnecessary Avx512VL ISA flags.#103144
tannergooding merged 2 commits into
dotnet:mainfrom
Ruihan-Yin:compress-avx512-flags

Conversation

@Ruihan-Yin

Copy link
Copy Markdown
Member

More context in #103019 (comment)

To save some space in XArchIntrinsicConstants, this PR turns Avx512*_VL ISA flags per subset into a converged flag: Avx512F_VL, such that we can hold more ISAs within this enum, this will be the pre-work for the ongoing APX project.

@ghostghost added the needs-area-label An area label is needed to ensure this gets routed to the appropriate area owners label Jun 6, 2024
@dotnet-policy-servicedotnet-policy-serviceBot added the community-contribution Indicates that the PR has been added by a community member label Jun 6, 2024
@@ -73,17 +73,13 @@ private static class XArchIntrinsicConstants
public const int Avx512f = 0x8000;
public const int Avx512f_vl = 0x10000;

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can we just have this be Avx512vl, as that's the actual CPUID feature name and matches the casing we use elsewhere?

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I agree, will rename this part accordingly.

Comment on lines +81 to +82
public const int Avx10v1_v256 = 0x800000;
public const int Avx10v1_v512 = 0x1000000;

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It'd be nice to remove these as well.

The former is unnecessary and the latter is implied by Avx512F existing.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I can make this change, and just make sure, does this part have conflicting changes with the ongoing Avx10 PR? I know some changes happening there for this as well, but didn't follow closely.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

That PR is removing Avx10v1_v256, so removing it here as well should help avoid a conflict.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I saw Avx10v1_V256 was removed from InstructionSetDesc.txt, so what we want here is don't even define Avx10v1_V256 and Avx10v1_V512, and rely on EVEX to make sure JIT backend will correctly handle Avx10 nodes? Just to confirm.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Right. Avx10v1_v256 is just part of Avx10v1, so it's unnecessary.

Likewise, Avx10v1_v512 is really just Avx10v1 + Avx512, so doing those checks instead fits the need and saves us bits.

@Ruihan-YinRuihan-YinJun 11, 2024

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for the inputs,

There are duplicated implications there: https://github.com/dotnet/runtime/blob/main/src/coreclr/tools/Common/JitInterface/ThunkGenerator/InstructionSetDesc.txt#L141

Are they intended to be like this, or this shall be removed, I can make the changes if needed.

Edit:
If we remove Avx10v1_V512, then the node definitions here might need some refactoring? It looks fine to just remove it from XArchIntrinsicConstants but keep the definition as an ISA, and as mentioned, set InstructionSet_Avx10v1_V512 based on XArchIntrinsicConstants_Avx10v1 and XArchIntrinsicConstants_Avx512f

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Are they intended to be like this, or this shall be removed, I can make the changes if needed.

No and I'm actually fixing that in #103241

It looks fine to just remove it from XArchIntrinsicConstants but keep the definition as an ISA, and as mentioned, set InstructionSet_Avx10v1_V512 based on XArchIntrinsicConstants_Avx10v1 and XArchIntrinsicConstants_Avx512f

Right, this is what I had meant should happen.

Any refactoring that changes how InstructionSet_* works might be possible but would be a more involved change.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for the explanation, in that case, I can wait for this PR go in first, and I will handle the conflict accordingly.

@jkotas

Copy link
Copy Markdown
Member

You will also need to fix this to check that all feature bits are present for features described by multiple bits.

Comment on lines +52 to +65
switch (instructionSet)
{
case InstructionSet.X64_AVX10v1_V512:
case InstructionSet.X64_AVX10v1_V512_X64:
case InstructionSet.X64_AVX512F_VL:
case InstructionSet.X64_AVX512F_VL_X64:
case InstructionSet.X64_AVX512BW_VL:
case InstructionSet.X64_AVX512BW_VL_X64:
case InstructionSet.X64_AVX512CD_VL:
case InstructionSet.X64_AVX512CD_VL_X64:
case InstructionSet.X64_AVX512DQ_VL:
case InstructionSet.X64_AVX512DQ_VL_X64:
case InstructionSet.X64_AVX512VBMI_VL:
case InstructionSet.X64_AVX512VBMI_VL_X64:

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
switch(instructionSet)
{
caseInstructionSet.X64_AVX10v1_V512:
caseInstructionSet.X64_AVX10v1_V512_X64:
caseInstructionSet.X64_AVX512F_VL:
caseInstructionSet.X64_AVX512F_VL_X64:
caseInstructionSet.X64_AVX512BW_VL:
caseInstructionSet.X64_AVX512BW_VL_X64:
caseInstructionSet.X64_AVX512CD_VL:
caseInstructionSet.X64_AVX512CD_VL_X64:
caseInstructionSet.X64_AVX512DQ_VL:
caseInstructionSet.X64_AVX512DQ_VL_X64:
caseInstructionSet.X64_AVX512VBMI_VL:
caseInstructionSet.X64_AVX512VBMI_VL_X64:
if(!uint.IsPow2((uint)flag))
{

You should be able to just check whether the flag has one or more bits.

@Ruihan-Yin
Ruihan-Yinforce-pushed the compress-avx512-flags branch from 70c8947 to a1d8a65CompareJune 12, 2024 00:50
codeStream.EmitLdc(flag);
codeStream.Emit(ILOpcode.and);
codeStream.EmitLdc(flag);
codeStream.Emit(ILOpcode.beq);

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
codeStream.Emit(ILOpcode.beq);
codeStream.Emit(ILOpcode.ceq);

beq is "branch on equal". This is needs to be compare instead.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Corrected, thanks for pointing out!

@Ruihan-Yin

Copy link
Copy Markdown
MemberAuthor

rebased the branch to resolve conflicts.

I kept Avx10v1_V512 as an ISA to make it consistent with the node definition in hwintrinsicxarchlist.h. If we need further changes, I can try to make it within this PR.

The fails look like connection issue.

@Ruihan-Yin
Ruihan-Yin marked this pull request as ready for review June 12, 2024 16:30
@Ruihan-Yin

Ruihan-Yin commented Jun 18, 2024

Copy link
Copy Markdown
MemberAuthor

Hi @tannergooding,

Just making sure, I am looking at the #103241, in that PR, we have folded all the Avx512 bits into 1, is that expected moving on, or we are still looking for separate them out to be F+VL+BW+CD+DQ as discussed here. If not, I suppose the only thing left for this PR would be removing Avx10v1_V512?

Edit:
Conflicts have been resolved, I have only pushed the changes for Avx10v1 part first. For Avx512, I kept it to what has been changes in #103241, if we want to expand Avx512 flags, I will make the changes accordingly.

@Ruihan-Yin
Ruihan-Yinforce-pushed the compress-avx512-flags branch from ad4b0f9 to 613494eCompareJune 18, 2024 22:23
@am11am11 added area-CodeGen-coreclr CLR JIT compiler in src/coreclr/src/jit and related components such as SuperPMI avx512 Related to the AVX-512 architecture area-VM-coreclr and removed needs-area-label An area label is needed to ensure this gets routed to the appropriate area owners area-CodeGen-coreclr CLR JIT compiler in src/coreclr/src/jit and related components such as SuperPMI labels Jun 18, 2024
Comment threadsrc/native/minipal/cpufeatures.c
@dotnet-policy-service

Copy link
Copy Markdown
Contributor

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

Comment threadsrc/native/minipal/cpufeatures.c
@Ruihan-Yin

Copy link
Copy Markdown
MemberAuthor

Except known failures, the build fail looks like due to timeout, and not related the changes.

@tannergooding

Copy link
Copy Markdown
Member

Rerunning CI to get it in a clean state

@Ruihan-Yin

Copy link
Copy Markdown
MemberAuthor

Build Analysis has shown green, PR should be in clean state.

@tannergooding

Copy link
Copy Markdown
Member

@jkotas, did you have any other feedback here or can I merge once CI is showing green?

@jkotas

Copy link
Copy Markdown
Member

LGTM

@Ruihan-Yin

Copy link
Copy Markdown
MemberAuthor

image
I was not able to reproduce the CI fail locally.

From the call stack, it is more likely to be connection issue.

@tannergooding
tannergooding merged commit 9906682 into dotnet:mainJun 29, 2024
@Ruihan-Yin

Copy link
Copy Markdown
MemberAuthor

Thanks for all the suggestions and help!

@github-actionsgithub-actionsBot locked and limited conversation to collaborators Aug 1, 2024
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

area-System.Runtime.Intrinsicsavx512Related to the AVX-512 architecturecommunity-contributionIndicates that the PR has been added by a community member

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@Ruihan-Yin@jkotas@tannergooding@am11
, '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

remove unnecessary Avx512VL ISA flags. - #103144

Merged
tannergooding merged 2 commits into
dotnet:mainfrom
Ruihan-Yin:compress-avx512-flags
Jun 29, 2024
Merged

remove unnecessary Avx512VL ISA flags.#103144
tannergooding merged 2 commits into
dotnet:mainfrom
Ruihan-Yin:compress-avx512-flags

Conversation

@Ruihan-Yin

Copy link
Copy Markdown
Member

More context in #103019 (comment)

To save some space in XArchIntrinsicConstants, this PR turns Avx512*_VL ISA flags per subset into a converged flag: Avx512F_VL, such that we can hold more ISAs within this enum, this will be the pre-work for the ongoing APX project.

@ghostghost added the needs-area-label An area label is needed to ensure this gets routed to the appropriate area owners label Jun 6, 2024
@dotnet-policy-servicedotnet-policy-serviceBot added the community-contribution Indicates that the PR has been added by a community member label Jun 6, 2024
@@ -73,17 +73,13 @@ private static class XArchIntrinsicConstants
public const int Avx512f = 0x8000;
public const int Avx512f_vl = 0x10000;

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can we just have this be Avx512vl, as that's the actual CPUID feature name and matches the casing we use elsewhere?

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I agree, will rename this part accordingly.

Comment on lines +81 to +82
public const int Avx10v1_v256 = 0x800000;
public const int Avx10v1_v512 = 0x1000000;

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It'd be nice to remove these as well.

The former is unnecessary and the latter is implied by Avx512F existing.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I can make this change, and just make sure, does this part have conflicting changes with the ongoing Avx10 PR? I know some changes happening there for this as well, but didn't follow closely.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

That PR is removing Avx10v1_v256, so removing it here as well should help avoid a conflict.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I saw Avx10v1_V256 was removed from InstructionSetDesc.txt, so what we want here is don't even define Avx10v1_V256 and Avx10v1_V512, and rely on EVEX to make sure JIT backend will correctly handle Avx10 nodes? Just to confirm.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Right. Avx10v1_v256 is just part of Avx10v1, so it's unnecessary.

Likewise, Avx10v1_v512 is really just Avx10v1 + Avx512, so doing those checks instead fits the need and saves us bits.

@Ruihan-YinRuihan-YinJun 11, 2024

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for the inputs,

There are duplicated implications there: https://github.com/dotnet/runtime/blob/main/src/coreclr/tools/Common/JitInterface/ThunkGenerator/InstructionSetDesc.txt#L141

Are they intended to be like this, or this shall be removed, I can make the changes if needed.

Edit:
If we remove Avx10v1_V512, then the node definitions here might need some refactoring? It looks fine to just remove it from XArchIntrinsicConstants but keep the definition as an ISA, and as mentioned, set InstructionSet_Avx10v1_V512 based on XArchIntrinsicConstants_Avx10v1 and XArchIntrinsicConstants_Avx512f

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Are they intended to be like this, or this shall be removed, I can make the changes if needed.

No and I'm actually fixing that in #103241

It looks fine to just remove it from XArchIntrinsicConstants but keep the definition as an ISA, and as mentioned, set InstructionSet_Avx10v1_V512 based on XArchIntrinsicConstants_Avx10v1 and XArchIntrinsicConstants_Avx512f

Right, this is what I had meant should happen.

Any refactoring that changes how InstructionSet_* works might be possible but would be a more involved change.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for the explanation, in that case, I can wait for this PR go in first, and I will handle the conflict accordingly.

@jkotas

Copy link
Copy Markdown
Member

You will also need to fix this to check that all feature bits are present for features described by multiple bits.

Comment on lines +52 to +65
switch (instructionSet)
{
case InstructionSet.X64_AVX10v1_V512:
case InstructionSet.X64_AVX10v1_V512_X64:
case InstructionSet.X64_AVX512F_VL:
case InstructionSet.X64_AVX512F_VL_X64:
case InstructionSet.X64_AVX512BW_VL:
case InstructionSet.X64_AVX512BW_VL_X64:
case InstructionSet.X64_AVX512CD_VL:
case InstructionSet.X64_AVX512CD_VL_X64:
case InstructionSet.X64_AVX512DQ_VL:
case InstructionSet.X64_AVX512DQ_VL_X64:
case InstructionSet.X64_AVX512VBMI_VL:
case InstructionSet.X64_AVX512VBMI_VL_X64:

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
switch(instructionSet)
{
caseInstructionSet.X64_AVX10v1_V512:
caseInstructionSet.X64_AVX10v1_V512_X64:
caseInstructionSet.X64_AVX512F_VL:
caseInstructionSet.X64_AVX512F_VL_X64:
caseInstructionSet.X64_AVX512BW_VL:
caseInstructionSet.X64_AVX512BW_VL_X64:
caseInstructionSet.X64_AVX512CD_VL:
caseInstructionSet.X64_AVX512CD_VL_X64:
caseInstructionSet.X64_AVX512DQ_VL:
caseInstructionSet.X64_AVX512DQ_VL_X64:
caseInstructionSet.X64_AVX512VBMI_VL:
caseInstructionSet.X64_AVX512VBMI_VL_X64:
if(!uint.IsPow2((uint)flag))
{

You should be able to just check whether the flag has one or more bits.

@Ruihan-Yin
Ruihan-Yinforce-pushed the compress-avx512-flags branch from 70c8947 to a1d8a65CompareJune 12, 2024 00:50
codeStream.EmitLdc(flag);
codeStream.Emit(ILOpcode.and);
codeStream.EmitLdc(flag);
codeStream.Emit(ILOpcode.beq);

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
codeStream.Emit(ILOpcode.beq);
codeStream.Emit(ILOpcode.ceq);

beq is "branch on equal". This is needs to be compare instead.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Corrected, thanks for pointing out!

@Ruihan-Yin

Copy link
Copy Markdown
MemberAuthor

rebased the branch to resolve conflicts.

I kept Avx10v1_V512 as an ISA to make it consistent with the node definition in hwintrinsicxarchlist.h. If we need further changes, I can try to make it within this PR.

The fails look like connection issue.

@Ruihan-Yin
Ruihan-Yin marked this pull request as ready for review June 12, 2024 16:30
@Ruihan-Yin

Ruihan-Yin commented Jun 18, 2024

Copy link
Copy Markdown
MemberAuthor

Hi @tannergooding,

Just making sure, I am looking at the #103241, in that PR, we have folded all the Avx512 bits into 1, is that expected moving on, or we are still looking for separate them out to be F+VL+BW+CD+DQ as discussed here. If not, I suppose the only thing left for this PR would be removing Avx10v1_V512?

Edit:
Conflicts have been resolved, I have only pushed the changes for Avx10v1 part first. For Avx512, I kept it to what has been changes in #103241, if we want to expand Avx512 flags, I will make the changes accordingly.

@Ruihan-Yin
Ruihan-Yinforce-pushed the compress-avx512-flags branch from ad4b0f9 to 613494eCompareJune 18, 2024 22:23
@am11am11 added area-CodeGen-coreclr CLR JIT compiler in src/coreclr/src/jit and related components such as SuperPMI avx512 Related to the AVX-512 architecture area-VM-coreclr and removed needs-area-label An area label is needed to ensure this gets routed to the appropriate area owners area-CodeGen-coreclr CLR JIT compiler in src/coreclr/src/jit and related components such as SuperPMI labels Jun 18, 2024
Comment threadsrc/native/minipal/cpufeatures.c
@dotnet-policy-service

Copy link
Copy Markdown
Contributor

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

Comment threadsrc/native/minipal/cpufeatures.c
@Ruihan-Yin

Copy link
Copy Markdown
MemberAuthor

Except known failures, the build fail looks like due to timeout, and not related the changes.

@tannergooding

Copy link
Copy Markdown
Member

Rerunning CI to get it in a clean state

@Ruihan-Yin

Copy link
Copy Markdown
MemberAuthor

Build Analysis has shown green, PR should be in clean state.

@tannergooding

Copy link
Copy Markdown
Member

@jkotas, did you have any other feedback here or can I merge once CI is showing green?

@jkotas

Copy link
Copy Markdown
Member

LGTM

@Ruihan-Yin

Copy link
Copy Markdown
MemberAuthor

image
I was not able to reproduce the CI fail locally.

From the call stack, it is more likely to be connection issue.

@tannergooding
tannergooding merged commit 9906682 into dotnet:mainJun 29, 2024
@Ruihan-Yin

Copy link
Copy Markdown
MemberAuthor

Thanks for all the suggestions and help!

@github-actionsgithub-actionsBot locked and limited conversation to collaborators Aug 1, 2024
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

area-System.Runtime.Intrinsicsavx512Related to the AVX-512 architecturecommunity-contributionIndicates that the PR has been added by a community member

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@Ruihan-Yin@jkotas@tannergooding@am11
, '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

remove unnecessary Avx512VL ISA flags. - #103144

Merged
tannergooding merged 2 commits into
dotnet:mainfrom
Ruihan-Yin:compress-avx512-flags
Jun 29, 2024
Merged

remove unnecessary Avx512VL ISA flags.#103144
tannergooding merged 2 commits into
dotnet:mainfrom
Ruihan-Yin:compress-avx512-flags

Conversation

@Ruihan-Yin

Copy link
Copy Markdown
Member

More context in #103019 (comment)

To save some space in XArchIntrinsicConstants, this PR turns Avx512*_VL ISA flags per subset into a converged flag: Avx512F_VL, such that we can hold more ISAs within this enum, this will be the pre-work for the ongoing APX project.

@ghostghost added the needs-area-label An area label is needed to ensure this gets routed to the appropriate area owners label Jun 6, 2024
@dotnet-policy-servicedotnet-policy-serviceBot added the community-contribution Indicates that the PR has been added by a community member label Jun 6, 2024
@@ -73,17 +73,13 @@ private static class XArchIntrinsicConstants
public const int Avx512f = 0x8000;
public const int Avx512f_vl = 0x10000;

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can we just have this be Avx512vl, as that's the actual CPUID feature name and matches the casing we use elsewhere?

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I agree, will rename this part accordingly.

Comment on lines +81 to +82
public const int Avx10v1_v256 = 0x800000;
public const int Avx10v1_v512 = 0x1000000;

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It'd be nice to remove these as well.

The former is unnecessary and the latter is implied by Avx512F existing.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I can make this change, and just make sure, does this part have conflicting changes with the ongoing Avx10 PR? I know some changes happening there for this as well, but didn't follow closely.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

That PR is removing Avx10v1_v256, so removing it here as well should help avoid a conflict.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I saw Avx10v1_V256 was removed from InstructionSetDesc.txt, so what we want here is don't even define Avx10v1_V256 and Avx10v1_V512, and rely on EVEX to make sure JIT backend will correctly handle Avx10 nodes? Just to confirm.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Right. Avx10v1_v256 is just part of Avx10v1, so it's unnecessary.

Likewise, Avx10v1_v512 is really just Avx10v1 + Avx512, so doing those checks instead fits the need and saves us bits.

@Ruihan-YinRuihan-YinJun 11, 2024

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for the inputs,

There are duplicated implications there: https://github.com/dotnet/runtime/blob/main/src/coreclr/tools/Common/JitInterface/ThunkGenerator/InstructionSetDesc.txt#L141

Are they intended to be like this, or this shall be removed, I can make the changes if needed.

Edit:
If we remove Avx10v1_V512, then the node definitions here might need some refactoring? It looks fine to just remove it from XArchIntrinsicConstants but keep the definition as an ISA, and as mentioned, set InstructionSet_Avx10v1_V512 based on XArchIntrinsicConstants_Avx10v1 and XArchIntrinsicConstants_Avx512f

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Are they intended to be like this, or this shall be removed, I can make the changes if needed.

No and I'm actually fixing that in #103241

It looks fine to just remove it from XArchIntrinsicConstants but keep the definition as an ISA, and as mentioned, set InstructionSet_Avx10v1_V512 based on XArchIntrinsicConstants_Avx10v1 and XArchIntrinsicConstants_Avx512f

Right, this is what I had meant should happen.

Any refactoring that changes how InstructionSet_* works might be possible but would be a more involved change.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for the explanation, in that case, I can wait for this PR go in first, and I will handle the conflict accordingly.

@jkotas

Copy link
Copy Markdown
Member

You will also need to fix this to check that all feature bits are present for features described by multiple bits.

Comment on lines +52 to +65
switch (instructionSet)
{
case InstructionSet.X64_AVX10v1_V512:
case InstructionSet.X64_AVX10v1_V512_X64:
case InstructionSet.X64_AVX512F_VL:
case InstructionSet.X64_AVX512F_VL_X64:
case InstructionSet.X64_AVX512BW_VL:
case InstructionSet.X64_AVX512BW_VL_X64:
case InstructionSet.X64_AVX512CD_VL:
case InstructionSet.X64_AVX512CD_VL_X64:
case InstructionSet.X64_AVX512DQ_VL:
case InstructionSet.X64_AVX512DQ_VL_X64:
case InstructionSet.X64_AVX512VBMI_VL:
case InstructionSet.X64_AVX512VBMI_VL_X64:

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
switch(instructionSet)
{
caseInstructionSet.X64_AVX10v1_V512:
caseInstructionSet.X64_AVX10v1_V512_X64:
caseInstructionSet.X64_AVX512F_VL:
caseInstructionSet.X64_AVX512F_VL_X64:
caseInstructionSet.X64_AVX512BW_VL:
caseInstructionSet.X64_AVX512BW_VL_X64:
caseInstructionSet.X64_AVX512CD_VL:
caseInstructionSet.X64_AVX512CD_VL_X64:
caseInstructionSet.X64_AVX512DQ_VL:
caseInstructionSet.X64_AVX512DQ_VL_X64:
caseInstructionSet.X64_AVX512VBMI_VL:
caseInstructionSet.X64_AVX512VBMI_VL_X64:
if(!uint.IsPow2((uint)flag))
{

You should be able to just check whether the flag has one or more bits.

@Ruihan-Yin
Ruihan-Yinforce-pushed the compress-avx512-flags branch from 70c8947 to a1d8a65CompareJune 12, 2024 00:50
codeStream.EmitLdc(flag);
codeStream.Emit(ILOpcode.and);
codeStream.EmitLdc(flag);
codeStream.Emit(ILOpcode.beq);

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
codeStream.Emit(ILOpcode.beq);
codeStream.Emit(ILOpcode.ceq);

beq is "branch on equal". This is needs to be compare instead.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Corrected, thanks for pointing out!

@Ruihan-Yin

Copy link
Copy Markdown
MemberAuthor

rebased the branch to resolve conflicts.

I kept Avx10v1_V512 as an ISA to make it consistent with the node definition in hwintrinsicxarchlist.h. If we need further changes, I can try to make it within this PR.

The fails look like connection issue.

@Ruihan-Yin
Ruihan-Yin marked this pull request as ready for review June 12, 2024 16:30
@Ruihan-Yin

Ruihan-Yin commented Jun 18, 2024

Copy link
Copy Markdown
MemberAuthor

Hi @tannergooding,

Just making sure, I am looking at the #103241, in that PR, we have folded all the Avx512 bits into 1, is that expected moving on, or we are still looking for separate them out to be F+VL+BW+CD+DQ as discussed here. If not, I suppose the only thing left for this PR would be removing Avx10v1_V512?

Edit:
Conflicts have been resolved, I have only pushed the changes for Avx10v1 part first. For Avx512, I kept it to what has been changes in #103241, if we want to expand Avx512 flags, I will make the changes accordingly.

@Ruihan-Yin
Ruihan-Yinforce-pushed the compress-avx512-flags branch from ad4b0f9 to 613494eCompareJune 18, 2024 22:23
@am11am11 added area-CodeGen-coreclr CLR JIT compiler in src/coreclr/src/jit and related components such as SuperPMI avx512 Related to the AVX-512 architecture area-VM-coreclr and removed needs-area-label An area label is needed to ensure this gets routed to the appropriate area owners area-CodeGen-coreclr CLR JIT compiler in src/coreclr/src/jit and related components such as SuperPMI labels Jun 18, 2024
Comment threadsrc/native/minipal/cpufeatures.c
@dotnet-policy-service

Copy link
Copy Markdown
Contributor

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

Comment threadsrc/native/minipal/cpufeatures.c
@Ruihan-Yin

Copy link
Copy Markdown
MemberAuthor

Except known failures, the build fail looks like due to timeout, and not related the changes.

@tannergooding

Copy link
Copy Markdown
Member

Rerunning CI to get it in a clean state

@Ruihan-Yin

Copy link
Copy Markdown
MemberAuthor

Build Analysis has shown green, PR should be in clean state.

@tannergooding

Copy link
Copy Markdown
Member

@jkotas, did you have any other feedback here or can I merge once CI is showing green?

@jkotas

Copy link
Copy Markdown
Member

LGTM

@Ruihan-Yin

Copy link
Copy Markdown
MemberAuthor

image
I was not able to reproduce the CI fail locally.

From the call stack, it is more likely to be connection issue.

@tannergooding
tannergooding merged commit 9906682 into dotnet:mainJun 29, 2024
@Ruihan-Yin

Copy link
Copy Markdown
MemberAuthor

Thanks for all the suggestions and help!

@github-actionsgithub-actionsBot locked and limited conversation to collaborators Aug 1, 2024
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

area-System.Runtime.Intrinsicsavx512Related to the AVX-512 architecturecommunity-contributionIndicates that the PR has been added by a community member

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@Ruihan-Yin@jkotas@tannergooding@am11
, '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

remove unnecessary Avx512VL ISA flags. - #103144

Merged
tannergooding merged 2 commits into
dotnet:mainfrom
Ruihan-Yin:compress-avx512-flags
Jun 29, 2024
Merged

remove unnecessary Avx512VL ISA flags.#103144
tannergooding merged 2 commits into
dotnet:mainfrom
Ruihan-Yin:compress-avx512-flags

Conversation

@Ruihan-Yin

Copy link
Copy Markdown
Member

More context in #103019 (comment)

To save some space in XArchIntrinsicConstants, this PR turns Avx512*_VL ISA flags per subset into a converged flag: Avx512F_VL, such that we can hold more ISAs within this enum, this will be the pre-work for the ongoing APX project.

@ghostghost added the needs-area-label An area label is needed to ensure this gets routed to the appropriate area owners label Jun 6, 2024
@dotnet-policy-servicedotnet-policy-serviceBot added the community-contribution Indicates that the PR has been added by a community member label Jun 6, 2024
@@ -73,17 +73,13 @@ private static class XArchIntrinsicConstants
public const int Avx512f = 0x8000;
public const int Avx512f_vl = 0x10000;

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can we just have this be Avx512vl, as that's the actual CPUID feature name and matches the casing we use elsewhere?

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I agree, will rename this part accordingly.

Comment on lines +81 to +82
public const int Avx10v1_v256 = 0x800000;
public const int Avx10v1_v512 = 0x1000000;

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It'd be nice to remove these as well.

The former is unnecessary and the latter is implied by Avx512F existing.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I can make this change, and just make sure, does this part have conflicting changes with the ongoing Avx10 PR? I know some changes happening there for this as well, but didn't follow closely.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

That PR is removing Avx10v1_v256, so removing it here as well should help avoid a conflict.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I saw Avx10v1_V256 was removed from InstructionSetDesc.txt, so what we want here is don't even define Avx10v1_V256 and Avx10v1_V512, and rely on EVEX to make sure JIT backend will correctly handle Avx10 nodes? Just to confirm.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Right. Avx10v1_v256 is just part of Avx10v1, so it's unnecessary.

Likewise, Avx10v1_v512 is really just Avx10v1 + Avx512, so doing those checks instead fits the need and saves us bits.

@Ruihan-YinRuihan-YinJun 11, 2024

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for the inputs,

There are duplicated implications there: https://github.com/dotnet/runtime/blob/main/src/coreclr/tools/Common/JitInterface/ThunkGenerator/InstructionSetDesc.txt#L141

Are they intended to be like this, or this shall be removed, I can make the changes if needed.

Edit:
If we remove Avx10v1_V512, then the node definitions here might need some refactoring? It looks fine to just remove it from XArchIntrinsicConstants but keep the definition as an ISA, and as mentioned, set InstructionSet_Avx10v1_V512 based on XArchIntrinsicConstants_Avx10v1 and XArchIntrinsicConstants_Avx512f

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Are they intended to be like this, or this shall be removed, I can make the changes if needed.

No and I'm actually fixing that in #103241

It looks fine to just remove it from XArchIntrinsicConstants but keep the definition as an ISA, and as mentioned, set InstructionSet_Avx10v1_V512 based on XArchIntrinsicConstants_Avx10v1 and XArchIntrinsicConstants_Avx512f

Right, this is what I had meant should happen.

Any refactoring that changes how InstructionSet_* works might be possible but would be a more involved change.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for the explanation, in that case, I can wait for this PR go in first, and I will handle the conflict accordingly.

@jkotas

Copy link
Copy Markdown
Member

You will also need to fix this to check that all feature bits are present for features described by multiple bits.

Comment on lines +52 to +65
switch (instructionSet)
{
case InstructionSet.X64_AVX10v1_V512:
case InstructionSet.X64_AVX10v1_V512_X64:
case InstructionSet.X64_AVX512F_VL:
case InstructionSet.X64_AVX512F_VL_X64:
case InstructionSet.X64_AVX512BW_VL:
case InstructionSet.X64_AVX512BW_VL_X64:
case InstructionSet.X64_AVX512CD_VL:
case InstructionSet.X64_AVX512CD_VL_X64:
case InstructionSet.X64_AVX512DQ_VL:
case InstructionSet.X64_AVX512DQ_VL_X64:
case InstructionSet.X64_AVX512VBMI_VL:
case InstructionSet.X64_AVX512VBMI_VL_X64:

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
switch(instructionSet)
{
caseInstructionSet.X64_AVX10v1_V512:
caseInstructionSet.X64_AVX10v1_V512_X64:
caseInstructionSet.X64_AVX512F_VL:
caseInstructionSet.X64_AVX512F_VL_X64:
caseInstructionSet.X64_AVX512BW_VL:
caseInstructionSet.X64_AVX512BW_VL_X64:
caseInstructionSet.X64_AVX512CD_VL:
caseInstructionSet.X64_AVX512CD_VL_X64:
caseInstructionSet.X64_AVX512DQ_VL:
caseInstructionSet.X64_AVX512DQ_VL_X64:
caseInstructionSet.X64_AVX512VBMI_VL:
caseInstructionSet.X64_AVX512VBMI_VL_X64:
if(!uint.IsPow2((uint)flag))
{

You should be able to just check whether the flag has one or more bits.

@Ruihan-Yin
Ruihan-Yinforce-pushed the compress-avx512-flags branch from 70c8947 to a1d8a65CompareJune 12, 2024 00:50
codeStream.EmitLdc(flag);
codeStream.Emit(ILOpcode.and);
codeStream.EmitLdc(flag);
codeStream.Emit(ILOpcode.beq);

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
codeStream.Emit(ILOpcode.beq);
codeStream.Emit(ILOpcode.ceq);

beq is "branch on equal". This is needs to be compare instead.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Corrected, thanks for pointing out!

@Ruihan-Yin

Copy link
Copy Markdown
MemberAuthor

rebased the branch to resolve conflicts.

I kept Avx10v1_V512 as an ISA to make it consistent with the node definition in hwintrinsicxarchlist.h. If we need further changes, I can try to make it within this PR.

The fails look like connection issue.

@Ruihan-Yin
Ruihan-Yin marked this pull request as ready for review June 12, 2024 16:30
@Ruihan-Yin

Ruihan-Yin commented Jun 18, 2024

Copy link
Copy Markdown
MemberAuthor

Hi @tannergooding,

Just making sure, I am looking at the #103241, in that PR, we have folded all the Avx512 bits into 1, is that expected moving on, or we are still looking for separate them out to be F+VL+BW+CD+DQ as discussed here. If not, I suppose the only thing left for this PR would be removing Avx10v1_V512?

Edit:
Conflicts have been resolved, I have only pushed the changes for Avx10v1 part first. For Avx512, I kept it to what has been changes in #103241, if we want to expand Avx512 flags, I will make the changes accordingly.

@Ruihan-Yin
Ruihan-Yinforce-pushed the compress-avx512-flags branch from ad4b0f9 to 613494eCompareJune 18, 2024 22:23
@am11am11 added area-CodeGen-coreclr CLR JIT compiler in src/coreclr/src/jit and related components such as SuperPMI avx512 Related to the AVX-512 architecture area-VM-coreclr and removed needs-area-label An area label is needed to ensure this gets routed to the appropriate area owners area-CodeGen-coreclr CLR JIT compiler in src/coreclr/src/jit and related components such as SuperPMI labels Jun 18, 2024
Comment threadsrc/native/minipal/cpufeatures.c
@dotnet-policy-service

Copy link
Copy Markdown
Contributor

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

Comment threadsrc/native/minipal/cpufeatures.c
@Ruihan-Yin

Copy link
Copy Markdown
MemberAuthor

Except known failures, the build fail looks like due to timeout, and not related the changes.

@tannergooding

Copy link
Copy Markdown
Member

Rerunning CI to get it in a clean state

@Ruihan-Yin

Copy link
Copy Markdown
MemberAuthor

Build Analysis has shown green, PR should be in clean state.

@tannergooding

Copy link
Copy Markdown
Member

@jkotas, did you have any other feedback here or can I merge once CI is showing green?

@jkotas

Copy link
Copy Markdown
Member

LGTM

@Ruihan-Yin

Copy link
Copy Markdown
MemberAuthor

image
I was not able to reproduce the CI fail locally.

From the call stack, it is more likely to be connection issue.

@tannergooding
tannergooding merged commit 9906682 into dotnet:mainJun 29, 2024
@Ruihan-Yin

Copy link
Copy Markdown
MemberAuthor

Thanks for all the suggestions and help!

@github-actionsgithub-actionsBot locked and limited conversation to collaborators Aug 1, 2024
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

area-System.Runtime.Intrinsicsavx512Related to the AVX-512 architecturecommunity-contributionIndicates that the PR has been added by a community member

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@Ruihan-Yin@jkotas@tannergooding@am11
, '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

remove unnecessary Avx512VL ISA flags. - #103144

Merged
tannergooding merged 2 commits into
dotnet:mainfrom
Ruihan-Yin:compress-avx512-flags
Jun 29, 2024
Merged

remove unnecessary Avx512VL ISA flags.#103144
tannergooding merged 2 commits into
dotnet:mainfrom
Ruihan-Yin:compress-avx512-flags

Conversation

@Ruihan-Yin

Copy link
Copy Markdown
Member

More context in #103019 (comment)

To save some space in XArchIntrinsicConstants, this PR turns Avx512*_VL ISA flags per subset into a converged flag: Avx512F_VL, such that we can hold more ISAs within this enum, this will be the pre-work for the ongoing APX project.

@ghostghost added the needs-area-label An area label is needed to ensure this gets routed to the appropriate area owners label Jun 6, 2024
@dotnet-policy-servicedotnet-policy-serviceBot added the community-contribution Indicates that the PR has been added by a community member label Jun 6, 2024
@@ -73,17 +73,13 @@ private static class XArchIntrinsicConstants
public const int Avx512f = 0x8000;
public const int Avx512f_vl = 0x10000;

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can we just have this be Avx512vl, as that's the actual CPUID feature name and matches the casing we use elsewhere?

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I agree, will rename this part accordingly.

Comment on lines +81 to +82
public const int Avx10v1_v256 = 0x800000;
public const int Avx10v1_v512 = 0x1000000;

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It'd be nice to remove these as well.

The former is unnecessary and the latter is implied by Avx512F existing.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I can make this change, and just make sure, does this part have conflicting changes with the ongoing Avx10 PR? I know some changes happening there for this as well, but didn't follow closely.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

That PR is removing Avx10v1_v256, so removing it here as well should help avoid a conflict.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I saw Avx10v1_V256 was removed from InstructionSetDesc.txt, so what we want here is don't even define Avx10v1_V256 and Avx10v1_V512, and rely on EVEX to make sure JIT backend will correctly handle Avx10 nodes? Just to confirm.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Right. Avx10v1_v256 is just part of Avx10v1, so it's unnecessary.

Likewise, Avx10v1_v512 is really just Avx10v1 + Avx512, so doing those checks instead fits the need and saves us bits.

@Ruihan-YinRuihan-YinJun 11, 2024

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for the inputs,

There are duplicated implications there: https://github.com/dotnet/runtime/blob/main/src/coreclr/tools/Common/JitInterface/ThunkGenerator/InstructionSetDesc.txt#L141

Are they intended to be like this, or this shall be removed, I can make the changes if needed.

Edit:
If we remove Avx10v1_V512, then the node definitions here might need some refactoring? It looks fine to just remove it from XArchIntrinsicConstants but keep the definition as an ISA, and as mentioned, set InstructionSet_Avx10v1_V512 based on XArchIntrinsicConstants_Avx10v1 and XArchIntrinsicConstants_Avx512f

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Are they intended to be like this, or this shall be removed, I can make the changes if needed.

No and I'm actually fixing that in #103241

It looks fine to just remove it from XArchIntrinsicConstants but keep the definition as an ISA, and as mentioned, set InstructionSet_Avx10v1_V512 based on XArchIntrinsicConstants_Avx10v1 and XArchIntrinsicConstants_Avx512f

Right, this is what I had meant should happen.

Any refactoring that changes how InstructionSet_* works might be possible but would be a more involved change.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for the explanation, in that case, I can wait for this PR go in first, and I will handle the conflict accordingly.

@jkotas

Copy link
Copy Markdown
Member

You will also need to fix this to check that all feature bits are present for features described by multiple bits.

Comment on lines +52 to +65
switch (instructionSet)
{
case InstructionSet.X64_AVX10v1_V512:
case InstructionSet.X64_AVX10v1_V512_X64:
case InstructionSet.X64_AVX512F_VL:
case InstructionSet.X64_AVX512F_VL_X64:
case InstructionSet.X64_AVX512BW_VL:
case InstructionSet.X64_AVX512BW_VL_X64:
case InstructionSet.X64_AVX512CD_VL:
case InstructionSet.X64_AVX512CD_VL_X64:
case InstructionSet.X64_AVX512DQ_VL:
case InstructionSet.X64_AVX512DQ_VL_X64:
case InstructionSet.X64_AVX512VBMI_VL:
case InstructionSet.X64_AVX512VBMI_VL_X64:

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
switch(instructionSet)
{
caseInstructionSet.X64_AVX10v1_V512:
caseInstructionSet.X64_AVX10v1_V512_X64:
caseInstructionSet.X64_AVX512F_VL:
caseInstructionSet.X64_AVX512F_VL_X64:
caseInstructionSet.X64_AVX512BW_VL:
caseInstructionSet.X64_AVX512BW_VL_X64:
caseInstructionSet.X64_AVX512CD_VL:
caseInstructionSet.X64_AVX512CD_VL_X64:
caseInstructionSet.X64_AVX512DQ_VL:
caseInstructionSet.X64_AVX512DQ_VL_X64:
caseInstructionSet.X64_AVX512VBMI_VL:
caseInstructionSet.X64_AVX512VBMI_VL_X64:
if(!uint.IsPow2((uint)flag))
{

You should be able to just check whether the flag has one or more bits.

@Ruihan-Yin
Ruihan-Yinforce-pushed the compress-avx512-flags branch from 70c8947 to a1d8a65CompareJune 12, 2024 00:50
codeStream.EmitLdc(flag);
codeStream.Emit(ILOpcode.and);
codeStream.EmitLdc(flag);
codeStream.Emit(ILOpcode.beq);

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
codeStream.Emit(ILOpcode.beq);
codeStream.Emit(ILOpcode.ceq);

beq is "branch on equal". This is needs to be compare instead.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Corrected, thanks for pointing out!

@Ruihan-Yin

Copy link
Copy Markdown
MemberAuthor

rebased the branch to resolve conflicts.

I kept Avx10v1_V512 as an ISA to make it consistent with the node definition in hwintrinsicxarchlist.h. If we need further changes, I can try to make it within this PR.

The fails look like connection issue.

@Ruihan-Yin
Ruihan-Yin marked this pull request as ready for review June 12, 2024 16:30
@Ruihan-Yin

Ruihan-Yin commented Jun 18, 2024

Copy link
Copy Markdown
MemberAuthor

Hi @tannergooding,

Just making sure, I am looking at the #103241, in that PR, we have folded all the Avx512 bits into 1, is that expected moving on, or we are still looking for separate them out to be F+VL+BW+CD+DQ as discussed here. If not, I suppose the only thing left for this PR would be removing Avx10v1_V512?

Edit:
Conflicts have been resolved, I have only pushed the changes for Avx10v1 part first. For Avx512, I kept it to what has been changes in #103241, if we want to expand Avx512 flags, I will make the changes accordingly.

@Ruihan-Yin
Ruihan-Yinforce-pushed the compress-avx512-flags branch from ad4b0f9 to 613494eCompareJune 18, 2024 22:23
@am11am11 added area-CodeGen-coreclr CLR JIT compiler in src/coreclr/src/jit and related components such as SuperPMI avx512 Related to the AVX-512 architecture area-VM-coreclr and removed needs-area-label An area label is needed to ensure this gets routed to the appropriate area owners area-CodeGen-coreclr CLR JIT compiler in src/coreclr/src/jit and related components such as SuperPMI labels Jun 18, 2024
Comment threadsrc/native/minipal/cpufeatures.c
@dotnet-policy-service

Copy link
Copy Markdown
Contributor

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

Comment threadsrc/native/minipal/cpufeatures.c
@Ruihan-Yin

Copy link
Copy Markdown
MemberAuthor

Except known failures, the build fail looks like due to timeout, and not related the changes.

@tannergooding

Copy link
Copy Markdown
Member

Rerunning CI to get it in a clean state

@Ruihan-Yin

Copy link
Copy Markdown
MemberAuthor

Build Analysis has shown green, PR should be in clean state.

@tannergooding

Copy link
Copy Markdown
Member

@jkotas, did you have any other feedback here or can I merge once CI is showing green?

@jkotas

Copy link
Copy Markdown
Member

LGTM

@Ruihan-Yin

Copy link
Copy Markdown
MemberAuthor

image
I was not able to reproduce the CI fail locally.

From the call stack, it is more likely to be connection issue.

@tannergooding
tannergooding merged commit 9906682 into dotnet:mainJun 29, 2024
@Ruihan-Yin

Copy link
Copy Markdown
MemberAuthor

Thanks for all the suggestions and help!

@github-actionsgithub-actionsBot locked and limited conversation to collaborators Aug 1, 2024
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

area-System.Runtime.Intrinsicsavx512Related to the AVX-512 architecturecommunity-contributionIndicates that the PR has been added by a community member

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@Ruihan-Yin@jkotas@tannergooding@am11