问题标签 [auto-vectorization]

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 投票
2 回答
255 浏览

c - A[i]+=A[i+1] 是循环中的一种数据依赖性吗?可以矢量化吗?

据我所知,具有串行数据依赖性的循环A[i] += A[i-1]无法矢量化。

但我不确定这A[i] += A[i+1]是否是原始数据依赖关系,如果这个循环可以向量化?

0 投票
1 回答
171 浏览

gcc - 有没有办法用 gcc 自动生成 MMX 指令(不是 SSE)

看起来 gcc 会很高兴地自动矢量化简单的示例,并发出 SSE 指令。有没有办法只发出 MMX 指令?

例如,如果我在 Godbolt 上尝试以下示例:

在 GCC 9.2 上编译-mmmx -O3 -m32 -msse2,我得到

但是没有 sse (即-mmmx -O3 -m32 -mno-sse2),它只能使用通用寄存器,并且没有 mmx 指令:

我想跑一些 Benchmarks,比较只用 x87-fpu、MMX、SSE 和 SSE2 运行的效果,但是如果 gcc 不会发出 MMX 指令,那么为 x87 和 x87+mmx 编译不会有任何区别.

0 投票
1 回答
330 浏览

gcc - 我需要使用哪些 C 指令来让 gcc 的 x86-64 自动矢量化器输出 pshufb 操作码?

我希望 gcc 的自动矢量化(即不是内在函数)使用 ssse3 操作码 pshufb 将 0xPQ 转换为 64 位值 0xPQPQPQPQPQPQPQPQ。但是,即使我可以看到 gcc 输出 pshufb 操作码用于其他用途(因此编译器肯定能够输出它),我无法计算出针对这种特殊情况触发它所需的一系列 C 指令。

有什么建议么?谢谢!

0 投票
1 回答
90 浏览

gcc - 用于 for 循环的 MMX SSE 扩展

我有 GCC 9.2 编译器。如果我使用 MMX 或 SSE/AVX 扩展,你将让你的代码并行运行,所以它会更快。如何告诉编译器使用此指令我有一个要并行的代码片段:

它使用 SSE 扩展生成代码但不使用 pmaxub 为什么

0 投票
0 回答
25 浏览

gcc - 如何使用 gcc 或其他编译器打包布尔运算?

英特尔 CPU 能够使用矢量化操作执行 512 或 1024 位操作。假设我有一个如下所示的代码片段:

英特尔编译器是否GCC自动矢量化此代码,或者我需要重写代码才能从矢量化中受益?理想情况下,我希望前三个操作并行执行,然后并行计算接下来的两个。

0 投票
1 回答
1731 浏览

c++ - gcc、clang 和 msvc 的 C++ 自动矢量化要求

以下陈述是否正确?

  1. 使用 GCC 和 clang,如果我使用以下代码编译,我的代码将自动矢量化:

    • -O2 -ftree-vectorize -march=XYZ(XYZ 为目标指令集:native、SSE、AVX2 等)
    • -O3 -march=XYZ
  2. 使用 MSVC,如果我使用以下代码编译,我的代码将自动矢量化:

    • /O2

该视频似乎表明我不需要使用 MSVC 指定架构。那是对的吗?默认情况下,编译器将使用本机架构,如果找不到向量指令,则在运行时回退到标量操作。

0 投票
1 回答
275 浏览

c++ - 如何确定向量长度以确保向量化过程中没有向量依赖性?

对于像这个例子这样的情况

如何确定向量长度以确保可以对这个循环进行向量化?以下是正确的方法吗?

这意味着在英特尔 AVX-512 上对 int 类型的数组进行向量化将导致寄存器中的向量长度为​​ 16,从而使上述示例可以安全地进行向量化。

这种方法正确吗?如果是这样,有没有办法在这个架构上使用更短的向量?例如,强制一个长度为 4 的向量,以便可以对下面的示例进行向量化

0 投票
1 回答
128 浏览

c - 明确告诉 GCC 9.2 取消切换循环以允许自动矢量化

我正在开发一个需要自动矢量化大循环的项目。必须使用 GCC 编译。问题的最小情况可能如下:

对于这种特定情况,GCC 使用 16B 向量而不是 32B 向量进行自动向量化。很容易看出控制流依赖于一个可以从内部循环中检查出来的条件,但是 GCC 没有执行任何循环取消切换。

循环取消切换可以手动完成,但请注意,这是问题的最小情况,真正的循环有数百行,执行手动取消循环会导致大量代码冗余。我试图找到一种方法来强制 GCC 为可以从内部循环中检查出来的不同条件创建不同的循环。

目前我正在使用带有以下标志的 GCC 9.2:-Ofast -march=native -std=c11 -fopenmp -ftree-vectorize -ffast-math -mavx -mno-avx256-split-unaligned-load -mno-avx256-split-unaligned-store -fopt-info-vec-optimized

0 投票
1 回答
43 浏览

python - 向量化 Pandas 数据帧

这是一个数据清理练习,其中数据帧 A 的特定元素应设置为 NaN,具体取决于通过 B 解码的值。

我编写了以下代码,其中 3 嵌套循环将运行 17 小时:

我怀疑瓶颈是长的外循环,因为len(A)大约是 100 万。所以,这不是使用 Pandas 的最佳方式,我会改为:

然而,后者抛出一个异常:

2个问题:

  1. 我对性能瓶颈和矢量化的好处说得对吗
  2. 如何正确表达if条件
  3. Y的计算并不昂贵,它是一个查找数组来确定如何操作A数据帧
0 投票
1 回答
94 浏览

gcc - gcc Auto-Vectorization - 了解输出消息

我目前正在尝试了解 gcc Vectorizer 的输出。我使用-O2 -ftree-vectorize -fopt-info-vec-all和 gcc 8.2.0 编译了我的程序。

但是,我不明白某些输出消息是什么意思,并且似乎无法在互联网上找到解释。

以下示例中的 PHI 是什么意思?

这里有什么问题?

任何帮助是极大的赞赏。

(我不是在寻求解决问题的帮助,只是想首先了解它们是什么)