[SVE] Implement scalable vectors in TVM - #16347

Closed
ekalda wants to merge 6 commits into
apache:mainfrom
ekalda:vscale-in-tir
Closed

[SVE] Implement scalable vectors in TVM#16347
ekalda wants to merge 6 commits into
apache:mainfrom
ekalda:vscale-in-tir

Conversation

@ekalda

@ekaldaekalda commented Jan 4, 2024

Copy link
Copy Markdown
Contributor

This prototype is to accompany the open SVE RFC. It implements the design outlined in the RFC.

The main changes to the stack include:

  1. tir.split can accept an expression with vscale as a factor

  2. LoopVectorizer can create Ramp and Broadcast nodes with scalable lanes

  3. BufferLoad and BufferStore nodes can accept an optional predicate which is created in LoopVectorizer

  4. LLVM codegen can lower the scalable predicated vectors into llvm.masked.* intrinsics

The prototype is currently missing tir.tileand TVMScript parser support for predicates.

@cbalint13cbalint13 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.

One minor nit to the code part.

Comment threadsrc/target/llvm/codegen_llvm.cc Outdated
@cbalint13

Copy link
Copy Markdown
Contributor
  1. tir.split can accept an expression with vscale as a factor
  2. LoopVectorizer can create Ramp and Broadcast nodes with scalable lanes
  3. BufferLoad and BufferStore nodes can accept an optional predicate which is created in LoopVectorizer
  4. LLVM codegen can lower the scalable predicated vectors into llvm.masked.* intrinsics

The prototype is currently missing tir.tile and TVMScript parser support for predicates.

Hi @ekalda ,

Very nice work !

I can't comment much, I think this implementation is a careful step toward SVE.
Will test this on some RVV CPU implementation to see a walk through the LLVM masked.* things.

@ekalda

Copy link
Copy Markdown
ContributorAuthor

@tvm-bot rerun

ekaldaand others added 6 commits January 22, 2024 09:23
This prototype is to accompany the open SVE RFC. It implements the
design outlined in the RFC.
The main changes to the stack include:
1. tir.split can accept an expression with vscale as a factor
2. LoopVectorizer can create Ramp and Broadcast nodes with scalable
lanes
3. BufferLoad and BufferStore nodes can accept an optional predicate
which is created in LoopVectorizer
4. LLVM codegen can lower the scalable predicated vectors into
llvm.masked.* intrinsics
The prototype is currently missing tir.tile and TVMScript parser support
for predicates.
Co-authored-by: Luke Hutton <luke.hutton@arm.com>
Co-authored-by: Neil Hickey <neil.hickey@arm.com>
Change-Id: I7d90c8b8396ba7a2b609a91bea2fe5f599d5cb96
Change-Id: I2e994ffdacaf1dacdc875c2cfd62be433e6952c6
This commit adds support for expressing and printing buffer loads/stores
in TVMScript.
The buffer API has been extended with load and store methods which
support passing a predicate parameter to BufferLoad/Store. When the
printer encounters a predicated BufferLoad/Store, it will print with
the .load/.store syntax as opposed to the shorthand [...] syntax as
it is easier to represent predicates.
Extending the functionality of vload and vstore was considered but they
do not currently support expressing loading/storing of non-consecutive
values and such a change will result in many changes across the
codebase.
An example of a predicated load and store in TVMScript:
```
A.load(
[T.Ramp(i_0 * 4, 1, 4)],
predicate=T.get_active_lane_mask("int1x4", i_0 * 4, 14),
)
B.store(
T.Broadcast(T.float32(1), 4),
[T.Ramp(i_0 * 4, 1, 4)],
predicate=T.get_active_lane_mask("int1x4", i_0 * 4, 14),
)
```
Change-Id: I1305c1b5d052ad109232604c6660e40d4a566dd6
Change-Id: I8a893377d7361bed8840a645fbaff81ab401ccb8
Plumb this argument through the te.split implementation to achieve
feature parity with tir.split.
Change-Id: I92707bc08e857b9fd5678153d998aeecebcce228
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@ekalda@cbalint13@tqchen@lhutton1
, '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

