问题标签 [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.

0 投票
4 回答
35192 浏览

arm - ARM Cortex-A8:VFP 和 NEON 有什么区别

在 ARM Cortex-A8 处理器中,我了解 NEON 是什么,它是一个 SIMD 协处理器。

但是VFP(Vector Floating Point)单元,它也是一个协处理器,是否可以作为一个SIMD处理器工作?如果是这样,哪个更好用?

我读了一些链接,例如-

  1. 链接1

  2. 链接2

但并不是很清楚它们的含义。他们说 VFP 从未打算用于 SIMD,但在Wiki上我读到以下内容 - “ VFP 架构还支持执行短向量指令,但这些指令按顺序对每个向量元素进行操作,因此不提供真正的 SIMD 的性能(单指令多数据)并行性。

不太清楚该相信什么,有人可以详细说明这个话题吗?

0 投票
4 回答
27082 浏览

c - 如何使用 C 中的 SSE 内在函数计算单向量点积

我试图将两个向量相乘,其中一个向量的每个元素乘以另一个向量的相同索引中的元素。然后我想对结果向量的所有元素求和以获得一个数字。例如,向量 {1,2,3,4} 和 {5,6,7,8} 的计算如下所示:

本质上,我正在取两个向量的点积。我知道有一个 SSE 命令可以执行此操作,但该命令没有与之关联的内在函数。此时,我不想在我的 C 代码中编写内联汇编,所以我只想使用内部函数。这似乎是一个常见的计算,所以我对自己在谷歌上找不到答案感到惊讶。

注意:我正在针对支持 SSE 4.2 的特定微架构进行优化。

0 投票
4 回答
3203 浏览

c - 使用 SSE 内在函数将 4 个点积存储到 C 中的连续数组中的最有效方法

我正在使用 SSE 内在函数为 Intel x86 Nehalem 微架构优化一些代码。

我的程序的一部分计算 4 个点积,并将每个结果添加到数组的连续块中的先前值。进一步来说,

请注意,我将使用 4 个临时 xmm 寄存器来保存每个点积的结果。在每个 xmm 寄存器中,相对于其他临时 xmm 寄存器,结果被放入一个唯一的 32 位中,因此最终结果如下所示:

tmp0= R0-零-零-零

tmp1= 零-R1-零-零

tmp2= 零-零-R2-零

tmp3=零-零-零-R3

我将每个 tmp 变量中包含的值合并为一个 xmm 变量,方法是使用以下指令将它们相加:

最后,我将包含点积的所有 4 个结果的寄存器添加到数组的连续部分,以便数组的索引按点积递增,就像这样(C_0n 是数组中当前要更新的 4 个值; C_2 是指向这4个值的地址):

我想知道是否有一种不那么迂回、更有效的方法来获取点积的结果并将它们添加到数组的连续块中。这样,我在其中只有 1 个非零值的寄存器之间进行了 3 次加法。似乎应该有一种更有效的方法来解决这个问题。

我感谢所有帮助。谢谢你。

0 投票
1 回答
162 浏览

optimization - 使用 SSE 优化有限差分

我想知道是否可以使用 SSE (1,2,3,4,...) 来优化以下循环:

[j*size + k]成语用于将内存块视为多维数组。

遗憾的是-ftree-vectorize,GCC (4.5) 的标志不相信循环适合 SIMD 类型的优化。-ftree-vectorize(尽管我说除了最琐碎的循环之外,我从未见过优化任何东西。)

虽然我知道还有许多其他方法可以提高循环的性能(OpenMP、展开、就地算法等),但我特别想知道是否可以使用 SIMD。我可能更感兴趣的是如何(如果有的话)这样的循环可以被转换的总体轮廓,而不是具体的实现。

0 投票
2 回答
1045 浏览

simd - 将 MMX/SSE 指令移植到 AltiVec

让我以此作为开场白。我在 ASM 方面的经验非常有限,在 SIMD 方面的经验更是少之又少。

但碰巧我有以下 MMX/SSE 优化代码,我想移植到 AltiVec 指令以在 PPC/Cell 处理器上使用。

这可能是一个很大的问题。尽管它只有几行代码,但我在试图弄清楚这里发生的事情时遇到了无穷无尽的麻烦。

原函数:

关于如何重写它以使用 AltiVec 指令的任何提示?

我的第一次尝试(一次非常错误的尝试)看起来像这样。但它并不完全(甚至是远程)正确。

0 投票
2 回答
5257 浏览

c - 从 128 位 SSE 向量中加载和提取 32 位整数值的最有效方法是什么?

我正在尝试使用 SSE 内在函数优化我的代码,但遇到了一个问题,在我完成 SSE 内在函数操作以获得我想要的内容后,我不知道从向量中提取整数值的好方法。

有谁知道这样做的好方法?我正在用 C 编程,我的编译器是 gcc 版本 4.3.2。

感谢你的帮助。

0 投票
1 回答
447 浏览

c++ - 浮点值的 AltiVec vec_msum 等效项

有人知道针对浮点值向量实现 vec_msum 功能的方法吗?

我对 SIMD 很陌生,虽然我认为我开始理解它了 - 仍然有一些谜题。

我的最终目标是重写函数“convolve_altivec”(在这个问题的接受答案中找到),以便它接受输入参数作为浮点值,而不是短值。

也就是说,原型应该是

我正在尝试匹配以下原始非优化功能提供的功能:

我最初的努力是尝试将相同功能的现有 SSE 版本移植到 altivec 指令。

0 投票
1 回答
1618 浏览

c - 64 位特定 simd 内在

我在 SSE2 中使用以下联合声明。

这个想法是为每个 a 和 b 分配两个无符号长变量(64 位长),对它们进行异或并将结果放在 c 中。

显式赋值 ( a.data[0] = something) 在这里有效,但需要更多时间。

我打算使用内在函数。如果我使用_mm_set_epi64 (unsigned long x, unsigned long y),它会要求__m64变量。如果我转换这些变量(__m64)x并且它工作正常,但它给出了错误的结果。

上面的代码给出了错误:

您能否建议一些替代方案(内在)?

0 投票
4 回答
4072 浏览

c - SIMD 代码比标量代码运行得慢

elma并且elmc都是unsigned long数组。res1和 也是如此res2

在 for 循环中包含元素 XOR 的非 simd 和 simd 版本。第二个 for 循环中的前两行执行显式 XOR,而其余行实现相同操作的 simd 版本。

此循环从外部调用数百次,因此优化此循环将有助于减少总计算时间。

问题是 simd 代码的运行速度比标量代码慢很多倍。

编辑:完成部分展开

但是,结果并没有太大变化;它仍然需要两倍的标量代码。

0 投票
2 回答
2443 浏览

c - SIMD 代码与标量代码

以下循环执行了数百次。
elma and elmc are both unsigned long (64-bit) arrays, so is res1 and res2.

在 for 循环中,标量版本的代码(已注释)运行速度是 simd 代码的两倍。下面提到了上述行的 cachegrind 输出(指令读取)。

行1:668,460,000 2 2
行2:668,460,000 1 1 1
行3:89,985,000 1 1 1 1
行4:89,985,000 1 1 1 1
行5:617,040,000 2 2行2
行6:44,992,500 0 0 0 0 LINE 0
LINE 7:44,992,500 0 0
LINE LINE LINE 8:44,992,500 0
LINE : : 128,550,000 0 0
第 10 行: . . .
第 11 行:205,680,000 0 0
第 12 行:205,680,000 0 0

从上图中可以看出,注释(标量代码)所需的指令数量明显少于 simd 代码。

如何使这段代码更快?