[ET-VK] Add 2D Reduction to Vulkan Backend - #12860

Merged
alexdean08 merged 8 commits into
pytorch:mainfrom
sarc-acl:main
Aug 6, 2025
Merged

[ET-VK] Add 2D Reduction to Vulkan Backend#12860
alexdean08 merged 8 commits into
pytorch:mainfrom
sarc-acl:main

Conversation

@alexdean08

@alexdean08alexdean08 commented Jul 25, 2025

Copy link
Copy Markdown
Contributor

Summary: This change adds 2D reduction to the Vulkan delegate. Prior to this change, only 1D reduction was implemented. Models like MobileNetV3 and ResNet do 2D reduction, and their performance was being negatively impacted by the lack of a 2D reduction Vulkan implementation.

cc @SS-JIA@manuelcandales@cbilgin

@alexdean08
alexdean08 requested a review from SS-JIA as a code ownerJuly 25, 2025 17:54
@pytorch-botpytorch-botBot added the module: vulkan Issues related to the Vulkan delegate and code under backends/vulkan/ label Jul 25, 2025
@pytorch-bot

pytorch-botBot commented Jul 25, 2025

Copy link
Copy Markdown

🔗 Helpful Links

🧪 See artifacts and rendered test results at hud.pytorch.org/pr/pytorch/executorch/12860

Note: Links to docs will display an error until the docs builds have been completed.

❗ 1 Active SEVs

There are 1 currently active SEVs. If your PR is affected, please view them below:

❌ 2 New Failures, 1 Unrelated Failure

As of commit 3ca809f with merge base 9d86cbe (image):

NEW FAILURES - The following jobs have failed:

BROKEN TRUNK - The following job failed but were present on the merge base:

👉 Rebase onto the `viable/strict` branch to avoid these failures

This comment was automatically generated by Dr. CI and updates every 15 minutes.

@facebook-github-botfacebook-github-bot added the CLA Signed This label is managed by the Facebook bot. Authors need to sign the CLA before a PR can be reviewed. label Jul 25, 2025
@alexdean08

Copy link
Copy Markdown
ContributorAuthor

@pytorchbot label "release notes: vulkan"

@pytorch-botpytorch-botBot added the release notes: vulkan Changes to the Vulkan backend delegate label Jul 25, 2025
Comment threadbackends/vulkan/runtime/graph/ops/impl/Reduce.cpp Outdated
Co-authored-by: Mateusz Sluszniak <56299341+msluszniak@users.noreply.github.com>

@SS-JIASS-JIA left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

LGTM with some small comments. Thanks for working on this!

// with the accumulator.
#define POSTPROCESS(accum) ${POSTPROCESS}