[SVE] Implement scalable vectors in TVM - #16347

Closed
ekalda wants to merge 6 commits into
apache:mainfrom
ekalda:vscale-in-tir
Closed

[SVE] Implement scalable vectors in TVM#16347
ekalda wants to merge 6 commits into
apache:mainfrom
ekalda:vscale-in-tir

Conversation

@ekalda

@ekaldaekalda commented Jan 4, 2024

Copy link
Copy Markdown
Contributor

This prototype is to accompany the open SVE RFC. It implements the design outlined in the RFC.

The main changes to the stack include:

  1. tir.split can accept an expression with vscale as a factor

  2. LoopVectorizer can create Ramp and Broadcast nodes with scalable lanes

  3. BufferLoad and BufferStore nodes can accept an optional predicate which is created in LoopVectorizer

  4. LLVM codegen can lower the scalable predicated vectors into llvm.masked.* intrinsics

The prototype is currently missing tir.tileand TVMScript parser support for predicates.

@cbalint13cbalint13 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.

One minor nit to the code part.

Comment threadsrc/target/llvm/codegen_llvm.cc Outdated
@cbalint13

Copy link
Copy Markdown
Contributor
  1. tir.split can accept an expression with vscale as a factor
  2. LoopVectorizer can create Ramp and Broadcast nodes with scalable lanes
  3. BufferLoad and BufferStore nodes can accept an optional predicate which is created in LoopVectorizer
  4. LLVM codegen can lower the scalable predicated vectors into llvm.masked.* intrinsics

The prototype is currently missing tir.tile and TVMScript parser support for predicates.

Hi @ekalda ,

Very nice work !

I can't comment much, I think this implementation is a careful step toward SVE.
Will test this on some RVV CPU implementation to see a walk through the LLVM masked.* things.

@ekalda

Copy link
Copy Markdown
ContributorAuthor

@tvm-bot rerun

ekaldaand others added 6 commits January 22, 2024 09:23
This prototype is to accompany the open SVE RFC. It implements the
design outlined in the RFC.
The main changes to the stack include:
1. tir.split can accept an expression with vscale as a factor
2. LoopVectorizer can create Ramp and Broadcast nodes with scalable
lanes
3. BufferLoad and BufferStore nodes can accept an optional predicate
which is created in LoopVectorizer
4. LLVM codegen can lower the scalable predicated vectors into
llvm.masked.* intrinsics
The prototype is currently missing tir.tile and TVMScript parser support
for predicates.
Co-authored-by: Luke Hutton <luke.hutton@arm.com>
Co-authored-by: Neil Hickey <neil.hickey@arm.com>
Change-Id: I7d90c8b8396ba7a2b609a91bea2fe5f599d5cb96
Change-Id: I2e994ffdacaf1dacdc875c2cfd62be433e6952c6
This commit adds support for expressing and printing buffer loads/stores
in TVMScript.
The buffer API has been extended with load and store methods which
support passing a predicate parameter to BufferLoad/Store. When the
printer encounters a predicated BufferLoad/Store, it will print with
the .load/.store syntax as opposed to the shorthand [...] syntax as
it is easier to represent predicates.
Extending the functionality of vload and vstore was considered but they
do not currently support expressing loading/storing of non-consecutive
values and such a change will result in many changes across the
codebase.
An example of a predicated load and store in TVMScript:
```
A.load(
[T.Ramp(i_0 * 4, 1, 4)],
predicate=T.get_active_lane_mask("int1x4", i_0 * 4, 14),
)
B.store(
T.Broadcast(T.float32(1), 4),
[T.Ramp(i_0 * 4, 1, 4)],
predicate=T.get_active_lane_mask("int1x4", i_0 * 4, 14),
)
```
Change-Id: I1305c1b5d052ad109232604c6660e40d4a566dd6
Change-Id: I8a893377d7361bed8840a645fbaff81ab401ccb8
Plumb this argument through the te.split implementation to achieve
feature parity with tir.split.
Change-Id: I92707bc08e857b9fd5678153d998aeecebcce228
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@ekalda@cbalint13@tqchen@lhutton1
, '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

