Update Preview/Experimental Attributes in Intrinsics - #105579

Merged
jeffhandley merged 10 commits into
dotnet:mainfrom
jeffhandley:jeffhandley/intrinsics-preview
Jul 30, 2024
Merged

Update Preview/Experimental Attributes in Intrinsics#105579
jeffhandley merged 10 commits into
dotnet:mainfrom
jeffhandley:jeffhandley/intrinsics-preview

Conversation

@jeffhandley

@jeffhandleyjeffhandley commented Jul 26, 2024

Copy link
Copy Markdown
Member

This PR includes 4 changes to preview/experimental attributes (each as a separate commit):

  1. Arm.Sve is switched from [RequiresPreviewFeatures] to [Experimental] with SYSLIB5003
    • These are experimental APIs that do not require preview features from other parts of the product
    • This allows usage of these APIs by only suppressing SYSLIB5003 instead of fully opting into preview features across the stack
  2. X86.AvxVnni is no longer in preview; the APIs are now stable
  3. X86.X86Base.DivRem is switched from [RequiresPreviewFeatures] to [Experimental] with SYSLIB5004
  4. GenericVectorTests had an unnecessary [RequiresPreviewFeatures] left from when generic math was preview

@ghostghost added needs-area-label An area label is needed to ensure this gets routed to the appropriate area owners new-api-needs-documentation labels Jul 26, 2024
@ghost

This comment was marked as resolved.

1 similar comment
@ghost

This comment was marked as duplicate.

@jeffhandleyjeffhandley added this to the 9.0.0 milestone Jul 26, 2024
@jeffhandleyjeffhandley added area-System.Runtime.Intrinsics and removed needs-area-label An area label is needed to ensure this gets routed to the appropriate area owners new-api-needs-documentation labels Jul 26, 2024
@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.

@stephentoub

Copy link
Copy Markdown
Member

X86.X86Base.DivRem does not require preview features. There are still JIT opportunities to improve performance, but users should not need to opt into preview features to use the API

The presence of this attribute seems to be how we're communicating it's not actually ready for folks to use, e.g.
#99747 (comment)
Has this changed?

@jeffhandley

Copy link
Copy Markdown
MemberAuthor

X86.X86Base.DivRem does not require preview features

@kunalspathak and @tannergooding indicated in an offline chat last week that we could remove the preview/experimental annotation, but nothing has changed on its performance. Thanks for pointing to that discussion, @stephentoub.

@tannergooding, based on that thread, I suggest we retain an annotation on this API, but switch it from [RequiresPreviewFeatures] to [Experimental].

@tannergooding

Copy link
Copy Markdown
Member

The consideration here is that DivRem is stable; however, there's some additional JIT work needed to ensure it performs "optimally" and that may be unexpected to users given that it is a platform specific hardware intrinsic.

Its something that could probably be just called out in the documentation as its not overall different from other cases where alternative patterns or APIs may be better performing. -- For example, using Sse41.BlendVariable can often be worse than using Vector128.ConditionalSelect as its less portable and more strict on what needs to be emitted.

@tannergooding

Copy link
Copy Markdown
Member

That is, I think that overall its fine at this point to remove the attribute

We have many cases where a given platform specific intrinsic may be subtly "worse" than using an xplat API (in this case its X86Base.DivRem vs int.DivRem). So while there's more JIT work to be done, the API itself is still considered stable and so continuing to mark it as Experimental or Preview may give a worse impression than simply covering the consideration in docs or with an analyzer (which we have approved, just not yet implemented)

That's not a strong preference though, so if anyone want to push back I'm fine with keeping it. I would prefer switching to Experimental though if we do keep any attribute, as that's less strict and easier to document that its just because perf may be suboptimal compared to T.DivRem in some cases

@stephentoub

Copy link
Copy Markdown
Member

So while there's more JIT work to be done

Is it a lot more work?

I don't have a strong opinion about it either, it just seems we marked it as preview/experimental because that work hadn't been done, but now we're removing the attribution without having done the work. In which case I question what changed, e.g. did we change our minds, did enough work happen to make us more comfortable with it, will we always dissuade folks from using the API (in which case maybe it shouldn't have been added publicly in the first place and should possibly be removed), etc.

@tannergooding

Copy link
Copy Markdown
Member

More general work has happened and its better than it had been, but its still not "quite there". The work could likely be finished in early .NET 10 if it was scheduled as top down work, rather than being left as "nice to have".

I'd be happy with changing it to be Experimental for .NET 9 as well; just noting that I don't think its strictly necessary given the above and the general considerations that platform specific APIs are not always the most optimal way to do a given operation.

@jeffhandley

Copy link
Copy Markdown
MemberAuthor

Thanks @stephentoub and @tannergooding. I'll switch DivRem over to [Experimental] for now (9.0.0), and before we remove it, we'll try to reach a point of understanding more broadly what we want to do with intrinsics APIs in this perf situation.

@jeffhandley
jeffhandley merged commit 50bc6a1 into dotnet:mainJul 30, 2024
@jeffhandley
jeffhandley deleted the jeffhandley/intrinsics-preview branch July 30, 2024 23:20
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Aug 30, 2024
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@jeffhandley@stephentoub@tannergooding
, '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

