feat: naive attention kernel - #51

Merged
tetsuo-cpp merged 5 commits into
canonfrom
flash-attention
Feb 22, 2026
Merged

feat: naive attention kernel#51
tetsuo-cpp merged 5 commits into
canonfrom
flash-attention

Conversation

@tetsuo-cpp

Copy link
Copy Markdown
Owner

Summary

  • Add NVIDIA libdevice bitcode to lib/Bitcode/ and link it in the NVVM pipeline for math intrinsics support
  • Add naive scaled dot-product attention kernel with causal masking and numerically stable softmax
  • Add FileCheck pipeline test and end-to-end GPU test with NumPy reference validation
  • Tighten Vast.ai offer search with reliability and bandwidth filters

Closes#44

@tetsuo-cpptetsuo-cpp changed the title feat: naive flash attention kernelfeat: naive attention kernelFeb 22, 2026

@tetsuo-cpptetsuo-cpp left a comment

Copy link
Copy Markdown
OwnerAuthor

Choose a reason for hiding this comment

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

Code Review

I traced through the full kernel stack state — the logic is correct:

  • Dot product: Q[row,:] . K[t,:] via a loop, scaled by 1/sqrt(head_dim)
  • Causal mask: t > row → -1e30
  • Softmax: numerically stable (max subtraction before exp), serial reductions by thread 0 ✓
  • V accumulation: O[row,t] = sum_j attn[j] * V[j,t]
  • Stack is clean at exit

Issues

1. Vendored binary — lib/Bitcode/libdevice.10.bc (484KB)

This is NVIDIA's libdevice checked directly into git (no LFS). Concerns:

  • Repo bloat: Binary blobs in git history can't be garbage-collected.
  • Licensing: libdevice is distributed under the NVIDIA EULA. Redistributing it may require attribution or may not be permitted.
  • Alternative: Download from the CUDA toolkit at build time, use Git LFS, or locate it at the system CUDA install path (/usr/local/cuda/nvvm/libdevice/libdevice.10.bc).

2. Hardcoded libdevice path via compile definition

target_compile_definitions(obj.MLIRConversionPasses PRIVATEWARPFORTH_LIBDEVICE_PATH="${WARPFORTH_LIBDEVICE_PATH}")

The path is baked in at compile time. If the build directory moves or the binary is installed elsewhere, the pipeline will fail. Consider a fallback chain: env var → CUDA toolkit path → bundled path.

3. Variable shadowing in test assert (minor)

assertresult== [pytest.approx(v) forvinexpected]

The loop variable v shadows the outer v numpy array (line 616). Harmless but a linter would flag it — rename to e or x.

Non-blocking observations

  • Duplicate kernel source between test/Pipeline/attention.forth and inline in test_kernels.py — could drift apart, but acceptable since the tests serve different purposes (FileCheck vs runtime).
  • Serial reductions (thread 0 loops) are correct for "naive" — parallel reductions would be the natural follow-up.
  • FileCheck test is minimal (only checks gpu.binary @warpforth_module) — reasonable as a pipeline smoke test.

Overall the kernel and test logic look solid. The main concern is the vendored libdevice binary.

@tetsuo-cpp
tetsuo-cpp merged commit c6d27e5 into canonFeb 22, 2026
1 check passed
@tetsuo-cpp
tetsuo-cpp deleted the flash-attention branch February 22, 2026 08:39
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.

Naive attention kernel in Forth

1 participant

@tetsuo-cpp
, '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

feat: naive attention kernel - #51

Merged
tetsuo-cpp merged 5 commits into
canonfrom
flash-attention
Feb 22, 2026
Merged

feat: naive attention kernel#51
tetsuo-cpp merged 5 commits into
canonfrom
flash-attention

Conversation

@tetsuo-cpp

Copy link
Copy Markdown
Owner