[SVE] Implement scalable vectors in TVM - #16347

Closed
ekalda wants to merge 6 commits into
apache:mainfrom
ekalda:vscale-in-tir
Closed

[SVE] Implement scalable vectors in TVM#16347
ekalda wants to merge 6 commits into
apache:mainfrom
ekalda:vscale-in-tir

Conversation

@ekalda

@ekaldaekalda commented Jan 4, 2024

Copy link
Copy Markdown
Contributor

This prototype is to accompany the open SVE RFC. It implements the design outlined in the RFC.

The main changes to the stack include:

  1. tir.split can accept an expression with vscale as a factor

  2. LoopVectorizer can create Ramp and Broadcast nodes with scalable lanes

  3. BufferLoad and BufferStore nodes can accept an optional predicate which is created in LoopVectorizer

  4. LLVM codegen can lower the scalable predicated vectors into llvm.masked.* intrinsics

The prototype is currently missing tir.tileand TVMScript parser support for predicates.

@cbalint13cbalint13 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.

One minor nit to the code part.

Comment threadsrc/target/llvm/codegen_llvm.cc Outdated
@cbalint13

Copy link
Copy Markdown
Contributor
  1. tir.split can accept an expression with vscale as a factor
  2. LoopVectorizer can create Ramp and Broadcast nodes with scalable lanes
  3. BufferLoad and BufferStore nodes can accept an optional predicate which is created in LoopVectorizer
  4. LLVM codegen can lower the scalable predicated vectors into llvm.masked.* intrinsics

The prototype is currently missing tir.tile and TVMScript parser support for predicates.

Hi @ekalda ,

Very nice work !

I can't comment much, I think this implementation is a careful step toward SVE.
Will test this on some RVV CPU implementation to see a walk through the LLVM masked.* things.

@ekalda

Copy link
Copy Markdown
ContributorAuthor

@tvm-bot rerun

ekaldaand others added 6 commits January 22, 2024 09:23
This prototype is to accompany the open SVE RFC. It implements the
design outlined in the RFC.
The main changes to the stack include:
1. tir.split can accept an expression with vscale as a factor
2. LoopVectorizer can create Ramp and Broadcast nodes with scalable
lanes
3. BufferLoad and BufferStore nodes can accept an optional predicate
which is created in LoopVectorizer
4. LLVM codegen can lower the scalable predicated vectors into
llvm.masked.* intrinsics
The prototype is currently missing tir.tile and TVMScript parser support
for predicates.
Co-authored-by: Luke Hutton <luke.hutton@arm.com>
Co-authored-by: Neil Hickey <neil.hickey@arm.com>
Change-Id: I7d90c8b8396ba7a2b609a91bea2fe5f599d5cb96
Change-Id: I2e994ffdacaf1dacdc875c2cfd62be433e6952c6
This commit adds support for expressing and printing buffer loads/stores
in TVMScript.
The buffer API has been extended with load and store methods which
support passing a predicate parameter to BufferLoad/Store. When the
printer encounters a predicated BufferLoad/Store, it will print with
the .load/.store syntax as opposed to the shorthand [...] syntax as
it is easier to represent predicates.
Extending the functionality of vload and vstore was considered but they
do not currently support expressing loading/storing of non-consecutive
values and such a change will result in many changes across the
codebase.
An example of a predicated load and store in TVMScript:
```
A.load(
[T.Ramp(i_0 * 4, 1, 4)],
predicate=T.get_active_lane_mask("int1x4", i_0 * 4, 14),
)
B.store(
T.Broadcast(T.float32(1), 4),
[T.Ramp(i_0 * 4, 1, 4)],
predicate=T.get_active_lane_mask("int1x4", i_0 * 4, 14),
)
```
Change-Id: I1305c1b5d052ad109232604c6660e40d4a566dd6
Change-Id: I8a893377d7361bed8840a645fbaff81ab401ccb8
Plumb this argument through the te.split implementation to achieve
feature parity with tir.split.
Change-Id: I92707bc08e857b9fd5678153d998aeecebcce228
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@ekalda@cbalint13@tqchen@lhutton1
, '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

