[WIP] simd-buffers - #221

Closed
tarcieri wants to merge 1 commit into
masterfrom
simd-buffers
Closed

[WIP] simd-buffers#221
tarcieri wants to merge 1 commit into
masterfrom
simd-buffers

Conversation

@tarcieri

Copy link
Copy Markdown
Member

Implements the following SIMD types, as proposed in RustCrypto/traits#444:

  • U128 (portable)
  • U256 (x86/x86_64 only)
  • U128x8 (portable)

These types are largely "storage only" and don't implement arithmetic (if we needed that, stdsimd/packed_simd would be a better choice)

The implementation does expose optimized XOR intrinsics, however, which seems to be the main thing useful in a portable cryptographic context, at least as far as our current usages of SIMD go.

The x86 backend exposes unsafe target_feature(enable = "...") functions as part of its API, intended to be used/inlined within SIMD backends for particular algorithms.

@tarcieri

tarcieri commented Jan 22, 2021

Copy link
Copy Markdown
MemberAuthor

Based on my high-level survey in RustCrypto/traits#444 the main SIMD types we need are:

  • U128x8 (AES, POLYVAL/GHASH)
  • U256x4 (ChaCha20, Poly1305)

This PR presently only implements U128x8 as a POC, which is the only one which is reasonably easy to do in a portable manner.

If we decide this approach is actually a good idea I can take a look at adding U256x4 as a follow-up, but it might end up being x86-only unless there's a good reason to have a portable implementation.

@newpavlov

Copy link
Copy Markdown
Member

I am still not sure if this approach will work well in practice, so before merging this and relevant PRs I would like to see how it will affect the downstream crates, i.e. I suggest prototyping the full chain of changes off the PR branches.

@tarcieri

Copy link
Copy Markdown
MemberAuthor

@newpavlov yep, that was my plan: prototype it end-to-end on a bunch of branches and see if we can get some meaningful performance wins out of it, then discuss it more

@tarcieri
tarcieriforce-pushed the simd-buffers branch 8 times, most recently from f9f81c5 to 75682f8CompareFebruary 5, 2021 17:09
Implements the following SIMD types, as proposed in
RustCrypto/traits#444:
- `U128` (portable)
- `U256` (x86/x86_64 only)
- `U128x8` (portable)
These types are largely "storage only" and don't implement arithmetic
(if we needed that, `stdsimd`/`packed_simd` would be a better choice)
The implementation *does* expose optimized XOR intrinsics, however,
which seems to be the main thing useful in a portable cryptographic
context, at least as far as our current usages of SIMD go.
The `x86` backend exposes unsafe `target_feature(enable = "...")`
functions as part of its API, intended to be used/inlined within SIMD
backends for particular algorithms.
@tarcieri

Copy link
Copy Markdown
MemberAuthor

Going to go ahead and close this.

I think there are some other ways to address this without introducing an additional crate.

An interesting one would be supporting conversions between certain crypto-bigint types and SIMD registers.

@tarcieri
tarcieri deleted the simd-buffers branch September 15, 2021 12:26
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.

2 participants

@tarcieri@newpavlov
, '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

[WIP] simd-buffers - #221

Closed
tarcieri wants to merge 1 commit into
masterfrom
simd-buffers
Closed

[WIP] simd-buffers#221
tarcieri wants to merge 1 commit into
masterfrom
simd-buffers

Conversation

@tarcieri

Copy link
Copy Markdown
Member

Implements the following SIMD types, as proposed in RustCrypto/traits#444:

  • U128 (portable)
  • U256 (x86/x86_64 only)
  • U128x8 (portable)

These types are largely "storage only" and don't implement arithmetic (if we needed that, stdsimd/packed_simd would be a better choice)

The implementation does expose optimized XOR intrinsics, however, which seems to be the main thing useful in a portable cryptographic context, at least as far as our current usages of SIMD go.

The x86 backend exposes unsafe target_feature(enable = "...") functions as part of its API, intended to be used/inlined within SIMD backends for particular algorithms.

@tarcieri

tarcieri commented Jan 22, 2021

Copy link
Copy Markdown
MemberAuthor