Summary

  • Add NVIDIA libdevice bitcode to lib/Bitcode/ and link it in the NVVM pipeline for math intrinsics support
  • Add naive scaled dot-product attention kernel with causal masking and numerically stable softmax
  • Add FileCheck pipeline test and end-to-end GPU test with NumPy reference validation
  • Tighten Vast.ai offer search with reliability and bandwidth filters

Closes#44

@tetsuo-cpptetsuo-cpp changed the title feat: naive flash attention kernelfeat: naive attention kernelFeb 22, 2026

@tetsuo-cpptetsuo-cpp left a comment

Copy link
Copy Markdown
OwnerAuthor

Choose a reason for hiding this comment

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

Code Review

I traced through the full kernel stack state — the logic is correct:

  • Dot product: Q[row,:] . K[t,:] via a loop, scaled by 1/sqrt(head_dim)
  • Causal mask: t > row → -1e30
  • Softmax: numerically stable (max subtraction before exp), serial reductions by thread 0 ✓
  • V accumulation: O[row,t] = sum_j attn[j] * V[j,t]
  • Stack is clean at exit

Issues

1. Vendored binary — lib/Bitcode/libdevice.10.bc (484KB)

This is NVIDIA's libdevice checked directly into git (no LFS). Concerns:

  • Repo bloat: Binary blobs in git history can't be garbage-collected.
  • Licensing: libdevice is distributed under the NVIDIA EULA. Redistributing it may require attribution or may not be permitted.
  • Alternative: Download from the CUDA toolkit at build time, use Git LFS, or locate it at the system CUDA install path (/usr/local/cuda/nvvm/libdevice/libdevice.10.bc).

2. Hardcoded libdevice path via compile definition

target_compile_definitions(obj.MLIRConversionPasses PRIVATEWARPFORTH_LIBDEVICE_PATH="${WARPFORTH_LIBDEVICE_PATH}")

The path is baked in at compile time. If the build directory moves or the binary is installed elsewhere, the pipeline will fail. Consider a fallback chain: env var → CUDA toolkit path → bundled path.

3. Variable shadowing in test assert (minor)

assertresult== [pytest.approx(v) forvinexpected]

The loop variable v shadows the outer v numpy array (line 616). Harmless but a linter would flag it — rename to e or x.

Non-blocking observations

  • Duplicate kernel source between test/Pipeline/attention.forth and inline in test_kernels.py — could drift apart, but acceptable since the tests serve different purposes (FileCheck vs runtime).
  • Serial reductions (thread 0 loops) are correct for "naive" — parallel reductions would be the natural follow-up.
  • FileCheck test is minimal (only checks gpu.binary @warpforth_module) — reasonable as a pipeline smoke test.

Overall the kernel and test logic look solid. The main concern is the vendored libdevice binary.

@tetsuo-cpp
tetsuo-cpp merged commit c6d27e5 into canonFeb 22, 2026
1 check passed
@tetsuo-cpp
tetsuo-cpp deleted the flash-attention branch February 22, 2026 08:39
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.

Naive attention kernel in Forth

1 participant

@tetsuo-cpp
, '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

feat: naive attention kernel - #51

Merged
tetsuo-cpp merged 5 commits into
canonfrom
flash-attention
Feb 22, 2026
Merged

feat: naive attention kernel#51
tetsuo-cpp merged 5 commits into
canonfrom
flash-attention

Conversation

@tetsuo-cpp

Copy link
Copy Markdown
Owner

Summary

  • Add NVIDIA libdevice bitcode to lib/Bitcode/ and link it in the NVVM pipeline for math intrinsics support
  • Add naive scaled dot-product attention kernel with causal masking and numerically stable softmax
  • Add FileCheck pipeline test and end-to-end GPU test with NumPy reference validation
  • Tighten Vast.ai offer search with reliability and bandwidth filters

Closes#44

@tetsuo-cpptetsuo-cpp changed the title feat: naive flash attention kernelfeat: naive attention kernelFeb 22, 2026

@tetsuo-cpptetsuo-cpp left a comment

Copy link
Copy Markdown
OwnerAuthor