[SVE] Implement scalable vectors in TVM - #16347

Closed
ekalda wants to merge 6 commits into
apache:mainfrom
ekalda:vscale-in-tir
Closed

[SVE] Implement scalable vectors in TVM#16347
ekalda wants to merge 6 commits into
apache:mainfrom
ekalda:vscale-in-tir

Conversation

@ekalda

@ekaldaekalda commented Jan 4, 2024

Copy link
Copy Markdown
Contributor

This prototype is to accompany the open SVE RFC. It implements the design outlined in the RFC.

The main changes to the stack include:

  1. tir.split can accept an expression with vscale as a factor

  2. LoopVectorizer can create Ramp and Broadcast nodes with scalable lanes

  3. BufferLoad and BufferStore nodes can accept an optional predicate which is created in LoopVectorizer

  4. LLVM codegen can lower the scalable predicated vectors into llvm.masked.* intrinsics

The prototype is currently missing tir.tileand TVMScript parser support for predicates.

@cbalint13cbalint13 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.

One minor nit to the code part.

Comment threadsrc/target/llvm/codegen_llvm.cc Outdated
@cbalint13

Copy link
Copy Markdown
Contributor
  1. tir.split can accept an expression with vscale as a factor
  2. LoopVectorizer can create Ramp and Broadcast nodes with scalable lanes
  3. BufferLoad and BufferStore nodes can accept an optional predicate which is created in LoopVectorizer
  4. LLVM codegen can lower the scalable predicated vectors into llvm.masked.* intrinsics

The prototype is currently missing tir.tile and TVMScript parser support for predicates.

Hi @ekalda ,

Very nice work !

I can't comment much, I think this implementation is a careful step toward SVE.
Will test this on some RVV CPU implementation to see a walk through the LLVM masked.* things.

@ekalda

Copy link
Copy Markdown
ContributorAuthor

@tvm-bot rerun

ekaldaand others added 6 commits January 22, 2024 09:23
This prototype is to accompany the open SVE RFC. It implements the
design outlined in the RFC.
The main changes to the stack include:
1. tir.split can accept an expression with vscale as a factor
2. LoopVectorizer can create Ramp and Broadcast nodes with scalable
lanes
3. BufferLoad and BufferStore nodes can accept an optional predicate
which is created in LoopVectorizer
4. LLVM codegen can lower the scalable predicated vectors into
llvm.masked.* intrinsics
The prototype is currently missing tir.tile and TVMScript parser support
for predicates.
Co-authored-by: Luke Hutton <luke.hutton@arm.com>
Co-authored-by: Neil Hickey <neil.hickey@arm.com>
Change-Id: I7d90c8b8396ba7a2b609a91bea2fe5f599d5cb96
Change-Id: I2e994ffdacaf1dacdc875c2cfd62be433e6952c6
This commit adds support for expressing and printing buffer loads/stores
in TVMScript.
The buffer API has been extended with load and store methods which
support passing a predicate parameter to BufferLoad/Store. When the
printer encounters a predicated BufferLoad/Store, it will print with
the .load/.store syntax as opposed to the shorthand [...] syntax as
it is easier to represent predicates.
Extending the functionality of vload and vstore was considered but they
do not currently support expressing loading/storing of non-consecutive
values and such a change will result in many changes across the
codebase.
An example of a predicated load and store in TVMScript:
```
A.load(
[T.Ramp(i_0 * 4, 1, 4)],
predicate=T.get_active_lane_mask("int1x4", i_0 * 4, 14),
)
B.store(
T.Broadcast(T.float32(1), 4),
[T.Ramp(i_0 * 4, 1, 4)],
predicate=T.get_active_lane_mask("int1x4", i_0 * 4, 14),
)
```
Change-Id: I1305c1b5d052ad109232604c6660e40d4a566dd6
Change-Id: I8a893377d7361bed8840a645fbaff81ab401ccb8
Plumb this argument through the te.split implementation to achieve
feature parity with tir.split.
Change-Id: I92707bc08e857b9fd5678153d998aeecebcce228
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@ekalda@cbalint13@tqchen@lhutton1
, '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