Update Preview/Experimental Attributes in Intrinsics - #105579

Merged
jeffhandley merged 10 commits into
dotnet:mainfrom
jeffhandley:jeffhandley/intrinsics-preview
Jul 30, 2024
Merged

Update Preview/Experimental Attributes in Intrinsics#105579
jeffhandley merged 10 commits into
dotnet:mainfrom
jeffhandley:jeffhandley/intrinsics-preview

Conversation

@jeffhandley

@jeffhandleyjeffhandley commented Jul 26, 2024

Copy link
Copy Markdown
Member

This PR includes 4 changes to preview/experimental attributes (each as a separate commit):

  1. Arm.Sve is switched from [RequiresPreviewFeatures] to [Experimental] with SYSLIB5003
    • These are experimental APIs that do not require preview features from other parts of the product
    • This allows usage of these APIs by only suppressing SYSLIB5003 instead of fully opting into preview features across the stack
  2. X86.AvxVnni is no longer in preview; the APIs are now stable
  3. X86.X86Base.DivRem is switched from [RequiresPreviewFeatures] to [Experimental] with SYSLIB5004
  4. GenericVectorTests had an unnecessary [RequiresPreviewFeatures] left from when generic math was preview

@ghostghost added needs-area-label An area label is needed to ensure this gets routed to the appropriate area owners new-api-needs-documentation labels Jul 26, 2024
@ghost

This comment was marked as resolved.

1 similar comment
@ghost

This comment was marked as duplicate.

@jeffhandleyjeffhandley added this to the 9.0.0 milestone Jul 26, 2024
@jeffhandleyjeffhandley added area-System.Runtime.Intrinsics and removed needs-area-label An area label is needed to ensure this gets routed to the appropriate area owners new-api-needs-documentation labels Jul 26, 2024
@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.

@stephentoub

Copy link
Copy Markdown
Member

X86.X86Base.DivRem does not require preview features. There are still JIT opportunities to improve performance, but users should not need to opt into preview features to use the API

The presence of this attribute seems to be how we're communicating it's not actually ready for folks to use, e.g.
#99747 (comment)
Has this changed?

@jeffhandley

Copy link
Copy Markdown
MemberAuthor

X86.X86Base.DivRem does not require preview features

@kunalspathak and @tannergooding indicated in an offline chat last week that we could remove the preview/experimental annotation, but nothing has changed on its performance. Thanks for pointing to that discussion, @stephentoub.

@tannergooding, based on that thread, I suggest we retain an annotation on this API, but switch it from [RequiresPreviewFeatures] to [Experimental].

@tannergooding

Copy link
Copy Markdown
Member

The consideration here is that DivRem is stable; however, there's some additional JIT work needed to ensure it performs "optimally" and that may be unexpected to users given that it is a platform specific hardware intrinsic.

Its something that could probably be just called out in the documentation as its not overall different from other cases where alternative patterns or APIs may be better performing. -- For example, using Sse41.BlendVariable can often be worse than using Vector128.ConditionalSelect as its less portable and more strict on what needs to be emitted.

@tannergooding

Copy link
Copy Markdown
Member

That is, I think that overall its fine at this point to remove the attribute

We have many cases where a given platform specific intrinsic may be subtly "worse" than using an xplat API (in this case its X86Base.DivRem vs int.DivRem). So while there's more JIT work to be done, the API itself is still considered stable and so continuing to mark it as Experimental or Preview may give a worse impression than simply covering the consideration in docs or with an analyzer (which we have approved, just not yet implemented)

That's not a strong preference though, so if anyone want to push back I'm fine with keeping it. I would prefer switching to Experimental though if we do keep any attribute, as that's less strict and easier to document that its just because perf may be suboptimal compared to T.DivRem in some cases

@stephentoub

Copy link
Copy Markdown
Member

So while there's more JIT work to be done

Is it a lot more work?

I don't have a strong opinion about it either, it just seems we marked it as preview/experimental because that work hadn't been done, but now we're removing the attribution without having done the work. In which case I question what changed, e.g. did we change our minds, did enough work happen to make us more comfortable with it, will we always dissuade folks from using the API (in which case maybe it shouldn't have been added publicly in the first place and should possibly be removed), etc.

@tannergooding

Copy link
Copy Markdown
Member

More general work has happened and its better than it had been, but its still not "quite there". The work could likely be finished in early .NET 10 if it was scheduled as top down work, rather than being left as "nice to have".

I'd be happy with changing it to be Experimental for .NET 9 as well; just noting that I don't think its strictly necessary given the above and the general considerations that platform specific APIs are not always the most optimal way to do a given operation.

@jeffhandley

Copy link
Copy Markdown
MemberAuthor

Thanks @stephentoub and @tannergooding. I'll switch DivRem over to [Experimental] for now (9.0.0), and before we remove it, we'll try to reach a point of understanding more broadly what we want to do with intrinsics APIs in this perf situation.

@jeffhandley
jeffhandley merged commit 50bc6a1 into dotnet:mainJul 30, 2024
@jeffhandley
jeffhandley deleted the jeffhandley/intrinsics-preview branch July 30, 2024 23:20
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Aug 30, 2024
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@jeffhandley@stephentoub@tannergooding
, '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