Choose a reason for hiding this comment

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

Code Review

I traced through the full kernel stack state — the logic is correct:

  • Dot product: Q[row,:] . K[t,:] via a loop, scaled by 1/sqrt(head_dim)
  • Causal mask: t > row → -1e30
  • Softmax: numerically stable (max subtraction before exp), serial reductions by thread 0 ✓
  • V accumulation: O[row,t] = sum_j attn[j] * V[j,t]
  • Stack is clean at exit

Issues

1. Vendored binary — lib/Bitcode/libdevice.10.bc (484KB)

This is NVIDIA's libdevice checked directly into git (no LFS). Concerns:

  • Repo bloat: Binary blobs in git history can't be garbage-collected.
  • Licensing: libdevice is distributed under the NVIDIA EULA. Redistributing it may require attribution or may not be permitted.
  • Alternative: Download from the CUDA toolkit at build time, use Git LFS, or locate it at the system CUDA install path (/usr/local/cuda/nvvm/libdevice/libdevice.10.bc).

2. Hardcoded libdevice path via compile definition

target_compile_definitions(obj.MLIRConversionPasses PRIVATEWARPFORTH_LIBDEVICE_PATH="${WARPFORTH_LIBDEVICE_PATH}")

The path is baked in at compile time. If the build directory moves or the binary is installed elsewhere, the pipeline will fail. Consider a fallback chain: env var → CUDA toolkit path → bundled path.

3. Variable shadowing in test assert (minor)

assertresult== [pytest.approx(v) forvinexpected]

The loop variable v shadows the outer v numpy array (line 616). Harmless but a linter would flag it — rename to e or x.

Non-blocking observations

  • Duplicate kernel source between test/Pipeline/attention.forth and inline in test_kernels.py — could drift apart, but acceptable since the tests serve different purposes (FileCheck vs runtime).
  • Serial reductions (thread 0 loops) are correct for "naive" — parallel reductions would be the natural follow-up.
  • FileCheck test is minimal (only checks gpu.binary @warpforth_module) — reasonable as a pipeline smoke test.

Overall the kernel and test logic look solid. The main concern is the vendored libdevice binary.

@tetsuo-cpp
tetsuo-cpp merged commit c6d27e5 into canonFeb 22, 2026
1 check passed
@tetsuo-cpp
tetsuo-cpp deleted the flash-attention branch February 22, 2026 08:39
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.

Naive attention kernel in Forth

1 participant

@tetsuo-cpp
, '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

feat: naive attention kernel - #51

Merged
tetsuo-cpp merged 5 commits into
canonfrom
flash-attention
Feb 22, 2026
Merged

feat: naive attention kernel#51
tetsuo-cpp merged 5 commits into
canonfrom
flash-attention

Conversation

@tetsuo-cpp

Copy link
Copy Markdown
Owner

Summary

  • Add NVIDIA libdevice bitcode to lib/Bitcode/ and link it in the NVVM pipeline for math intrinsics support
  • Add naive scaled dot-product attention kernel with causal masking and numerically stable softmax
  • Add FileCheck pipeline test and end-to-end GPU test with NumPy reference validation
  • Tighten Vast.ai offer search with reliability and bandwidth filters

Closes#44

@tetsuo-cpptetsuo-cpp changed the title feat: naive flash attention kernelfeat: naive attention kernelFeb 22, 2026

@tetsuo-cpptetsuo-cpp left a comment

Copy link
Copy Markdown
OwnerAuthor

Choose a reason for hiding this comment

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

Code Review

I traced through the full kernel stack state — the logic is correct:

  • Dot product: Q[row,:] . K[t,:] via a loop, scaled by 1/sqrt(head_dim)
  • Causal mask: t > row → -1e30
  • Softmax: numerically stable (max subtraction before exp), serial reductions by thread 0 ✓
  • V accumulation: O[row,t] = sum_j attn[j] * V[j,t]
  • Stack is clean at exit

Issues