[SVE] Implement scalable vectors in TVM - #16347

Closed
ekalda wants to merge 6 commits into
apache:mainfrom
ekalda:vscale-in-tir
Closed

[SVE] Implement scalable vectors in TVM#16347
ekalda wants to merge 6 commits into
apache:mainfrom
ekalda:vscale-in-tir

Conversation

@ekalda

@ekaldaekalda commented Jan 4, 2024

Copy link
Copy Markdown
Contributor

This prototype is to accompany the open SVE RFC. It implements the design outlined in the RFC.

The main changes to the stack include:

  1. tir.split can accept an expression with vscale as a factor

  2. LoopVectorizer can create Ramp and Broadcast nodes with scalable lanes

  3. BufferLoad and BufferStore nodes can accept an optional predicate which is created in LoopVectorizer

  4. LLVM codegen can lower the scalable predicated vectors into llvm.masked.* intrinsics

The prototype is currently missing tir.tileand TVMScript parser support for predicates.

@cbalint13cbalint13 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.

One minor nit to the code part.

Comment threadsrc/target/llvm/codegen_llvm.cc Outdated
@cbalint13

Copy link
Copy Markdown
Contributor
  1. tir.split can accept an expression with vscale as a factor
  2. LoopVectorizer can create Ramp and Broadcast nodes with scalable lanes
  3. BufferLoad and BufferStore nodes can accept an optional predicate which is created in LoopVectorizer
  4. LLVM codegen can lower the scalable predicated vectors into llvm.masked.* intrinsics

The prototype is currently missing tir.tile and TVMScript parser support for predicates.

Hi @ekalda ,

Very nice work !

I can't comment much, I think this implementation is a careful step toward SVE.
Will test this on some RVV CPU implementation to see a walk through the LLVM masked.* things.

@ekalda

Copy link
Copy Markdown
ContributorAuthor

@tvm-bot rerun

ekaldaand others added 6 commits January 22, 2024 09:23
This prototype is to accompany the open SVE RFC. It implements the
design outlined in the RFC.
The main changes to the stack include:
1. tir.split can accept an expression with vscale as a factor
2. LoopVectorizer can create Ramp and Broadcast nodes with scalable
lanes
3. BufferLoad and BufferStore nodes can accept an optional predicate
which is created in LoopVectorizer
4. LLVM codegen can lower the scalable predicated vectors into
llvm.masked.* intrinsics
The prototype is currently missing tir.tile and TVMScript parser support
for predicates.
Co-authored-by: Luke Hutton <luke.hutton@arm.com>
Co-authored-by: Neil Hickey <neil.hickey@arm.com>
Change-Id: I7d90c8b8396ba7a2b609a91bea2fe5f599d5cb96
Change-Id: I2e994ffdacaf1dacdc875c2cfd62be433e6952c6
This commit adds support for expressing and printing buffer loads/stores
in TVMScript.
The buffer API has been extended with load and store methods which
support passing a predicate parameter to BufferLoad/Store. When the
printer encounters a predicated BufferLoad/Store, it will print with
the .load/.store syntax as opposed to the shorthand [...] syntax as
it is easier to represent predicates.
Extending the functionality of vload and vstore was considered but they
do not currently support expressing loading/storing of non-consecutive
values and such a change will result in many changes across the
codebase.
An example of a predicated load and store in TVMScript:
```
A.load(
[T.Ramp(i_0 * 4, 1, 4)],
predicate=T.get_active_lane_mask("int1x4", i_0 * 4, 14),
)
B.store(
T.Broadcast(T.float32(1), 4),
[T.Ramp(i_0 * 4, 1, 4)],
predicate=T.get_active_lane_mask("int1x4", i_0 * 4, 14),
)
```
Change-Id: I1305c1b5d052ad109232604c6660e40d4a566dd6
Change-Id: I8a893377d7361bed8840a645fbaff81ab401ccb8
Plumb this argument through the te.split implementation to achieve
feature parity with tir.split.
Change-Id: I92707bc08e857b9fd5678153d998aeecebcce228
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@ekalda@cbalint13@tqchen@lhutton1
, '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