Based on my high-level survey in RustCrypto/traits#444 the main SIMD types we need are:

  • U128x8 (AES, POLYVAL/GHASH)
  • U256x4 (ChaCha20, Poly1305)

This PR presently only implements U128x8 as a POC, which is the only one which is reasonably easy to do in a portable manner.

If we decide this approach is actually a good idea I can take a look at adding U256x4 as a follow-up, but it might end up being x86-only unless there's a good reason to have a portable implementation.

@newpavlov

Copy link
Copy Markdown
Member

I am still not sure if this approach will work well in practice, so before merging this and relevant PRs I would like to see how it will affect the downstream crates, i.e. I suggest prototyping the full chain of changes off the PR branches.

@tarcieri

Copy link
Copy Markdown
MemberAuthor

@newpavlov yep, that was my plan: prototype it end-to-end on a bunch of branches and see if we can get some meaningful performance wins out of it, then discuss it more

@tarcieri
tarcieriforce-pushed the simd-buffers branch 8 times, most recently from f9f81c5 to 75682f8CompareFebruary 5, 2021 17:09
Implements the following SIMD types, as proposed in
RustCrypto/traits#444:
- `U128` (portable)
- `U256` (x86/x86_64 only)
- `U128x8` (portable)
These types are largely "storage only" and don't implement arithmetic
(if we needed that, `stdsimd`/`packed_simd` would be a better choice)
The implementation *does* expose optimized XOR intrinsics, however,
which seems to be the main thing useful in a portable cryptographic
context, at least as far as our current usages of SIMD go.
The `x86` backend exposes unsafe `target_feature(enable = "...")`
functions as part of its API, intended to be used/inlined within SIMD
backends for particular algorithms.
@tarcieri

Copy link
Copy Markdown
MemberAuthor

Going to go ahead and close this.

I think there are some other ways to address this without introducing an additional crate.

An interesting one would be supporting conversions between certain crypto-bigint types and SIMD registers.

@tarcieri
tarcieri deleted the simd-buffers branch September 15, 2021 12:26
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.

2 participants

@tarcieri@newpavlov
, '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

[WIP] simd-buffers - #221

Closed
tarcieri wants to merge 1 commit into
masterfrom
simd-buffers
Closed

[WIP] simd-buffers#221
tarcieri wants to merge 1 commit into
masterfrom
simd-buffers

Conversation

@tarcieri

Copy link
Copy Markdown
Member

Implements the following SIMD types, as proposed in RustCrypto/traits#444:

  • U128 (portable)
  • U256 (x86/x86_64 only)
  • U128x8 (portable)

These types are largely "storage only" and don't implement arithmetic (if we needed that, stdsimd/packed_simd would be a better choice)

The implementation does expose optimized XOR intrinsics, however, which seems to be the main thing useful in a portable cryptographic context, at least as far as our current usages of SIMD go.

The x86 backend exposes unsafe target_feature(enable = "...") functions as part of its API, intended to be used/inlined within SIMD backends for particular algorithms.

@tarcieri

tarcieri commented Jan 22, 2021

Copy link
Copy Markdown
MemberAuthor

Based on my high-level survey in RustCrypto/traits#444 the main SIMD types we need are:

  • U128x8 (AES, POLYVAL/GHASH)
  • U256x4 (ChaCha20, Poly1305)

This PR presently only implements U128x8 as a POC, which is the only one which is reasonably easy to do in a portable manner.

If we decide this approach is actually a good idea I can take a look at adding U256x4 as a follow-up, but it might end up being x86-only unless there's a good reason to have a portable implementation.

@newpavlov

Copy link
Copy Markdown
Member

I am still not sure if this approach will work well in practice, so before merging this and relevant PRs I would like to see how it will affect the downstream crates, i.e. I suggest prototyping the full chain of changes off the PR branches.

@tarcieri

Copy link
Copy Markdown
MemberAuthor

@newpavlov yep, that was my plan: prototype it end-to-end on a bunch of branches and see if we can get some meaningful performance wins out of it, then discuss it more