1. Vendored binary — lib/Bitcode/libdevice.10.bc (484KB)

This is NVIDIA's libdevice checked directly into git (no LFS). Concerns:

  • Repo bloat: Binary blobs in git history can't be garbage-collected.
  • Licensing: libdevice is distributed under the NVIDIA EULA. Redistributing it may require attribution or may not be permitted.
  • Alternative: Download from the CUDA toolkit at build time, use Git LFS, or locate it at the system CUDA install path (/usr/local/cuda/nvvm/libdevice/libdevice.10.bc).

2. Hardcoded libdevice path via compile definition

target_compile_definitions(obj.MLIRConversionPasses PRIVATEWARPFORTH_LIBDEVICE_PATH="${WARPFORTH_LIBDEVICE_PATH}")

The path is baked in at compile time. If the build directory moves or the binary is installed elsewhere, the pipeline will fail. Consider a fallback chain: env var → CUDA toolkit path → bundled path.

3. Variable shadowing in test assert (minor)

assertresult== [pytest.approx(v) forvinexpected]

The loop variable v shadows the outer v numpy array (line 616). Harmless but a linter would flag it — rename to e or x.

Non-blocking observations

  • Duplicate kernel source between test/Pipeline/attention.forth and inline in test_kernels.py — could drift apart, but acceptable since the tests serve different purposes (FileCheck vs runtime).
  • Serial reductions (thread 0 loops) are correct for "naive" — parallel reductions would be the natural follow-up.
  • FileCheck test is minimal (only checks gpu.binary @warpforth_module) — reasonable as a pipeline smoke test.

Overall the kernel and test logic look solid. The main concern is the vendored libdevice binary.

@tetsuo-cpp
tetsuo-cpp merged commit c6d27e5 into canonFeb 22, 2026
1 check passed
@tetsuo-cpp
tetsuo-cpp deleted the flash-attention branch February 22, 2026 08:39
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.

Naive attention kernel in Forth

1 participant

@tetsuo-cpp
, '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

feat: naive attention kernel - #51

Merged
tetsuo-cpp merged 5 commits into
canonfrom
flash-attention
Feb 22, 2026
Merged

feat: naive attention kernel#51
tetsuo-cpp merged 5 commits into
canonfrom
flash-attention

Conversation

@tetsuo-cpp

Copy link
Copy Markdown
Owner

Summary

  • Add NVIDIA libdevice bitcode to lib/Bitcode/ and link it in the NVVM pipeline for math intrinsics support
  • Add naive scaled dot-product attention kernel with causal masking and numerically stable softmax
  • Add FileCheck pipeline test and end-to-end GPU test with NumPy reference validation
  • Tighten Vast.ai offer search with reliability and bandwidth filters

Closes#44

@tetsuo-cpptetsuo-cpp changed the title feat: naive flash attention kernelfeat: naive attention kernelFeb 22, 2026

@tetsuo-cpptetsuo-cpp left a comment

Copy link
Copy Markdown
OwnerAuthor

Choose a reason for hiding this comment

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

Code Review

I traced through the full kernel stack state — the logic is correct:

  • Dot product: Q[row,:] . K[t,:] via a loop, scaled by 1/sqrt(head_dim)
  • Causal mask: t > row → -1e30
  • Softmax: numerically stable (max subtraction before exp), serial reductions by thread 0 ✓
  • V accumulation: O[row,t] = sum_j attn[j] * V[j,t]
  • Stack is clean at exit

Issues

1. Vendored binary — lib/Bitcode/libdevice.10.bc (484KB)

This is NVIDIA's libdevice checked directly into git (no LFS). Concerns:

  • Repo bloat: Binary blobs in git history can't be garbage-collected.
  • Licensing: libdevice is distributed under the NVIDIA EULA. Redistributing it may require attribution or may not be permitted.
  • Alternative: Download from the CUDA toolkit at build time, use Git LFS, or locate it at the system CUDA install path (/usr/local/cuda/nvvm/libdevice/libdevice.10.bc).