[SVE] Implement scalable vectors in TVM - #16347

Closed
ekalda wants to merge 6 commits into
apache:mainfrom
ekalda:vscale-in-tir
Closed

[SVE] Implement scalable vectors in TVM#16347
ekalda wants to merge 6 commits into
apache:mainfrom
ekalda:vscale-in-tir

Conversation

@ekalda

@ekaldaekalda commented Jan 4, 2024

Copy link
Copy Markdown
Contributor

This prototype is to accompany the open SVE RFC. It implements the design outlined in the RFC.

The main changes to the stack include:

  1. tir.split can accept an expression with vscale as a factor

  2. LoopVectorizer can create Ramp and Broadcast nodes with scalable lanes

  3. BufferLoad and BufferStore nodes can accept an optional predicate which is created in LoopVectorizer

  4. LLVM codegen can lower the scalable predicated vectors into llvm.masked.* intrinsics

The prototype is currently missing tir.tileand TVMScript parser support for predicates.

@cbalint13cbalint13 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.

One minor nit to the code part.

Comment threadsrc/target/llvm/codegen_llvm.cc Outdated
@cbalint13

Copy link
Copy Markdown
Contributor
  1. tir.split can accept an expression with vscale as a factor
  2. LoopVectorizer can create Ramp and Broadcast nodes with scalable lanes
  3. BufferLoad and BufferStore nodes can accept an optional predicate which is created in LoopVectorizer
  4. LLVM codegen can lower the scalable predicated vectors into llvm.masked.* intrinsics

The prototype is currently missing tir.tile and TVMScript parser support for predicates.

Hi @ekalda ,

Very nice work !

I can't comment much, I think this implementation is a careful step toward SVE.
Will test this on some RVV CPU implementation to see a walk through the LLVM masked.* things.

@ekalda

Copy link
Copy Markdown
ContributorAuthor

@tvm-bot rerun

ekaldaand others added 6 commits January 22, 2024 09:23
This prototype is to accompany the open SVE RFC. It implements the
design outlined in the RFC.
The main changes to the stack include:
1. tir.split can accept an expression with vscale as a factor
2. LoopVectorizer can create Ramp and Broadcast nodes with scalable
lanes
3. BufferLoad and BufferStore nodes can accept an optional predicate
which is created in LoopVectorizer
4. LLVM codegen can lower the scalable predicated vectors into
llvm.masked.* intrinsics
The prototype is currently missing tir.tile and TVMScript parser support
for predicates.
Co-authored-by: Luke Hutton <luke.hutton@arm.com>
Co-authored-by: Neil Hickey <neil.hickey@arm.com>
Change-Id: I7d90c8b8396ba7a2b609a91bea2fe5f599d5cb96
Change-Id: I2e994ffdacaf1dacdc875c2cfd62be433e6952c6
This commit adds support for expressing and printing buffer loads/stores
in TVMScript.
The buffer API has been extended with load and store methods which
support passing a predicate parameter to BufferLoad/Store. When the
printer encounters a predicated BufferLoad/Store, it will print with
the .load/.store syntax as opposed to the shorthand [...] syntax as
it is easier to represent predicates.
Extending the functionality of vload and vstore was considered but they
do not currently support expressing loading/storing of non-consecutive
values and such a change will result in many changes across the
codebase.
An example of a predicated load and store in TVMScript:
```
A.load(
[T.Ramp(i_0 * 4, 1, 4)],
predicate=T.get_active_lane_mask("int1x4", i_0 * 4, 14),
)
B.store(
T.Broadcast(T.float32(1), 4),
[T.Ramp(i_0 * 4, 1, 4)],
predicate=T.get_active_lane_mask("int1x4", i_0 * 4, 14),
)
```
Change-Id: I1305c1b5d052ad109232604c6660e40d4a566dd6
Change-Id: I8a893377d7361bed8840a645fbaff81ab401ccb8
Plumb this argument through the te.split implementation to achieve
feature parity with tir.split.
Change-Id: I92707bc08e857b9fd5678153d998aeecebcce228
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@ekalda@cbalint13@tqchen@lhutton1
, '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