@tarcieri
tarcieriforce-pushed the simd-buffers branch 8 times, most recently from f9f81c5 to 75682f8CompareFebruary 5, 2021 17:09
Implements the following SIMD types, as proposed in
RustCrypto/traits#444:
- `U128` (portable)
- `U256` (x86/x86_64 only)
- `U128x8` (portable)
These types are largely "storage only" and don't implement arithmetic
(if we needed that, `stdsimd`/`packed_simd` would be a better choice)
The implementation *does* expose optimized XOR intrinsics, however,
which seems to be the main thing useful in a portable cryptographic
context, at least as far as our current usages of SIMD go.
The `x86` backend exposes unsafe `target_feature(enable = "...")`
functions as part of its API, intended to be used/inlined within SIMD
backends for particular algorithms.
@tarcieri

Copy link
Copy Markdown
MemberAuthor

Going to go ahead and close this.

I think there are some other ways to address this without introducing an additional crate.

An interesting one would be supporting conversions between certain crypto-bigint types and SIMD registers.

@tarcieri
tarcieri deleted the simd-buffers branch September 15, 2021 12:26
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.

2 participants

@tarcieri@newpavlov
, '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

[WIP] simd-buffers - #221

Closed
tarcieri wants to merge 1 commit into
masterfrom
simd-buffers
Closed

[WIP] simd-buffers#221
tarcieri wants to merge 1 commit into
masterfrom
simd-buffers

Conversation

@tarcieri

Copy link
Copy Markdown
Member

Implements the following SIMD types, as proposed in RustCrypto/traits#444:

  • U128 (portable)
  • U256 (x86/x86_64 only)
  • U128x8 (portable)

These types are largely "storage only" and don't implement arithmetic (if we needed that, stdsimd/packed_simd would be a better choice)

The implementation does expose optimized XOR intrinsics, however, which seems to be the main thing useful in a portable cryptographic context, at least as far as our current usages of SIMD go.

The x86 backend exposes unsafe target_feature(enable = "...") functions as part of its API, intended to be used/inlined within SIMD backends for particular algorithms.

@tarcieri

tarcieri commented Jan 22, 2021

Copy link
Copy Markdown
MemberAuthor

Based on my high-level survey in RustCrypto/traits#444 the main SIMD types we need are:

  • U128x8 (AES, POLYVAL/GHASH)
  • U256x4 (ChaCha20, Poly1305)

This PR presently only implements U128x8 as a POC, which is the only one which is reasonably easy to do in a portable manner.

If we decide this approach is actually a good idea I can take a look at adding U256x4 as a follow-up, but it might end up being x86-only unless there's a good reason to have a portable implementation.

@newpavlov

Copy link
Copy Markdown
Member

I am still not sure if this approach will work well in practice, so before merging this and relevant PRs I would like to see how it will affect the downstream crates, i.e. I suggest prototyping the full chain of changes off the PR branches.

@tarcieri

Copy link
Copy Markdown
MemberAuthor

@newpavlov yep, that was my plan: prototype it end-to-end on a bunch of branches and see if we can get some meaningful performance wins out of it, then discuss it more

@tarcieri
tarcieriforce-pushed the simd-buffers branch 8 times, most recently from f9f81c5 to 75682f8CompareFebruary 5, 2021 17:09
Implements the following SIMD types, as proposed in
RustCrypto/traits#444:
- `U128` (portable)
- `U256` (x86/x86_64 only)
- `U128x8` (portable)
These types are largely "storage only" and don't implement arithmetic
(if we needed that, `stdsimd`/`packed_simd` would be a better choice)
The implementation *does* expose optimized XOR intrinsics, however,
which seems to be the main thing useful in a portable cryptographic
context, at least as far as our current usages of SIMD go.
The `x86` backend exposes unsafe `target_feature(enable = "...")`
functions as part of its API, intended to be used/inlined within SIMD
backends for particular algorithms.
@tarcieri

Copy link
Copy Markdown
MemberAuthor

Going to go ahead and close this.

I think there are some other ways to address this without introducing an additional crate.

An interesting one would be supporting conversions between certain crypto-bigint types and SIMD registers.

@tarcieri
tarcieri deleted the simd-buffers branch September 15, 2021 12:26
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.

2 participants

@tarcieri@newpavlov
, '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