2. Hardcoded libdevice path via compile definition

target_compile_definitions(obj.MLIRConversionPasses PRIVATEWARPFORTH_LIBDEVICE_PATH="${WARPFORTH_LIBDEVICE_PATH}")

The path is baked in at compile time. If the build directory moves or the binary is installed elsewhere, the pipeline will fail. Consider a fallback chain: env var → CUDA toolkit path → bundled path.

3. Variable shadowing in test assert (minor)

assertresult== [pytest.approx(v) forvinexpected]

The loop variable v shadows the outer v numpy array (line 616). Harmless but a linter would flag it — rename to e or x.

Non-blocking observations

  • Duplicate kernel source between test/Pipeline/attention.forth and inline in test_kernels.py — could drift apart, but acceptable since the tests serve different purposes (FileCheck vs runtime).
  • Serial reductions (thread 0 loops) are correct for "naive" — parallel reductions would be the natural follow-up.
  • FileCheck test is minimal (only checks gpu.binary @warpforth_module) — reasonable as a pipeline smoke test.

Overall the kernel and test logic look solid. The main concern is the vendored libdevice binary.

@tetsuo-cpp
tetsuo-cpp merged commit c6d27e5 into canonFeb 22, 2026
1 check passed
@tetsuo-cpp
tetsuo-cpp deleted the flash-attention branch February 22, 2026 08:39
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.

Naive attention kernel in Forth

1 participant

@tetsuo-cpp
, '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

feat: naive attention kernel - #51

Merged
tetsuo-cpp merged 5 commits into
canonfrom
flash-attention
Feb 22, 2026
Merged

feat: naive attention kernel#51
tetsuo-cpp merged 5 commits into
canonfrom
flash-attention

Conversation

@tetsuo-cpp

Copy link
Copy Markdown
Owner

Summary

  • Add NVIDIA libdevice bitcode to lib/Bitcode/ and link it in the NVVM pipeline for math intrinsics support
  • Add naive scaled dot-product attention kernel with causal masking and numerically stable softmax
  • Add FileCheck pipeline test and end-to-end GPU test with NumPy reference validation
  • Tighten Vast.ai offer search with reliability and bandwidth filters

Closes#44

@tetsuo-cpptetsuo-cpp changed the title feat: naive flash attention kernelfeat: naive attention kernelFeb 22, 2026

@tetsuo-cpptetsuo-cpp left a comment

Copy link
Copy Markdown
OwnerAuthor

Choose a reason for hiding this comment

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

Code Review

I traced through the full kernel stack state — the logic is correct:

  • Dot product: Q[row,:] . K[t,:] via a loop, scaled by 1/sqrt(head_dim)
  • Causal mask: t > row → -1e30
  • Softmax: numerically stable (max subtraction before exp), serial reductions by thread 0 ✓
  • V accumulation: O[row,t] = sum_j attn[j] * V[j,t]
  • Stack is clean at exit

Issues

1. Vendored binary — lib/Bitcode/libdevice.10.bc (484KB)

This is NVIDIA's libdevice checked directly into git (no LFS). Concerns:

  • Repo bloat: Binary blobs in git history can't be garbage-collected.
  • Licensing: libdevice is distributed under the NVIDIA EULA. Redistributing it may require attribution or may not be permitted.
  • Alternative: Download from the CUDA toolkit at build time, use Git LFS, or locate it at the system CUDA install path (/usr/local/cuda/nvvm/libdevice/libdevice.10.bc).

2. Hardcoded libdevice path via compile definition

target_compile_definitions(obj.MLIRConversionPasses PRIVATEWARPFORTH_LIBDEVICE_PATH="${WARPFORTH_LIBDEVICE_PATH}")

The path is baked in at compile time. If the build directory moves or the binary is installed elsewhere, the pipeline will fail. Consider a fallback chain: env var → CUDA toolkit path → bundled path.

3. Variable shadowing in test assert (minor)