[SVE] Implement scalable vectors in TVM - #16347

Closed
ekalda wants to merge 6 commits into
apache:mainfrom
ekalda:vscale-in-tir
Closed

[SVE] Implement scalable vectors in TVM#16347
ekalda wants to merge 6 commits into
apache:mainfrom
ekalda:vscale-in-tir

Conversation

@ekalda

@ekaldaekalda commented Jan 4, 2024

Copy link
Copy Markdown
Contributor

This prototype is to accompany the open SVE RFC. It implements the design outlined in the RFC.

The main changes to the stack include:

  1. tir.split can accept an expression with vscale as a factor

  2. LoopVectorizer can create Ramp and Broadcast nodes with scalable lanes

  3. BufferLoad and BufferStore nodes can accept an optional predicate which is created in LoopVectorizer

  4. LLVM codegen can lower the scalable predicated vectors into llvm.masked.* intrinsics

The prototype is currently missing tir.tileand TVMScript parser support for predicates.

@cbalint13cbalint13 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.

One minor nit to the code part.

Comment threadsrc/target/llvm/codegen_llvm.cc Outdated
@cbalint13

Copy link
Copy Markdown
Contributor
  1. tir.split can accept an expression with vscale as a factor
  2. LoopVectorizer can create Ramp and Broadcast nodes with scalable lanes
  3. BufferLoad and BufferStore nodes can accept an optional predicate which is created in LoopVectorizer
  4. LLVM codegen can lower the scalable predicated vectors into llvm.masked.* intrinsics

The prototype is currently missing tir.tile and TVMScript parser support for predicates.

Hi @ekalda ,

Very nice work !

I can't comment much, I think this implementation is a careful step toward SVE.
Will test this on some RVV CPU implementation to see a walk through the LLVM masked.* things.

@ekalda

Copy link
Copy Markdown
ContributorAuthor

@tvm-bot rerun

ekaldaand others added 6 commits January 22, 2024 09:23
This prototype is to accompany the open SVE RFC. It implements the
design outlined in the RFC.
The main changes to the stack include:
1. tir.split can accept an expression with vscale as a factor
2. LoopVectorizer can create Ramp and Broadcast nodes with scalable
lanes
3. BufferLoad and BufferStore nodes can accept an optional predicate
which is created in LoopVectorizer
4. LLVM codegen can lower the scalable predicated vectors into
llvm.masked.* intrinsics
The prototype is currently missing tir.tile and TVMScript parser support
for predicates.
Co-authored-by: Luke Hutton <luke.hutton@arm.com>
Co-authored-by: Neil Hickey <neil.hickey@arm.com>
Change-Id: I7d90c8b8396ba7a2b609a91bea2fe5f599d5cb96
Change-Id: I2e994ffdacaf1dacdc875c2cfd62be433e6952c6
This commit adds support for expressing and printing buffer loads/stores
in TVMScript.
The buffer API has been extended with load and store methods which
support passing a predicate parameter to BufferLoad/Store. When the
printer encounters a predicated BufferLoad/Store, it will print with
the .load/.store syntax as opposed to the shorthand [...] syntax as
it is easier to represent predicates.
Extending the functionality of vload and vstore was considered but they
do not currently support expressing loading/storing of non-consecutive
values and such a change will result in many changes across the
codebase.
An example of a predicated load and store in TVMScript:
```
A.load(
[T.Ramp(i_0 * 4, 1, 4)],
predicate=T.get_active_lane_mask("int1x4", i_0 * 4, 14),
)
B.store(
T.Broadcast(T.float32(1), 4),
[T.Ramp(i_0 * 4, 1, 4)],
predicate=T.get_active_lane_mask("int1x4", i_0 * 4, 14),
)
```
Change-Id: I1305c1b5d052ad109232604c6660e40d4a566dd6
Change-Id: I8a893377d7361bed8840a645fbaff81ab401ccb8
Plumb this argument through the te.split implementation to achieve
feature parity with tir.split.
Change-Id: I92707bc08e857b9fd5678153d998aeecebcce228
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@ekalda@cbalint13@tqchen@lhutton1
, '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