Update Preview/Experimental Attributes in Intrinsics - #105579

Merged
jeffhandley merged 10 commits into
dotnet:mainfrom
jeffhandley:jeffhandley/intrinsics-preview
Jul 30, 2024
Merged

Update Preview/Experimental Attributes in Intrinsics#105579
jeffhandley merged 10 commits into
dotnet:mainfrom
jeffhandley:jeffhandley/intrinsics-preview

Conversation

@jeffhandley

@jeffhandleyjeffhandley commented Jul 26, 2024

Copy link
Copy Markdown
Member

This PR includes 4 changes to preview/experimental attributes (each as a separate commit):

  1. Arm.Sve is switched from [RequiresPreviewFeatures] to [Experimental] with SYSLIB5003
    • These are experimental APIs that do not require preview features from other parts of the product
    • This allows usage of these APIs by only suppressing SYSLIB5003 instead of fully opting into preview features across the stack
  2. X86.AvxVnni is no longer in preview; the APIs are now stable
  3. X86.X86Base.DivRem is switched from [RequiresPreviewFeatures] to [Experimental] with SYSLIB5004
  4. GenericVectorTests had an unnecessary [RequiresPreviewFeatures] left from when generic math was preview

@ghostghost added needs-area-label An area label is needed to ensure this gets routed to the appropriate area owners new-api-needs-documentation labels Jul 26, 2024
@ghost

This comment was marked as resolved.

1 similar comment
@ghost

This comment was marked as duplicate.

@jeffhandleyjeffhandley added this to the 9.0.0 milestone Jul 26, 2024
@jeffhandleyjeffhandley added area-System.Runtime.Intrinsics and removed needs-area-label An area label is needed to ensure this gets routed to the appropriate area owners new-api-needs-documentation labels Jul 26, 2024
@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.

@stephentoub

Copy link
Copy Markdown
Member

X86.X86Base.DivRem does not require preview features. There are still JIT opportunities to improve performance, but users should not need to opt into preview features to use the API

The presence of this attribute seems to be how we're communicating it's not actually ready for folks to use, e.g.
#99747 (comment)
Has this changed?

@jeffhandley

Copy link
Copy Markdown
MemberAuthor

X86.X86Base.DivRem does not require preview features

@kunalspathak and @tannergooding indicated in an offline chat last week that we could remove the preview/experimental annotation, but nothing has changed on its performance. Thanks for pointing to that discussion, @stephentoub.

@tannergooding, based on that thread, I suggest we retain an annotation on this API, but switch it from [RequiresPreviewFeatures] to [Experimental].

@tannergooding

Copy link
Copy Markdown
Member

The consideration here is that DivRem is stable; however, there's some additional JIT work needed to ensure it performs "optimally" and that may be unexpected to users given that it is a platform specific hardware intrinsic.

Its something that could probably be just called out in the documentation as its not overall different from other cases where alternative patterns or APIs may be better performing. -- For example, using Sse41.BlendVariable can often be worse than using Vector128.ConditionalSelect as its less portable and more strict on what needs to be emitted.

@tannergooding

Copy link
Copy Markdown
Member

That is, I think that overall its fine at this point to remove the attribute

We have many cases where a given platform specific intrinsic may be subtly "worse" than using an xplat API (in this case its X86Base.DivRem vs int.DivRem). So while there's more JIT work to be done, the API itself is still considered stable and so continuing to mark it as Experimental or Preview may give a worse impression than simply covering the consideration in docs or with an analyzer (which we have approved, just not yet implemented)

That's not a strong preference though, so if anyone want to push back I'm fine with keeping it. I would prefer switching to Experimental though if we do keep any attribute, as that's less strict and easier to document that its just because perf may be suboptimal compared to T.DivRem in some cases

@stephentoub

Copy link
Copy Markdown
Member

So while there's more JIT work to be done

Is it a lot more work?

I don't have a strong opinion about it either, it just seems we marked it as preview/experimental because that work hadn't been done, but now we're removing the attribution without having done the work. In which case I question what changed, e.g. did we change our minds, did enough work happen to make us more comfortable with it, will we always dissuade folks from using the API (in which case maybe it shouldn't have been added publicly in the first place and should possibly be removed), etc.

@tannergooding

Copy link
Copy Markdown
Member

More general work has happened and its better than it had been, but its still not "quite there". The work could likely be finished in early .NET 10 if it was scheduled as top down work, rather than being left as "nice to have".

I'd be happy with changing it to be Experimental for .NET 9 as well; just noting that I don't think its strictly necessary given the above and the general considerations that platform specific APIs are not always the most optimal way to do a given operation.

@jeffhandley

Copy link
Copy Markdown
MemberAuthor

Thanks @stephentoub and @tannergooding. I'll switch DivRem over to [Experimental] for now (9.0.0), and before we remove it, we'll try to reach a point of understanding more broadly what we want to do with intrinsics APIs in this perf situation.

@jeffhandley
jeffhandley merged commit 50bc6a1 into dotnet:mainJul 30, 2024
@jeffhandley
jeffhandley deleted the jeffhandley/intrinsics-preview branch July 30, 2024 23:20
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Aug 30, 2024
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@jeffhandley@stephentoub@tannergooding
, '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