[WIP] simd-buffers - #221

Closed
tarcieri wants to merge 1 commit into
masterfrom
simd-buffers
Closed

[WIP] simd-buffers#221
tarcieri wants to merge 1 commit into
masterfrom
simd-buffers

Conversation

@tarcieri

Copy link
Copy Markdown
Member

Implements the following SIMD types, as proposed in RustCrypto/traits#444:

  • U128 (portable)
  • U256 (x86/x86_64 only)
  • U128x8 (portable)

These types are largely "storage only" and don't implement arithmetic (if we needed that, stdsimd/packed_simd would be a better choice)

The implementation does expose optimized XOR intrinsics, however, which seems to be the main thing useful in a portable cryptographic context, at least as far as our current usages of SIMD go.

The x86 backend exposes unsafe target_feature(enable = "...") functions as part of its API, intended to be used/inlined within SIMD backends for particular algorithms.

@tarcieri

tarcieri commented Jan 22, 2021

Copy link
Copy Markdown
MemberAuthor

Based on my high-level survey in RustCrypto/traits#444 the main SIMD types we need are:

  • U128x8 (AES, POLYVAL/GHASH)
  • U256x4 (ChaCha20, Poly1305)

This PR presently only implements U128x8 as a POC, which is the only one which is reasonably easy to do in a portable manner.

If we decide this approach is actually a good idea I can take a look at adding U256x4 as a follow-up, but it might end up being x86-only unless there's a good reason to have a portable implementation.

@newpavlov

Copy link
Copy Markdown
Member

I am still not sure if this approach will work well in practice, so before merging this and relevant PRs I would like to see how it will affect the downstream crates, i.e. I suggest prototyping the full chain of changes off the PR branches.

@tarcieri

Copy link
Copy Markdown
MemberAuthor

@newpavlov yep, that was my plan: prototype it end-to-end on a bunch of branches and see if we can get some meaningful performance wins out of it, then discuss it more

@tarcieri
tarcieriforce-pushed the simd-buffers branch 8 times, most recently from f9f81c5 to 75682f8CompareFebruary 5, 2021 17:09
Implements the following SIMD types, as proposed in
RustCrypto/traits#444:
- `U128` (portable)
- `U256` (x86/x86_64 only)
- `U128x8` (portable)
These types are largely "storage only" and don't implement arithmetic
(if we needed that, `stdsimd`/`packed_simd` would be a better choice)
The implementation *does* expose optimized XOR intrinsics, however,
which seems to be the main thing useful in a portable cryptographic
context, at least as far as our current usages of SIMD go.
The `x86` backend exposes unsafe `target_feature(enable = "...")`
functions as part of its API, intended to be used/inlined within SIMD
backends for particular algorithms.
@tarcieri

Copy link
Copy Markdown
MemberAuthor

Going to go ahead and close this.

I think there are some other ways to address this without introducing an additional crate.

An interesting one would be supporting conversions between certain crypto-bigint types and SIMD registers.

@tarcieri
tarcieri deleted the simd-buffers branch September 15, 2021 12:26
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.

2 participants

@tarcieri@newpavlov
, '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

[WIP] simd-buffers - #221

Closed
tarcieri wants to merge 1 commit into
masterfrom
simd-buffers
Closed

[WIP] simd-buffers#221
tarcieri wants to merge 1 commit into
masterfrom
simd-buffers

Conversation

@tarcieri

Copy link
Copy Markdown
Member

Implements the following SIMD types, as proposed in RustCrypto/traits#444:

  • U128 (portable)
  • U256 (x86/x86_64 only)
  • U128x8 (portable)

These types are largely "storage only" and don't implement arithmetic (if we needed that, stdsimd/packed_simd would be a better choice)

The implementation does expose optimized XOR intrinsics, however, which seems to be the main thing useful in a portable cryptographic context, at least as far as our current usages of SIMD go.

The x86 backend exposes unsafe target_feature(enable = "...") functions as part of its API, intended to be used/inlined within SIMD backends for particular algorithms.

@tarcieri

tarcieri commented Jan 22, 2021

Copy link
Copy Markdown
MemberAuthor

