问题标签 [simd]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
gcc - 使用 GCC 进行循环版本控制
我正在使用 GCC 进行自动矢量化。由于客户要求,我无法使用内在函数或属性。(我无法获得用户输入来支持矢量化)
如果可以向量化的数组的对齐信息未知,则 GCC 调用“循环版本控制”的传递。在树上进行循环矢量化时将执行循环版本控制。当一个循环被确定为可向量化的,并且数据对齐或数据依赖的约束阻碍了它,(因为它们无法在编译时确定),那么将生成两个版本的循环。这些是循环的矢量化和非矢量化版本,以及运行时检查对齐或依赖性以控制执行哪个版本。
我的问题是我们必须如何强制对齐?如果我找到了一个可矢量化的循环,我不应该生成两个版本的循环,因为缺少对齐信息。
例如。考虑下面的代码
树转储(选项:-fdump-tree-optimized -ftree-vectorize)
在“bb 3”版本的矢量化代码中生成。在“bb 4”处生成没有矢量化的代码。这些是通过检查对齐来完成的(语句“A”)。现在不使用内在函数和其他属性,我应该如何只获得矢量化代码(没有这个运行时对齐检查。)
hash - 如果我散列一堆散列,散列冲突的可能性有多大?
假设我使用哈希来识别文件,所以我不需要它是安全的,我只需要尽量减少冲突。我在想我可以通过使用 SIMD 并行运行四个散列然后对最终结果进行散列来加速散列。如果哈希被设计为采用 512 位块,我只需单步执行文件,一次采用 4x512 位块并从中生成四个哈希;然后在文件的末尾,我将四个结果散列在一起。
我很确定这种方法会产生更差的哈希值......但是差多少?有没有粗略的计算?
sse - SSE2:如何将 _m128 简化为一个单词
将 _m128 (4 个单词 abcd)减少为一个单词的最佳方法( sse2 )是什么?我想要每个 _m128 组件的低部分:
有没有内在函数?谢谢 !
x86 - 目前哪些汇编程序支持 AVX 指令集?
我想开始玩一些 AVX(高级矢量扩展)指令。我知道英特尔提供了一个模拟器来测试包含这些指令的软件(请参阅这个问题),但是由于我不想手动编写十六进制代码,所以问题是哪些汇编程序当前知道 AVX 指令集?
我对在 Windows 下运行并且可以接受 Intel 语法的汇编程序最感兴趣。
c++ - 利用 SSE 和其他 CPU 扩展
在我的代码库中有几个地方,对于大型数据集,相同的操作会重复很多次。在某些情况下,处理这些需要相当长的时间。
我相信使用 SSE 来实现这些循环应该会显着提高它们的性能,尤其是在对同一组数据执行许多操作的情况下,所以一旦数据最初被读入缓存,就不应该有任何缓存未命中停止它。但是,我不确定是否要这样做。
是否有一种独立于编译器和操作系统的方式编写代码以利用 SSE 指令?我喜欢包含 SSE 操作的 VC++ 内在函数,但我还没有找到任何交叉编译器解决方案。
我仍然需要支持一些没有或有限 SSE 支持的 CPU(例如 Intel Celeron)。是否有某种方法可以避免必须制作不同版本的程序,例如拥有某种“运行时链接器”,该链接器根据进程启动时运行它的 CPU 链接基本或 SSE 优化代码?
其他 CPU 扩展怎么样,看看各种 Intel 和 AMD CPU 的指令集显示有几个?
c - 如何判断内存是否对齐?
我是使用 SSE/SSE2 指令优化代码的新手,直到现在我还没有走得太远。据我所知,一个常见的 SSE 优化函数如下所示:
但是,我如何正确确定内存ptr
指向的位置是否按例如 16 字节对齐?我认为我必须包含非对齐内存的常规 C 代码路径,因为我无法确保传递给此函数的每个内存都将对齐。并且使用内在函数将数据从未对齐的内存加载到 SSE 寄存器似乎非常慢(甚至比常规 C 代码慢)。
先感谢您...
c - 如何使用 128 位 C 变量和 xmm 128 位 asm?
在 gcc 中,我想通过 asm 代码对 2 个 C 变量进行 128 位 xor:如何?
但我有一个分段错误错误;这是 objdump 输出:
c++ - SIMD 与否 SIMD - 跨平台
我需要一些想法如何以某种方式编写一些可并行化问题的 C++ 跨平台实现,以便我可以利用 SIMD(SSE、SPU 等)(如果可用)。以及我希望能够在运行时在 SIMD 和非 SIMD 之间切换。
你会建议我如何解决这个问题? (当然我不想为所有可能的选项多次实施该问题)
我可以看到这对于 C++ 来说可能不是一件容易的事,但我相信我遗漏了一些东西。到目前为止,我的想法看起来像这样......一个类 cStream 将是单个字段的数组。使用多个 cStreams 我可以实现 SoA(数组结构)。然后使用一些 Functor,我可以伪造需要在整个 cStream 上执行的 Lambda 函数。
其中 for_each 将负责增加流的当前指针,以及使用 SIMD 和不使用 SIMD 内联函子的主体。
像这样:
请注意,如果 SIMD 已启用,则检查一次并且循环围绕主函子。
arm - 常见的 SIMD 技术
我在哪里可以找到有关常见 SIMD 技巧的信息?我有一个指令集,并且知道如何编写简单的 SIMD 代码,但我知道,现在的 SIMD 功能要强大得多。它可以保存复杂的条件无分支代码。
例如 ( ARMv6
),以下指令序列将 Rd 的每个字节设置为等于 Ra 和 Rb 的相应字节的无符号最小值:
教程链接/不常见的 SIMD 技术也很好 :) ARMv6对我来说是最有趣的,但是x86(SSE,...)/ Neon(在 ARMv7 中)/其他也很好。
assembly - 将两个 x86 32 位寄存器存储到 128 位 xmm 寄存器中
有没有更快的方法将两个 x86 32 位寄存器存储在一个 128 位 xmm 寄存器中?
因此,如果 EAX 为0x12345678
且 EDX 为0x87654321
,则 xmm0 中的结果必须为0x8765432112345678
。