Update Preview/Experimental Attributes in Intrinsics - #105579

Merged
jeffhandley merged 10 commits into
dotnet:mainfrom
jeffhandley:jeffhandley/intrinsics-preview
Jul 30, 2024
Merged

Update Preview/Experimental Attributes in Intrinsics#105579
jeffhandley merged 10 commits into
dotnet:mainfrom
jeffhandley:jeffhandley/intrinsics-preview

Conversation

@jeffhandley

@jeffhandleyjeffhandley commented Jul 26, 2024

Copy link
Copy Markdown
Member

This PR includes 4 changes to preview/experimental attributes (each as a separate commit):

  1. Arm.Sve is switched from [RequiresPreviewFeatures] to [Experimental] with SYSLIB5003
    • These are experimental APIs that do not require preview features from other parts of the product
    • This allows usage of these APIs by only suppressing SYSLIB5003 instead of fully opting into preview features across the stack
  2. X86.AvxVnni is no longer in preview; the APIs are now stable
  3. X86.X86Base.DivRem is switched from [RequiresPreviewFeatures] to [Experimental] with SYSLIB5004
  4. GenericVectorTests had an unnecessary [RequiresPreviewFeatures] left from when generic math was preview

@ghostghost added needs-area-label An area label is needed to ensure this gets routed to the appropriate area owners new-api-needs-documentation labels Jul 26, 2024
@ghost

This comment was marked as resolved.

1 similar comment
@ghost

This comment was marked as duplicate.

@jeffhandleyjeffhandley added this to the 9.0.0 milestone Jul 26, 2024
@jeffhandleyjeffhandley added area-System.Runtime.Intrinsics and removed needs-area-label An area label is needed to ensure this gets routed to the appropriate area owners new-api-needs-documentation labels Jul 26, 2024
@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.

@stephentoub

Copy link
Copy Markdown
Member

X86.X86Base.DivRem does not require preview features. There are still JIT opportunities to improve performance, but users should not need to opt into preview features to use the API

The presence of this attribute seems to be how we're communicating it's not actually ready for folks to use, e.g.
#99747 (comment)
Has this changed?

@jeffhandley

Copy link
Copy Markdown
MemberAuthor

X86.X86Base.DivRem does not require preview features

@kunalspathak and @tannergooding indicated in an offline chat last week that we could remove the preview/experimental annotation, but nothing has changed on its performance. Thanks for pointing to that discussion, @stephentoub.

@tannergooding, based on that thread, I suggest we retain an annotation on this API, but switch it from [RequiresPreviewFeatures] to [Experimental].

@tannergooding

Copy link
Copy Markdown
Member

The consideration here is that DivRem is stable; however, there's some additional JIT work needed to ensure it performs "optimally" and that may be unexpected to users given that it is a platform specific hardware intrinsic.

Its something that could probably be just called out in the documentation as its not overall different from other cases where alternative patterns or APIs may be better performing. -- For example, using Sse41.BlendVariable can often be worse than using Vector128.ConditionalSelect as its less portable and more strict on what needs to be emitted.

@tannergooding

Copy link
Copy Markdown
Member

That is, I think that overall its fine at this point to remove the attribute

We have many cases where a given platform specific intrinsic may be subtly "worse" than using an xplat API (in this case its X86Base.DivRem vs int.DivRem). So while there's more JIT work to be done, the API itself is still considered stable and so continuing to mark it as Experimental or Preview may give a worse impression than simply covering the consideration in docs or with an analyzer (which we have approved, just not yet implemented)

That's not a strong preference though, so if anyone want to push back I'm fine with keeping it. I would prefer switching to Experimental though if we do keep any attribute, as that's less strict and easier to document that its just because perf may be suboptimal compared to T.DivRem in some cases

@stephentoub

Copy link
Copy Markdown
Member

So while there's more JIT work to be done

Is it a lot more work?

I don't have a strong opinion about it either, it just seems we marked it as preview/experimental because that work hadn't been done, but now we're removing the attribution without having done the work. In which case I question what changed, e.g. did we change our minds, did enough work happen to make us more comfortable with it, will we always dissuade folks from using the API (in which case maybe it shouldn't have been added publicly in the first place and should possibly be removed), etc.

@tannergooding

Copy link
Copy Markdown
Member

More general work has happened and its better than it had been, but its still not "quite there". The work could likely be finished in early .NET 10 if it was scheduled as top down work, rather than being left as "nice to have".

I'd be happy with changing it to be Experimental for .NET 9 as well; just noting that I don't think its strictly necessary given the above and the general considerations that platform specific APIs are not always the most optimal way to do a given operation.

@jeffhandley

Copy link
Copy Markdown
MemberAuthor

Thanks @stephentoub and @tannergooding. I'll switch DivRem over to [Experimental] for now (9.0.0), and before we remove it, we'll try to reach a point of understanding more broadly what we want to do with intrinsics APIs in this perf situation.

@jeffhandley
jeffhandley merged commit 50bc6a1 into dotnet:mainJul 30, 2024
@jeffhandley
jeffhandley deleted the jeffhandley/intrinsics-preview branch July 30, 2024 23:20
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Aug 30, 2024
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@jeffhandley@stephentoub@tannergooding
, '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