Based on my high-level survey in RustCrypto/traits#444 the main SIMD types we need are:

  • U128x8 (AES, POLYVAL/GHASH)
  • U256x4 (ChaCha20, Poly1305)

This PR presently only implements U128x8 as a POC, which is the only one which is reasonably easy to do in a portable manner.

If we decide this approach is actually a good idea I can take a look at adding U256x4 as a follow-up, but it might end up being x86-only unless there's a good reason to have a portable implementation.

@newpavlov

Copy link
Copy Markdown
Member

I am still not sure if this approach will work well in practice, so before merging this and relevant PRs I would like to see how it will affect the downstream crates, i.e. I suggest prototyping the full chain of changes off the PR branches.

@tarcieri

Copy link
Copy Markdown
MemberAuthor

@newpavlov yep, that was my plan: prototype it end-to-end on a bunch of branches and see if we can get some meaningful performance wins out of it, then discuss it more

@tarcieri
tarcieriforce-pushed the simd-buffers branch 8 times, most recently from f9f81c5 to 75682f8CompareFebruary 5, 2021 17:09
Implements the following SIMD types, as proposed in
RustCrypto/traits#444:
- `U128` (portable)
- `U256` (x86/x86_64 only)
- `U128x8` (portable)
These types are largely "storage only" and don't implement arithmetic
(if we needed that, `stdsimd`/`packed_simd` would be a better choice)
The implementation *does* expose optimized XOR intrinsics, however,
which seems to be the main thing useful in a portable cryptographic
context, at least as far as our current usages of SIMD go.
The `x86` backend exposes unsafe `target_feature(enable = "...")`
functions as part of its API, intended to be used/inlined within SIMD
backends for particular algorithms.
@tarcieri

Copy link
Copy Markdown
MemberAuthor

Going to go ahead and close this.

I think there are some other ways to address this without introducing an additional crate.

An interesting one would be supporting conversions between certain crypto-bigint types and SIMD registers.

@tarcieri
tarcieri deleted the simd-buffers branch September 15, 2021 12:26
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.

2 participants

@tarcieri@newpavlov
, '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

[WIP] simd-buffers - #221

Closed
tarcieri wants to merge 1 commit into
masterfrom
simd-buffers
Closed

[WIP] simd-buffers#221
tarcieri wants to merge 1 commit into
masterfrom
simd-buffers

Conversation

@tarcieri

Copy link
Copy Markdown
Member

Implements the following SIMD types, as proposed in RustCrypto/traits#444:

  • U128 (portable)
  • U256 (x86/x86_64 only)
  • U128x8 (portable)

These types are largely "storage only" and don't implement arithmetic (if we needed that, stdsimd/packed_simd would be a better choice)

The implementation does expose optimized XOR intrinsics, however, which seems to be the main thing useful in a portable cryptographic context, at least as far as our current usages of SIMD go.

The x86 backend exposes unsafe target_feature(enable = "...") functions as part of its API, intended to be used/inlined within SIMD backends for particular algorithms.

@tarcieri

tarcieri commented Jan 22, 2021

Copy link
Copy Markdown
MemberAuthor

Based on my high-level survey in RustCrypto/traits#444 the main SIMD types we need are:

  • U128x8 (AES, POLYVAL/GHASH)
  • U256x4 (ChaCha20, Poly1305)

This PR presently only implements U128x8 as a POC, which is the only one which is reasonably easy to do in a portable manner.

If we decide this approach is actually a good idea I can take a look at adding U256x4 as a follow-up, but it might end up being x86-only unless there's a good reason to have a portable implementation.

@newpavlov

Copy link
Copy Markdown
Member

I am still not sure if this approach will work well in practice, so before merging this and relevant PRs I would like to see how it will affect the downstream crates, i.e. I suggest prototyping the full chain of changes off the PR branches.

@tarcieri

Copy link
Copy Markdown
MemberAuthor

@newpavlov yep, that was my plan: prototype it end-to-end on a bunch of branches and see if we can get some meaningful performance wins out of it, then discuss it more