[SVE] Implement scalable vectors in TVM - #16347

Closed
ekalda wants to merge 6 commits into
apache:mainfrom
ekalda:vscale-in-tir
Closed

[SVE] Implement scalable vectors in TVM#16347
ekalda wants to merge 6 commits into
apache:mainfrom
ekalda:vscale-in-tir

Conversation

@ekalda

@ekaldaekalda commented Jan 4, 2024

Copy link
Copy Markdown
Contributor

This prototype is to accompany the open SVE RFC. It implements the design outlined in the RFC.

The main changes to the stack include:

  1. tir.split can accept an expression with vscale as a factor

  2. LoopVectorizer can create Ramp and Broadcast nodes with scalable lanes

  3. BufferLoad and BufferStore nodes can accept an optional predicate which is created in LoopVectorizer

  4. LLVM codegen can lower the scalable predicated vectors into llvm.masked.* intrinsics

The prototype is currently missing tir.tileand TVMScript parser support for predicates.

@cbalint13cbalint13 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.

One minor nit to the code part.

Comment threadsrc/target/llvm/codegen_llvm.cc Outdated
@cbalint13

Copy link
Copy Markdown
Contributor
  1. tir.split can accept an expression with vscale as a factor
  2. LoopVectorizer can create Ramp and Broadcast nodes with scalable lanes
  3. BufferLoad and BufferStore nodes can accept an optional predicate which is created in LoopVectorizer
  4. LLVM codegen can lower the scalable predicated vectors into llvm.masked.* intrinsics

The prototype is currently missing tir.tile and TVMScript parser support for predicates.

Hi @ekalda ,

Very nice work !

I can't comment much, I think this implementation is a careful step toward SVE.
Will test this on some RVV CPU implementation to see a walk through the LLVM masked.* things.

@ekalda

Copy link
Copy Markdown
ContributorAuthor

@tvm-bot rerun

ekaldaand others added 6 commits January 22, 2024 09:23
This prototype is to accompany the open SVE RFC. It implements the
design outlined in the RFC.
The main changes to the stack include:
1. tir.split can accept an expression with vscale as a factor
2. LoopVectorizer can create Ramp and Broadcast nodes with scalable
lanes
3. BufferLoad and BufferStore nodes can accept an optional predicate
which is created in LoopVectorizer
4. LLVM codegen can lower the scalable predicated vectors into
llvm.masked.* intrinsics
The prototype is currently missing tir.tile and TVMScript parser support
for predicates.
Co-authored-by: Luke Hutton <luke.hutton@arm.com>
Co-authored-by: Neil Hickey <neil.hickey@arm.com>
Change-Id: I7d90c8b8396ba7a2b609a91bea2fe5f599d5cb96
Change-Id: I2e994ffdacaf1dacdc875c2cfd62be433e6952c6
This commit adds support for expressing and printing buffer loads/stores
in TVMScript.
The buffer API has been extended with load and store methods which
support passing a predicate parameter to BufferLoad/Store. When the
printer encounters a predicated BufferLoad/Store, it will print with
the .load/.store syntax as opposed to the shorthand [...] syntax as
it is easier to represent predicates.
Extending the functionality of vload and vstore was considered but they
do not currently support expressing loading/storing of non-consecutive
values and such a change will result in many changes across the
codebase.
An example of a predicated load and store in TVMScript:
```
A.load(
[T.Ramp(i_0 * 4, 1, 4)],
predicate=T.get_active_lane_mask("int1x4", i_0 * 4, 14),
)
B.store(
T.Broadcast(T.float32(1), 4),
[T.Ramp(i_0 * 4, 1, 4)],
predicate=T.get_active_lane_mask("int1x4", i_0 * 4, 14),
)
```
Change-Id: I1305c1b5d052ad109232604c6660e40d4a566dd6
Change-Id: I8a893377d7361bed8840a645fbaff81ab401ccb8
Plumb this argument through the te.split implementation to achieve
feature parity with tir.split.
Change-Id: I92707bc08e857b9fd5678153d998aeecebcce228
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@ekalda@cbalint13@tqchen@lhutton1