Update Preview/Experimental Attributes in Intrinsics - #105579

Merged
jeffhandley merged 10 commits into
dotnet:mainfrom
jeffhandley:jeffhandley/intrinsics-preview
Jul 30, 2024
Merged

Update Preview/Experimental Attributes in Intrinsics#105579
jeffhandley merged 10 commits into
dotnet:mainfrom
jeffhandley:jeffhandley/intrinsics-preview

Conversation

@jeffhandley

@jeffhandleyjeffhandley commented Jul 26, 2024

Copy link
Copy Markdown
Member

This PR includes 4 changes to preview/experimental attributes (each as a separate commit):

  1. Arm.Sve is switched from [RequiresPreviewFeatures] to [Experimental] with SYSLIB5003
    • These are experimental APIs that do not require preview features from other parts of the product
    • This allows usage of these APIs by only suppressing SYSLIB5003 instead of fully opting into preview features across the stack
  2. X86.AvxVnni is no longer in preview; the APIs are now stable
  3. X86.X86Base.DivRem is switched from [RequiresPreviewFeatures] to [Experimental] with SYSLIB5004
  4. GenericVectorTests had an unnecessary [RequiresPreviewFeatures] left from when generic math was preview

@ghostghost added needs-area-label An area label is needed to ensure this gets routed to the appropriate area owners new-api-needs-documentation labels Jul 26, 2024
@ghost

This comment was marked as resolved.

1 similar comment
@ghost

This comment was marked as duplicate.

@jeffhandleyjeffhandley added this to the 9.0.0 milestone Jul 26, 2024
@jeffhandleyjeffhandley added area-System.Runtime.Intrinsics and removed needs-area-label An area label is needed to ensure this gets routed to the appropriate area owners new-api-needs-documentation labels Jul 26, 2024
@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.

@stephentoub

Copy link
Copy Markdown
Member

X86.X86Base.DivRem does not require preview features. There are still JIT opportunities to improve performance, but users should not need to opt into preview features to use the API

The presence of this attribute seems to be how we're communicating it's not actually ready for folks to use, e.g.
#99747 (comment)
Has this changed?

@jeffhandley

Copy link
Copy Markdown
MemberAuthor

X86.X86Base.DivRem does not require preview features

@kunalspathak and @tannergooding indicated in an offline chat last week that we could remove the preview/experimental annotation, but nothing has changed on its performance. Thanks for pointing to that discussion, @stephentoub.

@tannergooding, based on that thread, I suggest we retain an annotation on this API, but switch it from [RequiresPreviewFeatures] to [Experimental].

@tannergooding

Copy link
Copy Markdown
Member

The consideration here is that DivRem is stable; however, there's some additional JIT work needed to ensure it performs "optimally" and that may be unexpected to users given that it is a platform specific hardware intrinsic.

Its something that could probably be just called out in the documentation as its not overall different from other cases where alternative patterns or APIs may be better performing. -- For example, using Sse41.BlendVariable can often be worse than using Vector128.ConditionalSelect as its less portable and more strict on what needs to be emitted.

@tannergooding

Copy link
Copy Markdown
Member

That is, I think that overall its fine at this point to remove the attribute

We have many cases where a given platform specific intrinsic may be subtly "worse" than using an xplat API (in this case its X86Base.DivRem vs int.DivRem). So while there's more JIT work to be done, the API itself is still considered stable and so continuing to mark it as Experimental or Preview may give a worse impression than simply covering the consideration in docs or with an analyzer (which we have approved, just not yet implemented)

That's not a strong preference though, so if anyone want to push back I'm fine with keeping it. I would prefer switching to Experimental though if we do keep any attribute, as that's less strict and easier to document that its just because perf may be suboptimal compared to T.DivRem in some cases

@stephentoub

Copy link
Copy Markdown
Member

So while there's more JIT work to be done

Is it a lot more work?

I don't have a strong opinion about it either, it just seems we marked it as preview/experimental because that work hadn't been done, but now we're removing the attribution without having done the work. In which case I question what changed, e.g. did we change our minds, did enough work happen to make us more comfortable with it, will we always dissuade folks from using the API (in which case maybe it shouldn't have been added publicly in the first place and should possibly be removed), etc.

@tannergooding

Copy link
Copy Markdown
Member

More general work has happened and its better than it had been, but its still not "quite there". The work could likely be finished in early .NET 10 if it was scheduled as top down work, rather than being left as "nice to have".

I'd be happy with changing it to be Experimental for .NET 9 as well; just noting that I don't think its strictly necessary given the above and the general considerations that platform specific APIs are not always the most optimal way to do a given operation.

@jeffhandley

Copy link
Copy Markdown
MemberAuthor

Thanks @stephentoub and @tannergooding. I'll switch DivRem over to [Experimental] for now (9.0.0), and before we remove it, we'll try to reach a point of understanding more broadly what we want to do with intrinsics APIs in this perf situation.

@jeffhandley
jeffhandley merged commit 50bc6a1 into dotnet:mainJul 30, 2024
@jeffhandley
jeffhandley deleted the jeffhandley/intrinsics-preview branch July 30, 2024 23:20
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Aug 30, 2024
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@jeffhandley@stephentoub@tannergooding
, '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