assertresult== [pytest.approx(v) forvinexpected]

The loop variable v shadows the outer v numpy array (line 616). Harmless but a linter would flag it — rename to e or x.

Non-blocking observations

  • Duplicate kernel source between test/Pipeline/attention.forth and inline in test_kernels.py — could drift apart, but acceptable since the tests serve different purposes (FileCheck vs runtime).
  • Serial reductions (thread 0 loops) are correct for "naive" — parallel reductions would be the natural follow-up.
  • FileCheck test is minimal (only checks gpu.binary @warpforth_module) — reasonable as a pipeline smoke test.

Overall the kernel and test logic look solid. The main concern is the vendored libdevice binary.

@tetsuo-cpp
tetsuo-cpp merged commit c6d27e5 into canonFeb 22, 2026
1 check passed
@tetsuo-cpp
tetsuo-cpp deleted the flash-attention branch February 22, 2026 08:39
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.

Naive attention kernel in Forth

1 participant

@tetsuo-cpp
, '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

feat: naive attention kernel - #51

Merged
tetsuo-cpp merged 5 commits into
canonfrom
flash-attention
Feb 22, 2026
Merged

feat: naive attention kernel#51
tetsuo-cpp merged 5 commits into
canonfrom
flash-attention

Conversation

@tetsuo-cpp

Copy link
Copy Markdown
Owner

Summary

  • Add NVIDIA libdevice bitcode to lib/Bitcode/ and link it in the NVVM pipeline for math intrinsics support
  • Add naive scaled dot-product attention kernel with causal masking and numerically stable softmax
  • Add FileCheck pipeline test and end-to-end GPU test with NumPy reference validation
  • Tighten Vast.ai offer search with reliability and bandwidth filters

Closes#44

@tetsuo-cpptetsuo-cpp changed the title feat: naive flash attention kernelfeat: naive attention kernelFeb 22, 2026

@tetsuo-cpptetsuo-cpp left a comment

Copy link
Copy Markdown
OwnerAuthor

Choose a reason for hiding this comment

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

Code Review

I traced through the full kernel stack state — the logic is correct:

  • Dot product: Q[row,:] . K[t,:] via a loop, scaled by 1/sqrt(head_dim)
  • Causal mask: t > row → -1e30
  • Softmax: numerically stable (max subtraction before exp), serial reductions by thread 0 ✓
  • V accumulation: O[row,t] = sum_j attn[j] * V[j,t]
  • Stack is clean at exit

Issues

1. Vendored binary — lib/Bitcode/libdevice.10.bc (484KB)

This is NVIDIA's libdevice checked directly into git (no LFS). Concerns:

  • Repo bloat: Binary blobs in git history can't be garbage-collected.
  • Licensing: libdevice is distributed under the NVIDIA EULA. Redistributing it may require attribution or may not be permitted.
  • Alternative: Download from the CUDA toolkit at build time, use Git LFS, or locate it at the system CUDA install path (/usr/local/cuda/nvvm/libdevice/libdevice.10.bc).

2. Hardcoded libdevice path via compile definition

target_compile_definitions(obj.MLIRConversionPasses PRIVATEWARPFORTH_LIBDEVICE_PATH="${WARPFORTH_LIBDEVICE_PATH}")

The path is baked in at compile time. If the build directory moves or the binary is installed elsewhere, the pipeline will fail. Consider a fallback chain: env var → CUDA toolkit path → bundled path.

3. Variable shadowing in test assert (minor)

assertresult== [pytest.approx(v) forvinexpected]

The loop variable v shadows the outer v numpy array (line 616). Harmless but a linter would flag it — rename to e or x.

Non-blocking observations

  • Duplicate kernel source between test/Pipeline/attention.forth and inline in test_kernels.py — could drift apart, but acceptable since the tests serve different purposes (FileCheck vs runtime).
  • Serial reductions (thread 0 loops) are correct for "naive" — parallel reductions would be the natural follow-up.
  • FileCheck test is minimal (only checks gpu.binary @warpforth_module) — reasonable as a pipeline smoke test.