void reduce_2d(const ivec2 tid, ivec3 scan_pos) {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

As I understand it, this implementation doesn't currently support reduction among the elements of a texel,.

So for example for a tensor of size (channels = 4, height = 16, width = 16) where reading one texel returns 4 channels, this function would only be able to handle reduction along the height and width dims, but not if channels is one of the dims being reduced - is that correct?

If so, we can leave the more generalized implementation for later, but we should add some checks to make sure we don't lower unsupported cases to Vulkan 😛

Would also recommend renaming this function to reduce_2d_non_texel_dim or reduce_2d_non_packed_dim.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Yup you're right, this doesn't support reduction among the elements of a texel. Just changed to reduce_2d_non_packed_dim. Let me know if you're aligned

reduce_dim1 = nchw_dim_to_whcn_dim(reduce_dim1, ndim);
reduce_dim2 = nchw_dim_to_whcn_dim(reduce_dim2, ndim);

// Check that the concat dim is not one of the reduction dims

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

should also add a check that graph.packed_dim_of(in) and graph.packed_dim_of(out) is not one of the reduction dims.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Just added above this comment. Let me know if you're aligned

@alexdean08
alexdean08 merged commit 112a09f into pytorch:mainAug 6, 2025
99 of 102 checks passed
agrima1304 pushed a commit to agrima1304/executorch that referenced this pull request Aug 26, 2025
Summary: This change adds 2D reduction to the Vulkan delegate. Prior to
this change, only 1D reduction was implemented. Models like MobileNetV3
and ResNet do 2D reduction, and their performance was being negatively
impacted by the lack of a 2D reduction Vulkan implementation.
cc @SS-JIA@manuelcandales@cbilgin
---------
Co-authored-by: Mateusz Sluszniak <56299341+msluszniak@users.noreply.github.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

CLA SignedThis label is managed by the Facebook bot. Authors need to sign the CLA before a PR can be reviewed.module: vulkanIssues related to the Vulkan delegate and code under backends/vulkan/release notes: vulkanChanges to the Vulkan backend delegate

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@alexdean08@SS-JIA@msluszniak@facebook-github-bot
, '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

[ET-VK] Add 2D Reduction to Vulkan Backend - #12860

Merged
alexdean08 merged 8 commits into
pytorch:mainfrom
sarc-acl:main
Aug 6, 2025
Merged

[ET-VK] Add 2D Reduction to Vulkan Backend#12860
alexdean08 merged 8 commits into
pytorch:mainfrom
sarc-acl:main

Conversation

@alexdean08

@alexdean08alexdean08 commented Jul 25, 2025

Copy link
Copy Markdown
Contributor

Summary: This change adds 2D reduction to the Vulkan delegate. Prior to this change, only 1D reduction was implemented. Models like MobileNetV3 and ResNet do 2D reduction, and their performance was being negatively impacted by the lack of a 2D reduction Vulkan implementation.

cc @SS-JIA@manuelcandales@cbilgin

@alexdean08
alexdean08 requested a review from SS-JIA as a code ownerJuly 25, 2025 17:54
@pytorch-botpytorch-botBot added the module: vulkan Issues related to the Vulkan delegate and code under backends/vulkan/ label Jul 25, 2025
@pytorch-bot

pytorch-botBot commented Jul 25, 2025

Copy link
Copy Markdown

🔗 Helpful Links

🧪 See artifacts and rendered test results at hud.pytorch.org/pr/pytorch/executorch/12860

Note: Links to docs will display an error until the docs builds have been completed.

❗ 1 Active SEVs

There are 1 currently active SEVs. If your PR is affected, please view them below:

❌ 2 New Failures, 1 Unrelated Failure

As of commit 3ca809f with merge base 9d86cbe (image):

NEW FAILURES - The following jobs have failed:

BROKEN TRUNK - The following job failed but were present on the merge base:

👉 Rebase onto the `viable/strict` branch to avoid these failures

This comment was automatically generated by Dr. CI and updates every 15 minutes.

@facebook-github-botfacebook-github-bot added the CLA Signed This label is managed by the Facebook bot. Authors need to sign the CLA before a PR can be reviewed. label Jul 25, 2025
@alexdean08

Copy link
Copy Markdown
ContributorAuthor

@pytorchbot label "release notes: vulkan"

@pytorch-botpytorch-botBot added the release notes: vulkan Changes to the Vulkan backend delegate label Jul 25, 2025
Comment threadbackends/vulkan/runtime/graph/ops/impl/Reduce.cpp Outdated
Co-authored-by: Mateusz Sluszniak <56299341+msluszniak@users.noreply.github.com>

@SS-JIASS-JIA left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

LGTM with some small comments. Thanks for working on this!

// with the accumulator.
#define POSTPROCESS(accum) ${POSTPROCESS}

void reduce_2d(const ivec2 tid, ivec3 scan_pos) {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

As I understand it, this implementation doesn't currently support reduction among the elements of a texel,.

So for example for a tensor of size (channels = 4, height = 16, width = 16) where reading one texel returns 4 channels, this function would only be able to handle reduction along the height and width dims, but not if channels is one of the dims being reduced - is that correct?

If so, we can leave the more generalized implementation for later, but we should add some checks to make sure we don't lower unsupported cases to Vulkan 😛

Would also recommend renaming this function to reduce_2d_non_texel_dim or reduce_2d_non_packed_dim.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Yup you're right, this doesn't support reduction among the elements of a texel. Just changed to reduce_2d_non_packed_dim. Let me know if you're aligned

reduce_dim1 = nchw_dim_to_whcn_dim(reduce_dim1, ndim);
reduce_dim2 = nchw_dim_to_whcn_dim(reduce_dim2, ndim);

// Check that the concat dim is not one of the reduction dims

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

should also add a check that graph.packed_dim_of(in) and graph.packed_dim_of(out) is not one of the reduction dims.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Just added above this comment. Let me know if you're aligned

@alexdean08
alexdean08 merged commit 112a09f into pytorch:mainAug 6, 2025
99 of 102 checks passed
agrima1304 pushed a commit to agrima1304/executorch that referenced this pull request Aug 26, 2025
Summary: This change adds 2D reduction to the Vulkan delegate. Prior to
this change, only 1D reduction was implemented. Models like MobileNetV3
and ResNet do 2D reduction, and their performance was being negatively
impacted by the lack of a 2D reduction Vulkan implementation.
cc @SS-JIA@manuelcandales@cbilgin
---------
Co-authored-by: Mateusz Sluszniak <56299341+msluszniak@users.noreply.github.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

CLA SignedThis label is managed by the Facebook bot. Authors need to sign the CLA before a PR can be reviewed.module: vulkanIssues related to the Vulkan delegate and code under backends/vulkan/release notes: vulkanChanges to the Vulkan backend delegate

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@alexdean08@SS-JIA@msluszniak@facebook-github-bot
, '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

[ET-VK] Add 2D Reduction to Vulkan Backend - #12860

Merged
alexdean08 merged 8 commits into
pytorch:mainfrom
sarc-acl:main
Aug 6, 2025
Merged

[ET-VK] Add 2D Reduction to Vulkan Backend#12860
alexdean08 merged 8 commits into
pytorch:mainfrom
sarc-acl:main

Conversation

@alexdean08

@alexdean08alexdean08 commented Jul 25, 2025

Copy link
Copy Markdown
Contributor

Summary: This change adds 2D reduction to the Vulkan delegate. Prior to this change, only 1D reduction was implemented. Models like MobileNetV3 and ResNet do 2D reduction, and their performance was being negatively impacted by the lack of a 2D reduction Vulkan implementation.

cc @SS-JIA@manuelcandales@cbilgin

@alexdean08
alexdean08 requested a review from SS-JIA as a code ownerJuly 25, 2025 17:54
@pytorch-botpytorch-botBot added the module: vulkan Issues related to the Vulkan delegate and code under backends/vulkan/ label Jul 25, 2025
@pytorch-bot

pytorch-botBot commented Jul 25, 2025

Copy link
Copy Markdown

🔗 Helpful Links

🧪 See artifacts and rendered test results at hud.pytorch.org/pr/pytorch/executorch/12860

Note: Links to docs will display an error until the docs builds have been completed.

❗ 1 Active SEVs

There are 1 currently active SEVs. If your PR is affected, please view them below:

❌ 2 New Failures, 1 Unrelated Failure

As of commit 3ca809f with merge base 9d86cbe (image):

NEW FAILURES - The following jobs have failed:

BROKEN TRUNK - The following job failed but were present on the merge base:

👉 Rebase onto the `viable/strict` branch to avoid these failures

This comment was automatically generated by Dr. CI and updates every 15 minutes.

@facebook-github-botfacebook-github-bot added the CLA Signed This label is managed by the Facebook bot. Authors need to sign the CLA before a PR can be reviewed. label Jul 25, 2025
@alexdean08

Copy link
Copy Markdown
ContributorAuthor

@pytorchbot label "release notes: vulkan"

@pytorch-botpytorch-botBot added the release notes: vulkan Changes to the Vulkan backend delegate label Jul 25, 2025
Comment threadbackends/vulkan/runtime/graph/ops/impl/Reduce.cpp Outdated
Co-authored-by: Mateusz Sluszniak <56299341+msluszniak@users.noreply.github.com>

@SS-JIASS-JIA left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

LGTM with some small comments. Thanks for working on this!

// with the accumulator.
#define POSTPROCESS(accum) ${POSTPROCESS}

void reduce_2d(const ivec2 tid, ivec3 scan_pos) {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

As I understand it, this implementation doesn't currently support reduction among the elements of a texel,.

So for example for a tensor of size (channels = 4, height = 16, width = 16) where reading one texel returns 4 channels, this function would only be able to handle reduction along the height and width dims, but not if channels is one of the dims being reduced - is that correct?

If so, we can leave the more generalized implementation for later, but we should add some checks to make sure we don't lower unsupported cases to Vulkan 😛

Would also recommend renaming this function to reduce_2d_non_texel_dim or reduce_2d_non_packed_dim.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Yup you're right, this doesn't support reduction among the elements of a texel. Just changed to reduce_2d_non_packed_dim. Let me know if you're aligned

reduce_dim1 = nchw_dim_to_whcn_dim(reduce_dim1, ndim);
reduce_dim2 = nchw_dim_to_whcn_dim(reduce_dim2, ndim);

// Check that the concat dim is not one of the reduction dims

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

should also add a check that graph.packed_dim_of(in) and graph.packed_dim_of(out) is not one of the reduction dims.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Just added above this comment. Let me know if you're aligned

@alexdean08
alexdean08 merged commit 112a09f into pytorch:mainAug 6, 2025
99 of 102 checks passed
agrima1304 pushed a commit to agrima1304/executorch that referenced this pull request Aug 26, 2025
Summary: This change adds 2D reduction to the Vulkan delegate. Prior to
this change, only 1D reduction was implemented. Models like MobileNetV3
and ResNet do 2D reduction, and their performance was being negatively
impacted by the lack of a 2D reduction Vulkan implementation.
cc @SS-JIA@manuelcandales@cbilgin
---------
Co-authored-by: Mateusz Sluszniak <56299341+msluszniak@users.noreply.github.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

CLA SignedThis label is managed by the Facebook bot. Authors need to sign the CLA before a PR can be reviewed.module: vulkanIssues related to the Vulkan delegate and code under backends/vulkan/release notes: vulkanChanges to the Vulkan backend delegate

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@alexdean08@SS-JIA@msluszniak@facebook-github-bot
, '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

[ET-VK] Add 2D Reduction to Vulkan Backend - #12860

Merged
alexdean08 merged 8 commits into
pytorch:mainfrom
sarc-acl:main
Aug 6, 2025
Merged

[ET-VK] Add 2D Reduction to Vulkan Backend#12860
alexdean08 merged 8 commits into
pytorch:mainfrom
sarc-acl:main

Conversation

@alexdean08

@alexdean08alexdean08 commented Jul 25, 2025

Copy link
Copy Markdown
Contributor

Summary: This change adds 2D reduction to the Vulkan delegate. Prior to this change, only 1D reduction was implemented. Models like MobileNetV3 and ResNet do 2D reduction, and their performance was being negatively impacted by the lack of a 2D reduction Vulkan implementation.

cc @SS-JIA@manuelcandales@cbilgin

@alexdean08
alexdean08 requested a review from SS-JIA as a code ownerJuly 25, 2025 17:54
@pytorch-botpytorch-botBot added the module: vulkan Issues related to the Vulkan delegate and code under backends/vulkan/ label Jul 25, 2025
@pytorch-bot

pytorch-botBot commented Jul 25, 2025

Copy link
Copy Markdown

🔗 Helpful Links

🧪 See artifacts and rendered test results at hud.pytorch.org/pr/pytorch/executorch/12860

Note: Links to docs will display an error until the docs builds have been completed.

❗ 1 Active SEVs

There are 1 currently active SEVs. If your PR is affected, please view them below:

❌ 2 New Failures, 1 Unrelated Failure

As of commit 3ca809f with merge base 9d86cbe (image):

NEW FAILURES - The following jobs have failed:

BROKEN TRUNK - The following job failed but were present on the merge base:

👉 Rebase onto the `viable/strict` branch to avoid these failures

This comment was automatically generated by Dr. CI and updates every 15 minutes.

@facebook-github-botfacebook-github-bot added the CLA Signed This label is managed by the Facebook bot. Authors need to sign the CLA before a PR can be reviewed. label Jul 25, 2025
@alexdean08

Copy link
Copy Markdown
ContributorAuthor

@pytorchbot label "release notes: vulkan"

@pytorch-botpytorch-botBot added the release notes: vulkan Changes to the Vulkan backend delegate label Jul 25, 2025
Comment threadbackends/vulkan/runtime/graph/ops/impl/Reduce.cpp Outdated
Co-authored-by: Mateusz Sluszniak <56299341+msluszniak@users.noreply.github.com>

@SS-JIASS-JIA left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

LGTM with some small comments. Thanks for working on this!

// with the accumulator.
#define POSTPROCESS(accum) ${POSTPROCESS}

void reduce_2d(const ivec2 tid, ivec3 scan_pos) {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

As I understand it, this implementation doesn't currently support reduction among the elements of a texel,.

So for example for a tensor of size (channels = 4, height = 16, width = 16) where reading one texel returns 4 channels, this function would only be able to handle reduction along the height and width dims, but not if channels is one of the dims being reduced - is that correct?

If so, we can leave the more generalized implementation for later, but we should add some checks to make sure we don't lower unsupported cases to Vulkan 😛

Would also recommend renaming this function to reduce_2d_non_texel_dim or reduce_2d_non_packed_dim.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Yup you're right, this doesn't support reduction among the elements of a texel. Just changed to reduce_2d_non_packed_dim. Let me know if you're aligned

reduce_dim1 = nchw_dim_to_whcn_dim(reduce_dim1, ndim);
reduce_dim2 = nchw_dim_to_whcn_dim(reduce_dim2, ndim);

// Check that the concat dim is not one of the reduction dims

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

should also add a check that graph.packed_dim_of(in) and graph.packed_dim_of(out) is not one of the reduction dims.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Just added above this comment. Let me know if you're aligned

@alexdean08
alexdean08 merged commit 112a09f into pytorch:mainAug 6, 2025
99 of 102 checks passed
agrima1304 pushed a commit to agrima1304/executorch that referenced this pull request Aug 26, 2025
Summary: This change adds 2D reduction to the Vulkan delegate. Prior to
this change, only 1D reduction was implemented. Models like MobileNetV3
and ResNet do 2D reduction, and their performance was being negatively
impacted by the lack of a 2D reduction Vulkan implementation.
cc @SS-JIA@manuelcandales@cbilgin
---------
Co-authored-by: Mateusz Sluszniak <56299341+msluszniak@users.noreply.github.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

CLA SignedThis label is managed by the Facebook bot. Authors need to sign the CLA before a PR can be reviewed.module: vulkanIssues related to the Vulkan delegate and code under backends/vulkan/release notes: vulkanChanges to the Vulkan backend delegate

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@alexdean08@SS-JIA@msluszniak@facebook-github-bot
, '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

[ET-VK] Add 2D Reduction to Vulkan Backend - #12860

Merged
alexdean08 merged 8 commits into
pytorch:mainfrom
sarc-acl:main
Aug 6, 2025
Merged

[ET-VK] Add 2D Reduction to Vulkan Backend#12860
alexdean08 merged 8 commits into
pytorch:mainfrom
sarc-acl:main

Conversation

@alexdean08

@alexdean08alexdean08 commented Jul 25, 2025

Copy link
Copy Markdown
Contributor

Summary: This change adds 2D reduction to the Vulkan delegate. Prior to this change, only 1D reduction was implemented. Models like MobileNetV3 and ResNet do 2D reduction, and their performance was being negatively impacted by the lack of a 2D reduction Vulkan implementation.

cc @SS-JIA@manuelcandales@cbilgin

@alexdean08
alexdean08 requested a review from SS-JIA as a code ownerJuly 25, 2025 17:54
@pytorch-botpytorch-botBot added the module: vulkan Issues related to the Vulkan delegate and code under backends/vulkan/ label Jul 25, 2025
@pytorch-bot

pytorch-botBot commented Jul 25, 2025

Copy link
Copy Markdown

🔗 Helpful Links

🧪 See artifacts and rendered test results at hud.pytorch.org/pr/pytorch/executorch/12860

Note: Links to docs will display an error until the docs builds have been completed.

❗ 1 Active SEVs

There are 1 currently active SEVs. If your PR is affected, please view them below:

❌ 2 New Failures, 1 Unrelated Failure

As of commit 3ca809f with merge base 9d86cbe (image):

NEW FAILURES - The following jobs have failed:

BROKEN TRUNK - The following job failed but were present on the merge base:

👉 Rebase onto the `viable/strict` branch to avoid these failures

This comment was automatically generated by Dr. CI and updates every 15 minutes.

@facebook-github-botfacebook-github-bot added the CLA Signed This label is managed by the Facebook bot. Authors need to sign the CLA before a PR can be reviewed. label Jul 25, 2025
@alexdean08

Copy link
Copy Markdown
ContributorAuthor

@pytorchbot label "release notes: vulkan"

@pytorch-botpytorch-botBot added the release notes: vulkan Changes to the Vulkan backend delegate label Jul 25, 2025
Comment threadbackends/vulkan/runtime/graph/ops/impl/Reduce.cpp Outdated
Co-authored-by: Mateusz Sluszniak <56299341+msluszniak@users.noreply.github.com>

@SS-JIASS-JIA left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

LGTM with some small comments. Thanks for working on this!

// with the accumulator.
#define POSTPROCESS(accum) ${POSTPROCESS}

void reduce_2d(const ivec2 tid, ivec3 scan_pos) {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

As I understand it, this implementation doesn't currently support reduction among the elements of a texel,.

So for example for a tensor of size (channels = 4, height = 16, width = 16) where reading one texel returns 4 channels, this function would only be able to handle reduction along the height and width dims, but not if channels is one of the dims being reduced - is that correct?

If so, we can leave the more generalized implementation for later, but we should add some checks to make sure we don't lower unsupported cases to Vulkan 😛

Would also recommend renaming this function to reduce_2d_non_texel_dim or reduce_2d_non_packed_dim.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Yup you're right, this doesn't support reduction among the elements of a texel. Just changed to reduce_2d_non_packed_dim. Let me know if you're aligned

reduce_dim1 = nchw_dim_to_whcn_dim(reduce_dim1, ndim);
reduce_dim2 = nchw_dim_to_whcn_dim(reduce_dim2, ndim);

// Check that the concat dim is not one of the reduction dims

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

should also add a check that graph.packed_dim_of(in) and graph.packed_dim_of(out) is not one of the reduction dims.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Just added above this comment. Let me know if you're aligned

@alexdean08
alexdean08 merged commit 112a09f into pytorch:mainAug 6, 2025
99 of 102 checks passed
agrima1304 pushed a commit to agrima1304/executorch that referenced this pull request Aug 26, 2025
Summary: This change adds 2D reduction to the Vulkan delegate. Prior to
this change, only 1D reduction was implemented. Models like MobileNetV3
and ResNet do 2D reduction, and their performance was being negatively
impacted by the lack of a 2D reduction Vulkan implementation.
cc @SS-JIA@manuelcandales@cbilgin
---------
Co-authored-by: Mateusz Sluszniak <56299341+msluszniak@users.noreply.github.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

CLA SignedThis label is managed by the Facebook bot. Authors need to sign the CLA before a PR can be reviewed.module: vulkanIssues related to the Vulkan delegate and code under backends/vulkan/release notes: vulkanChanges to the Vulkan backend delegate

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@alexdean08@SS-JIA@msluszniak@facebook-github-bot
, '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

[ET-VK] Add 2D Reduction to Vulkan Backend - #12860

Merged
alexdean08 merged 8 commits into
pytorch:mainfrom
sarc-acl:main
Aug 6, 2025
Merged

[ET-VK] Add 2D Reduction to Vulkan Backend#12860
alexdean08 merged 8 commits into
pytorch:mainfrom
sarc-acl:main

Conversation

@alexdean08

@alexdean08alexdean08 commented Jul 25, 2025

Copy link
Copy Markdown
Contributor

Summary: This change adds 2D reduction to the Vulkan delegate. Prior to this change, only 1D reduction was implemented. Models like MobileNetV3 and ResNet do 2D reduction, and their performance was being negatively impacted by the lack of a 2D reduction Vulkan implementation.

cc @SS-JIA@manuelcandales@cbilgin

@alexdean08
alexdean08 requested a review from SS-JIA as a code ownerJuly 25, 2025 17:54
@pytorch-botpytorch-botBot added the module: vulkan Issues related to the Vulkan delegate and code under backends/vulkan/ label Jul 25, 2025
@pytorch-bot

pytorch-botBot commented Jul 25, 2025

Copy link
Copy Markdown

🔗 Helpful Links

🧪 See artifacts and rendered test results at hud.pytorch.org/pr/pytorch/executorch/12860

Note: Links to docs will display an error until the docs builds have been completed.

❗ 1 Active SEVs

There are 1 currently active SEVs. If your PR is affected, please view them below:

❌ 2 New Failures, 1 Unrelated Failure

As of commit 3ca809f with merge base 9d86cbe (image):

NEW FAILURES - The following jobs have failed:

BROKEN TRUNK - The following job failed but were present on the merge base:

👉 Rebase onto the `viable/strict` branch to avoid these failures

This comment was automatically generated by Dr. CI and updates every 15 minutes.

@facebook-github-botfacebook-github-bot added the CLA Signed This label is managed by the Facebook bot. Authors need to sign the CLA before a PR can be reviewed. label Jul 25, 2025
@alexdean08

Copy link
Copy Markdown
ContributorAuthor

@pytorchbot label "release notes: vulkan"

@pytorch-botpytorch-botBot added the release notes: vulkan Changes to the Vulkan backend delegate label Jul 25, 2025
Comment threadbackends/vulkan/runtime/graph/ops/impl/Reduce.cpp Outdated
Co-authored-by: Mateusz Sluszniak <56299341+msluszniak@users.noreply.github.com>

@SS-JIASS-JIA left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

LGTM with some small comments. Thanks for working on this!

// with the accumulator.
#define POSTPROCESS(accum) ${POSTPROCESS}

void reduce_2d(const ivec2 tid, ivec3 scan_pos) {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

As I understand it, this implementation doesn't currently support reduction among the elements of a texel,.

So for example for a tensor of size (channels = 4, height = 16, width = 16) where reading one texel returns 4 channels, this function would only be able to handle reduction along the height and width dims, but not if channels is one of the dims being reduced - is that correct?

If so, we can leave the more generalized implementation for later, but we should add some checks to make sure we don't lower unsupported cases to Vulkan 😛

Would also recommend renaming this function to reduce_2d_non_texel_dim or reduce_2d_non_packed_dim.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Yup you're right, this doesn't support reduction among the elements of a texel. Just changed to reduce_2d_non_packed_dim. Let me know if you're aligned

reduce_dim1 = nchw_dim_to_whcn_dim(reduce_dim1, ndim);
reduce_dim2 = nchw_dim_to_whcn_dim(reduce_dim2, ndim);

// Check that the concat dim is not one of the reduction dims

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

should also add a check that graph.packed_dim_of(in) and graph.packed_dim_of(out) is not one of the reduction dims.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Just added above this comment. Let me know if you're aligned

@alexdean08
alexdean08 merged commit 112a09f into pytorch:mainAug 6, 2025
99 of 102 checks passed
agrima1304 pushed a commit to agrima1304/executorch that referenced this pull request Aug 26, 2025
Summary: This change adds 2D reduction to the Vulkan delegate. Prior to
this change, only 1D reduction was implemented. Models like MobileNetV3
and ResNet do 2D reduction, and their performance was being negatively
impacted by the lack of a 2D reduction Vulkan implementation.
cc @SS-JIA@manuelcandales@cbilgin
---------
Co-authored-by: Mateusz Sluszniak <56299341+msluszniak@users.noreply.github.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

CLA SignedThis label is managed by the Facebook bot. Authors need to sign the CLA before a PR can be reviewed.module: vulkanIssues related to the Vulkan delegate and code under backends/vulkan/release notes: vulkanChanges to the Vulkan backend delegate

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@alexdean08@SS-JIA@msluszniak@facebook-github-bot
, '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

[ET-VK] Add 2D Reduction to Vulkan Backend - #12860

Merged
alexdean08 merged 8 commits into
pytorch:mainfrom
sarc-acl:main
Aug 6, 2025
Merged

[ET-VK] Add 2D Reduction to Vulkan Backend#12860
alexdean08 merged 8 commits into
pytorch:mainfrom
sarc-acl:main

Conversation

@alexdean08

@alexdean08alexdean08 commented Jul 25, 2025

Copy link
Copy Markdown
Contributor

Summary: This change adds 2D reduction to the Vulkan delegate. Prior to this change, only 1D reduction was implemented. Models like MobileNetV3 and ResNet do 2D reduction, and their performance was being negatively impacted by the lack of a 2D reduction Vulkan implementation.

cc @SS-JIA@manuelcandales@cbilgin

@alexdean08
alexdean08 requested a review from SS-JIA as a code ownerJuly 25, 2025 17:54
@pytorch-botpytorch-botBot added the module: vulkan Issues related to the Vulkan delegate and code under backends/vulkan/ label Jul 25, 2025
@pytorch-bot

pytorch-botBot commented Jul 25, 2025

Copy link
Copy Markdown

🔗 Helpful Links

🧪 See artifacts and rendered test results at hud.pytorch.org/pr/pytorch/executorch/12860

Note: Links to docs will display an error until the docs builds have been completed.

❗ 1 Active SEVs

There are 1 currently active SEVs. If your PR is affected, please view them below:

❌ 2 New Failures, 1 Unrelated Failure

As of commit 3ca809f with merge base 9d86cbe (image):

NEW FAILURES - The following jobs have failed:

BROKEN TRUNK - The following job failed but were present on the merge base:

👉 Rebase onto the `viable/strict` branch to avoid these failures

This comment was automatically generated by Dr. CI and updates every 15 minutes.

@facebook-github-botfacebook-github-bot added the CLA Signed This label is managed by the Facebook bot. Authors need to sign the CLA before a PR can be reviewed. label Jul 25, 2025
@alexdean08

Copy link
Copy Markdown
ContributorAuthor

@pytorchbot label "release notes: vulkan"

@pytorch-botpytorch-botBot added the release notes: vulkan Changes to the Vulkan backend delegate label Jul 25, 2025
Comment threadbackends/vulkan/runtime/graph/ops/impl/Reduce.cpp Outdated
Co-authored-by: Mateusz Sluszniak <56299341+msluszniak@users.noreply.github.com>

@SS-JIASS-JIA left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

LGTM with some small comments. Thanks for working on this!

// with the accumulator.
#define POSTPROCESS(accum) ${POSTPROCESS}

void reduce_2d(const ivec2 tid, ivec3 scan_pos) {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

As I understand it, this implementation doesn't currently support reduction among the elements of a texel,.

So for example for a tensor of size (channels = 4, height = 16, width = 16) where reading one texel returns 4 channels, this function would only be able to handle reduction along the height and width dims, but not if channels is one of the dims being reduced - is that correct?

If so, we can leave the more generalized implementation for later, but we should add some checks to make sure we don't lower unsupported cases to Vulkan 😛

Would also recommend renaming this function to reduce_2d_non_texel_dim or reduce_2d_non_packed_dim.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Yup you're right, this doesn't support reduction among the elements of a texel. Just changed to reduce_2d_non_packed_dim. Let me know if you're aligned

reduce_dim1 = nchw_dim_to_whcn_dim(reduce_dim1, ndim);
reduce_dim2 = nchw_dim_to_whcn_dim(reduce_dim2, ndim);

// Check that the concat dim is not one of the reduction dims

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

should also add a check that graph.packed_dim_of(in) and graph.packed_dim_of(out) is not one of the reduction dims.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Just added above this comment. Let me know if you're aligned

@alexdean08
alexdean08 merged commit 112a09f into pytorch:mainAug 6, 2025
99 of 102 checks passed
agrima1304 pushed a commit to agrima1304/executorch that referenced this pull request Aug 26, 2025
Summary: This change adds 2D reduction to the Vulkan delegate. Prior to
this change, only 1D reduction was implemented. Models like MobileNetV3
and ResNet do 2D reduction, and their performance was being negatively
impacted by the lack of a 2D reduction Vulkan implementation.
cc @SS-JIA@manuelcandales@cbilgin
---------
Co-authored-by: Mateusz Sluszniak <56299341+msluszniak@users.noreply.github.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

CLA SignedThis label is managed by the Facebook bot. Authors need to sign the CLA before a PR can be reviewed.module: vulkanIssues related to the Vulkan delegate and code under backends/vulkan/release notes: vulkanChanges to the Vulkan backend delegate

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@alexdean08@SS-JIA@msluszniak@facebook-github-bot
, '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

[ET-VK] Add 2D Reduction to Vulkan Backend - #12860

Merged
alexdean08 merged 8 commits into
pytorch:mainfrom
sarc-acl:main
Aug 6, 2025
Merged

[ET-VK] Add 2D Reduction to Vulkan Backend#12860
alexdean08 merged 8 commits into
pytorch:mainfrom
sarc-acl:main

Conversation

@alexdean08

@alexdean08alexdean08 commented Jul 25, 2025

Copy link
Copy Markdown
Contributor

Summary: This change adds 2D reduction to the Vulkan delegate. Prior to this change, only 1D reduction was implemented. Models like MobileNetV3 and ResNet do 2D reduction, and their performance was being negatively impacted by the lack of a 2D reduction Vulkan implementation.

cc @SS-JIA@manuelcandales@cbilgin

@alexdean08
alexdean08 requested a review from SS-JIA as a code ownerJuly 25, 2025 17:54
@pytorch-botpytorch-botBot added the module: vulkan Issues related to the Vulkan delegate and code under backends/vulkan/ label Jul 25, 2025
@pytorch-bot

pytorch-botBot commented Jul 25, 2025

Copy link
Copy Markdown

🔗 Helpful Links

🧪 See artifacts and rendered test results at hud.pytorch.org/pr/pytorch/executorch/12860

Note: Links to docs will display an error until the docs builds have been completed.

❗ 1 Active SEVs

There are 1 currently active SEVs. If your PR is affected, please view them below:

❌ 2 New Failures, 1 Unrelated Failure

As of commit 3ca809f with merge base 9d86cbe (image):

NEW FAILURES - The following jobs have failed:

BROKEN TRUNK - The following job failed but were present on the merge base:

👉 Rebase onto the `viable/strict` branch to avoid these failures

This comment was automatically generated by Dr. CI and updates every 15 minutes.

@facebook-github-botfacebook-github-bot added the CLA Signed This label is managed by the Facebook bot. Authors need to sign the CLA before a PR can be reviewed. label Jul 25, 2025
@alexdean08

Copy link
Copy Markdown
ContributorAuthor

@pytorchbot label "release notes: vulkan"

@pytorch-botpytorch-botBot added the release notes: vulkan Changes to the Vulkan backend delegate label Jul 25, 2025
Comment threadbackends/vulkan/runtime/graph/ops/impl/Reduce.cpp Outdated
Co-authored-by: Mateusz Sluszniak <56299341+msluszniak@users.noreply.github.com>

@SS-JIASS-JIA left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

LGTM with some small comments. Thanks for working on this!

// with the accumulator.
#define POSTPROCESS(accum) ${POSTPROCESS}

void reduce_2d(const ivec2 tid, ivec3 scan_pos) {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

As I understand it, this implementation doesn't currently support reduction among the elements of a texel,.

So for example for a tensor of size (channels = 4, height = 16, width = 16) where reading one texel returns 4 channels, this function would only be able to handle reduction along the height and width dims, but not if channels is one of the dims being reduced - is that correct?

If so, we can leave the more generalized implementation for later, but we should add some checks to make sure we don't lower unsupported cases to Vulkan 😛

Would also recommend renaming this function to reduce_2d_non_texel_dim or reduce_2d_non_packed_dim.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Yup you're right, this doesn't support reduction among the elements of a texel. Just changed to reduce_2d_non_packed_dim. Let me know if you're aligned

reduce_dim1 = nchw_dim_to_whcn_dim(reduce_dim1, ndim);
reduce_dim2 = nchw_dim_to_whcn_dim(reduce_dim2, ndim);

// Check that the concat dim is not one of the reduction dims

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

should also add a check that graph.packed_dim_of(in) and graph.packed_dim_of(out) is not one of the reduction dims.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Just added above this comment. Let me know if you're aligned

@alexdean08
alexdean08 merged commit 112a09f into pytorch:mainAug 6, 2025
99 of 102 checks passed
agrima1304 pushed a commit to agrima1304/executorch that referenced this pull request Aug 26, 2025
Summary: This change adds 2D reduction to the Vulkan delegate. Prior to
this change, only 1D reduction was implemented. Models like MobileNetV3
and ResNet do 2D reduction, and their performance was being negatively
impacted by the lack of a 2D reduction Vulkan implementation.
cc @SS-JIA@manuelcandales@cbilgin
---------
Co-authored-by: Mateusz Sluszniak <56299341+msluszniak@users.noreply.github.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

CLA SignedThis label is managed by the Facebook bot. Authors need to sign the CLA before a PR can be reviewed.module: vulkanIssues related to the Vulkan delegate and code under backends/vulkan/release notes: vulkanChanges to the Vulkan backend delegate

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@alexdean08@SS-JIA@msluszniak@facebook-github-bot