Update Preview/Experimental Attributes in Intrinsics - #105579

Merged
jeffhandley merged 10 commits into
dotnet:mainfrom
jeffhandley:jeffhandley/intrinsics-preview
Jul 30, 2024
Merged

Update Preview/Experimental Attributes in Intrinsics#105579
jeffhandley merged 10 commits into
dotnet:mainfrom
jeffhandley:jeffhandley/intrinsics-preview

Conversation

@jeffhandley

@jeffhandleyjeffhandley commented Jul 26, 2024

Copy link
Copy Markdown
Member

This PR includes 4 changes to preview/experimental attributes (each as a separate commit):

  1. Arm.Sve is switched from [RequiresPreviewFeatures] to [Experimental] with SYSLIB5003
    • These are experimental APIs that do not require preview features from other parts of the product
    • This allows usage of these APIs by only suppressing SYSLIB5003 instead of fully opting into preview features across the stack
  2. X86.AvxVnni is no longer in preview; the APIs are now stable
  3. X86.X86Base.DivRem is switched from [RequiresPreviewFeatures] to [Experimental] with SYSLIB5004
  4. GenericVectorTests had an unnecessary [RequiresPreviewFeatures] left from when generic math was preview

@ghostghost added needs-area-label An area label is needed to ensure this gets routed to the appropriate area owners new-api-needs-documentation labels Jul 26, 2024
@ghost

This comment was marked as resolved.

1 similar comment
@ghost

This comment was marked as duplicate.

@jeffhandleyjeffhandley added this to the 9.0.0 milestone Jul 26, 2024
@jeffhandleyjeffhandley added area-System.Runtime.Intrinsics and removed needs-area-label An area label is needed to ensure this gets routed to the appropriate area owners new-api-needs-documentation labels Jul 26, 2024
@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.

@stephentoub

Copy link
Copy Markdown
Member

X86.X86Base.DivRem does not require preview features. There are still JIT opportunities to improve performance, but users should not need to opt into preview features to use the API

The presence of this attribute seems to be how we're communicating it's not actually ready for folks to use, e.g.
#99747 (comment)
Has this changed?

@jeffhandley

Copy link
Copy Markdown
MemberAuthor

X86.X86Base.DivRem does not require preview features

@kunalspathak and @tannergooding indicated in an offline chat last week that we could remove the preview/experimental annotation, but nothing has changed on its performance. Thanks for pointing to that discussion, @stephentoub.

@tannergooding, based on that thread, I suggest we retain an annotation on this API, but switch it from [RequiresPreviewFeatures] to [Experimental].

@tannergooding

Copy link
Copy Markdown
Member

The consideration here is that DivRem is stable; however, there's some additional JIT work needed to ensure it performs "optimally" and that may be unexpected to users given that it is a platform specific hardware intrinsic.

Its something that could probably be just called out in the documentation as its not overall different from other cases where alternative patterns or APIs may be better performing. -- For example, using Sse41.BlendVariable can often be worse than using Vector128.ConditionalSelect as its less portable and more strict on what needs to be emitted.

@tannergooding

Copy link
Copy Markdown
Member

That is, I think that overall its fine at this point to remove the attribute

We have many cases where a given platform specific intrinsic may be subtly "worse" than using an xplat API (in this case its X86Base.DivRem vs int.DivRem). So while there's more JIT work to be done, the API itself is still considered stable and so continuing to mark it as Experimental or Preview may give a worse impression than simply covering the consideration in docs or with an analyzer (which we have approved, just not yet implemented)

That's not a strong preference though, so if anyone want to push back I'm fine with keeping it. I would prefer switching to Experimental though if we do keep any attribute, as that's less strict and easier to document that its just because perf may be suboptimal compared to T.DivRem in some cases

@stephentoub

Copy link
Copy Markdown
Member

So while there's more JIT work to be done

Is it a lot more work?

I don't have a strong opinion about it either, it just seems we marked it as preview/experimental because that work hadn't been done, but now we're removing the attribution without having done the work. In which case I question what changed, e.g. did we change our minds, did enough work happen to make us more comfortable with it, will we always dissuade folks from using the API (in which case maybe it shouldn't have been added publicly in the first place and should possibly be removed), etc.

@tannergooding

Copy link
Copy Markdown
Member

More general work has happened and its better than it had been, but its still not "quite there". The work could likely be finished in early .NET 10 if it was scheduled as top down work, rather than being left as "nice to have".

I'd be happy with changing it to be Experimental for .NET 9 as well; just noting that I don't think its strictly necessary given the above and the general considerations that platform specific APIs are not always the most optimal way to do a given operation.

@jeffhandley

Copy link
Copy Markdown
MemberAuthor

Thanks @stephentoub and @tannergooding. I'll switch DivRem over to [Experimental] for now (9.0.0), and before we remove it, we'll try to reach a point of understanding more broadly what we want to do with intrinsics APIs in this perf situation.

@jeffhandley
jeffhandley merged commit 50bc6a1 into dotnet:mainJul 30, 2024
@jeffhandley
jeffhandley deleted the jeffhandley/intrinsics-preview branch July 30, 2024 23:20
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Aug 30, 2024
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@jeffhandley@stephentoub@tannergooding
, '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