@tarcieri
tarcieriforce-pushed the simd-buffers branch 8 times, most recently from f9f81c5 to 75682f8CompareFebruary 5, 2021 17:09
Implements the following SIMD types, as proposed in
RustCrypto/traits#444:
- `U128` (portable)
- `U256` (x86/x86_64 only)
- `U128x8` (portable)
These types are largely "storage only" and don't implement arithmetic
(if we needed that, `stdsimd`/`packed_simd` would be a better choice)
The implementation *does* expose optimized XOR intrinsics, however,
which seems to be the main thing useful in a portable cryptographic
context, at least as far as our current usages of SIMD go.
The `x86` backend exposes unsafe `target_feature(enable = "...")`
functions as part of its API, intended to be used/inlined within SIMD
backends for particular algorithms.
@tarcieri

Copy link
Copy Markdown
MemberAuthor

Going to go ahead and close this.

I think there are some other ways to address this without introducing an additional crate.

An interesting one would be supporting conversions between certain crypto-bigint types and SIMD registers.

@tarcieri
tarcieri deleted the simd-buffers branch September 15, 2021 12:26
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.

2 participants

@tarcieri@newpavlov
, '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

[WIP] simd-buffers - #221

Closed
tarcieri wants to merge 1 commit into
masterfrom
simd-buffers
Closed

[WIP] simd-buffers#221
tarcieri wants to merge 1 commit into
masterfrom
simd-buffers

Conversation

@tarcieri

Copy link
Copy Markdown
Member

Implements the following SIMD types, as proposed in RustCrypto/traits#444:

  • U128 (portable)
  • U256 (x86/x86_64 only)
  • U128x8 (portable)

These types are largely "storage only" and don't implement arithmetic (if we needed that, stdsimd/packed_simd would be a better choice)

The implementation does expose optimized XOR intrinsics, however, which seems to be the main thing useful in a portable cryptographic context, at least as far as our current usages of SIMD go.

The x86 backend exposes unsafe target_feature(enable = "...") functions as part of its API, intended to be used/inlined within SIMD backends for particular algorithms.

@tarcieri

tarcieri commented Jan 22, 2021

Copy link
Copy Markdown
MemberAuthor

Based on my high-level survey in RustCrypto/traits#444 the main SIMD types we need are:

  • U128x8 (AES, POLYVAL/GHASH)
  • U256x4 (ChaCha20, Poly1305)

This PR presently only implements U128x8 as a POC, which is the only one which is reasonably easy to do in a portable manner.

If we decide this approach is actually a good idea I can take a look at adding U256x4 as a follow-up, but it might end up being x86-only unless there's a good reason to have a portable implementation.

@newpavlov

Copy link
Copy Markdown
Member

I am still not sure if this approach will work well in practice, so before merging this and relevant PRs I would like to see how it will affect the downstream crates, i.e. I suggest prototyping the full chain of changes off the PR branches.

@tarcieri

Copy link
Copy Markdown
MemberAuthor

@newpavlov yep, that was my plan: prototype it end-to-end on a bunch of branches and see if we can get some meaningful performance wins out of it, then discuss it more

@tarcieri
tarcieriforce-pushed the simd-buffers branch 8 times, most recently from f9f81c5 to 75682f8CompareFebruary 5, 2021 17:09
Implements the following SIMD types, as proposed in
RustCrypto/traits#444:
- `U128` (portable)
- `U256` (x86/x86_64 only)
- `U128x8` (portable)
These types are largely "storage only" and don't implement arithmetic
(if we needed that, `stdsimd`/`packed_simd` would be a better choice)
The implementation *does* expose optimized XOR intrinsics, however,
which seems to be the main thing useful in a portable cryptographic
context, at least as far as our current usages of SIMD go.
The `x86` backend exposes unsafe `target_feature(enable = "...")`
functions as part of its API, intended to be used/inlined within SIMD
backends for particular algorithms.
@tarcieri

Copy link
Copy Markdown
MemberAuthor

Going to go ahead and close this.

I think there are some other ways to address this without introducing an additional crate.

An interesting one would be supporting conversions between certain crypto-bigint types and SIMD registers.

@tarcieri
tarcieri deleted the simd-buffers branch September 15, 2021 12:26
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.

2 participants

@tarcieri@newpavlov