Overall the kernel and test logic look solid. The main concern is the vendored libdevice binary.

@tetsuo-cpp
tetsuo-cpp merged commit c6d27e5 into canonFeb 22, 2026
1 check passed
@tetsuo-cpp
tetsuo-cpp deleted the flash-attention branch February 22, 2026 08:39
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.

Naive attention kernel in Forth

1 participant

@tetsuo-cpp
, '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

feat: naive attention kernel - #51

Merged
tetsuo-cpp merged 5 commits into
canonfrom
flash-attention
Feb 22, 2026
Merged

feat: naive attention kernel#51
tetsuo-cpp merged 5 commits into
canonfrom
flash-attention

Conversation

@tetsuo-cpp

Copy link
Copy Markdown
Owner

Summary

  • Add NVIDIA libdevice bitcode to lib/Bitcode/ and link it in the NVVM pipeline for math intrinsics support
  • Add naive scaled dot-product attention kernel with causal masking and numerically stable softmax
  • Add FileCheck pipeline test and end-to-end GPU test with NumPy reference validation
  • Tighten Vast.ai offer search with reliability and bandwidth filters

Closes#44

@tetsuo-cpptetsuo-cpp changed the title feat: naive flash attention kernelfeat: naive attention kernelFeb 22, 2026

@tetsuo-cpptetsuo-cpp left a comment

Copy link
Copy Markdown
OwnerAuthor

Choose a reason for hiding this comment

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

Code Review

I traced through the full kernel stack state — the logic is correct:

  • Dot product: Q[row,:] . K[t,:] via a loop, scaled by 1/sqrt(head_dim)
  • Causal mask: t > row → -1e30
  • Softmax: numerically stable (max subtraction before exp), serial reductions by thread 0 ✓
  • V accumulation: O[row,t] = sum_j attn[j] * V[j,t]
  • Stack is clean at exit

Issues

1. Vendored binary — lib/Bitcode/libdevice.10.bc (484KB)

This is NVIDIA's libdevice checked directly into git (no LFS). Concerns:

  • Repo bloat: Binary blobs in git history can't be garbage-collected.
  • Licensing: libdevice is distributed under the NVIDIA EULA. Redistributing it may require attribution or may not be permitted.
  • Alternative: Download from the CUDA toolkit at build time, use Git LFS, or locate it at the system CUDA install path (/usr/local/cuda/nvvm/libdevice/libdevice.10.bc).

2. Hardcoded libdevice path via compile definition

target_compile_definitions(obj.MLIRConversionPasses PRIVATEWARPFORTH_LIBDEVICE_PATH="${WARPFORTH_LIBDEVICE_PATH}")

The path is baked in at compile time. If the build directory moves or the binary is installed elsewhere, the pipeline will fail. Consider a fallback chain: env var → CUDA toolkit path → bundled path.

3. Variable shadowing in test assert (minor)

assertresult== [pytest.approx(v) forvinexpected]

The loop variable v shadows the outer v numpy array (line 616). Harmless but a linter would flag it — rename to e or x.

Non-blocking observations

  • Duplicate kernel source between test/Pipeline/attention.forth and inline in test_kernels.py — could drift apart, but acceptable since the tests serve different purposes (FileCheck vs runtime).
  • Serial reductions (thread 0 loops) are correct for "naive" — parallel reductions would be the natural follow-up.
  • FileCheck test is minimal (only checks gpu.binary @warpforth_module) — reasonable as a pipeline smoke test.

Overall the kernel and test logic look solid. The main concern is the vendored libdevice binary.

@tetsuo-cpp
tetsuo-cpp merged commit c6d27e5 into canonFeb 22, 2026
1 check passed
@tetsuo-cpp
tetsuo-cpp deleted the flash-attention branch February 22, 2026 08:39
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.

Naive attention kernel in Forth

1 participant

@tetsuo-cpp