Update Preview/Experimental Attributes in Intrinsics - #105579

Merged
jeffhandley merged 10 commits into
dotnet:mainfrom
jeffhandley:jeffhandley/intrinsics-preview
Jul 30, 2024
Merged

Update Preview/Experimental Attributes in Intrinsics#105579
jeffhandley merged 10 commits into
dotnet:mainfrom
jeffhandley:jeffhandley/intrinsics-preview

Conversation

@jeffhandley

@jeffhandleyjeffhandley commented Jul 26, 2024

Copy link
Copy Markdown
Member

This PR includes 4 changes to preview/experimental attributes (each as a separate commit):

  1. Arm.Sve is switched from [RequiresPreviewFeatures] to [Experimental] with SYSLIB5003
    • These are experimental APIs that do not require preview features from other parts of the product
    • This allows usage of these APIs by only suppressing SYSLIB5003 instead of fully opting into preview features across the stack
  2. X86.AvxVnni is no longer in preview; the APIs are now stable
  3. X86.X86Base.DivRem is switched from [RequiresPreviewFeatures] to [Experimental] with SYSLIB5004
  4. GenericVectorTests had an unnecessary [RequiresPreviewFeatures] left from when generic math was preview

@ghostghost added needs-area-label An area label is needed to ensure this gets routed to the appropriate area owners new-api-needs-documentation labels Jul 26, 2024
@ghost

This comment was marked as resolved.

1 similar comment
@ghost

This comment was marked as duplicate.

@jeffhandleyjeffhandley added this to the 9.0.0 milestone Jul 26, 2024
@jeffhandleyjeffhandley added area-System.Runtime.Intrinsics and removed needs-area-label An area label is needed to ensure this gets routed to the appropriate area owners new-api-needs-documentation labels Jul 26, 2024
@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.

@stephentoub

Copy link
Copy Markdown
Member

X86.X86Base.DivRem does not require preview features. There are still JIT opportunities to improve performance, but users should not need to opt into preview features to use the API

The presence of this attribute seems to be how we're communicating it's not actually ready for folks to use, e.g.
#99747 (comment)
Has this changed?

@jeffhandley

Copy link
Copy Markdown
MemberAuthor

X86.X86Base.DivRem does not require preview features

@kunalspathak and @tannergooding indicated in an offline chat last week that we could remove the preview/experimental annotation, but nothing has changed on its performance. Thanks for pointing to that discussion, @stephentoub.

@tannergooding, based on that thread, I suggest we retain an annotation on this API, but switch it from [RequiresPreviewFeatures] to [Experimental].

@tannergooding

Copy link
Copy Markdown
Member

The consideration here is that DivRem is stable; however, there's some additional JIT work needed to ensure it performs "optimally" and that may be unexpected to users given that it is a platform specific hardware intrinsic.

Its something that could probably be just called out in the documentation as its not overall different from other cases where alternative patterns or APIs may be better performing. -- For example, using Sse41.BlendVariable can often be worse than using Vector128.ConditionalSelect as its less portable and more strict on what needs to be emitted.

@tannergooding

Copy link
Copy Markdown
Member

That is, I think that overall its fine at this point to remove the attribute

We have many cases where a given platform specific intrinsic may be subtly "worse" than using an xplat API (in this case its X86Base.DivRem vs int.DivRem). So while there's more JIT work to be done, the API itself is still considered stable and so continuing to mark it as Experimental or Preview may give a worse impression than simply covering the consideration in docs or with an analyzer (which we have approved, just not yet implemented)

That's not a strong preference though, so if anyone want to push back I'm fine with keeping it. I would prefer switching to Experimental though if we do keep any attribute, as that's less strict and easier to document that its just because perf may be suboptimal compared to T.DivRem in some cases

@stephentoub

Copy link
Copy Markdown
Member

So while there's more JIT work to be done

Is it a lot more work?

I don't have a strong opinion about it either, it just seems we marked it as preview/experimental because that work hadn't been done, but now we're removing the attribution without having done the work. In which case I question what changed, e.g. did we change our minds, did enough work happen to make us more comfortable with it, will we always dissuade folks from using the API (in which case maybe it shouldn't have been added publicly in the first place and should possibly be removed), etc.

@tannergooding

Copy link
Copy Markdown
Member

More general work has happened and its better than it had been, but its still not "quite there". The work could likely be finished in early .NET 10 if it was scheduled as top down work, rather than being left as "nice to have".

I'd be happy with changing it to be Experimental for .NET 9 as well; just noting that I don't think its strictly necessary given the above and the general considerations that platform specific APIs are not always the most optimal way to do a given operation.

@jeffhandley

Copy link
Copy Markdown
MemberAuthor

Thanks @stephentoub and @tannergooding. I'll switch DivRem over to [Experimental] for now (9.0.0), and before we remove it, we'll try to reach a point of understanding more broadly what we want to do with intrinsics APIs in this perf situation.

@jeffhandley
jeffhandley merged commit 50bc6a1 into dotnet:mainJul 30, 2024
@jeffhandley
jeffhandley deleted the jeffhandley/intrinsics-preview branch July 30, 2024 23:20
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Aug 30, 2024
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@jeffhandley@stephentoub@tannergooding
, '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

Update Preview/Experimental Attributes in Intrinsics - #105579

Merged
jeffhandley merged 10 commits into
dotnet:mainfrom
jeffhandley:jeffhandley/intrinsics-preview
Jul 30, 2024
Merged

Update Preview/Experimental Attributes in Intrinsics#105579
jeffhandley merged 10 commits into
dotnet:mainfrom
jeffhandley:jeffhandley/intrinsics-preview

Conversation

@jeffhandley

@jeffhandleyjeffhandley commented Jul 26, 2024

Copy link
Copy Markdown
Member

This PR includes 4 changes to preview/experimental attributes (each as a separate commit):

  1. Arm.Sve is switched from [RequiresPreviewFeatures] to [Experimental] with SYSLIB5003
    • These are experimental APIs that do not require preview features from other parts of the product
    • This allows usage of these APIs by only suppressing SYSLIB5003 instead of fully opting into preview features across the stack
  2. X86.AvxVnni is no longer in preview; the APIs are now stable
  3. X86.X86Base.DivRem is switched from [RequiresPreviewFeatures] to [Experimental] with SYSLIB5004
  4. GenericVectorTests had an unnecessary [RequiresPreviewFeatures] left from when generic math was preview

@ghostghost added needs-area-label An area label is needed to ensure this gets routed to the appropriate area owners new-api-needs-documentation labels Jul 26, 2024
@ghost

This comment was marked as resolved.

1 similar comment
@ghost

This comment was marked as duplicate.

@jeffhandleyjeffhandley added this to the 9.0.0 milestone Jul 26, 2024
@jeffhandleyjeffhandley added area-System.Runtime.Intrinsics and removed needs-area-label An area label is needed to ensure this gets routed to the appropriate area owners new-api-needs-documentation labels Jul 26, 2024
@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.

@stephentoub

Copy link
Copy Markdown
Member

X86.X86Base.DivRem does not require preview features. There are still JIT opportunities to improve performance, but users should not need to opt into preview features to use the API

The presence of this attribute seems to be how we're communicating it's not actually ready for folks to use, e.g.
#99747 (comment)
Has this changed?

@jeffhandley

Copy link
Copy Markdown
MemberAuthor

X86.X86Base.DivRem does not require preview features

@kunalspathak and @tannergooding indicated in an offline chat last week that we could remove the preview/experimental annotation, but nothing has changed on its performance. Thanks for pointing to that discussion, @stephentoub.

@tannergooding, based on that thread, I suggest we retain an annotation on this API, but switch it from [RequiresPreviewFeatures] to [Experimental].

@tannergooding

Copy link
Copy Markdown
Member

The consideration here is that DivRem is stable; however, there's some additional JIT work needed to ensure it performs "optimally" and that may be unexpected to users given that it is a platform specific hardware intrinsic.

Its something that could probably be just called out in the documentation as its not overall different from other cases where alternative patterns or APIs may be better performing. -- For example, using Sse41.BlendVariable can often be worse than using Vector128.ConditionalSelect as its less portable and more strict on what needs to be emitted.

@tannergooding

Copy link
Copy Markdown
Member

That is, I think that overall its fine at this point to remove the attribute

We have many cases where a given platform specific intrinsic may be subtly "worse" than using an xplat API (in this case its X86Base.DivRem vs int.DivRem). So while there's more JIT work to be done, the API itself is still considered stable and so continuing to mark it as Experimental or Preview may give a worse impression than simply covering the consideration in docs or with an analyzer (which we have approved, just not yet implemented)

That's not a strong preference though, so if anyone want to push back I'm fine with keeping it. I would prefer switching to Experimental though if we do keep any attribute, as that's less strict and easier to document that its just because perf may be suboptimal compared to T.DivRem in some cases

@stephentoub

Copy link
Copy Markdown
Member

So while there's more JIT work to be done

Is it a lot more work?

I don't have a strong opinion about it either, it just seems we marked it as preview/experimental because that work hadn't been done, but now we're removing the attribution without having done the work. In which case I question what changed, e.g. did we change our minds, did enough work happen to make us more comfortable with it, will we always dissuade folks from using the API (in which case maybe it shouldn't have been added publicly in the first place and should possibly be removed), etc.

@tannergooding

Copy link
Copy Markdown
Member

More general work has happened and its better than it had been, but its still not "quite there". The work could likely be finished in early .NET 10 if it was scheduled as top down work, rather than being left as "nice to have".

I'd be happy with changing it to be Experimental for .NET 9 as well; just noting that I don't think its strictly necessary given the above and the general considerations that platform specific APIs are not always the most optimal way to do a given operation.

@jeffhandley

Copy link
Copy Markdown
MemberAuthor

Thanks @stephentoub and @tannergooding. I'll switch DivRem over to [Experimental] for now (9.0.0), and before we remove it, we'll try to reach a point of understanding more broadly what we want to do with intrinsics APIs in this perf situation.

@jeffhandley
jeffhandley merged commit 50bc6a1 into dotnet:mainJul 30, 2024
@jeffhandley
jeffhandley deleted the jeffhandley/intrinsics-preview branch July 30, 2024 23:20
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Aug 30, 2024
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@jeffhandley@stephentoub@tannergooding