问题标签 [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.
.net - .NET JIT 编译器在什么条件下执行自动矢量化?
新的 RyuJIT 编译器是否生成矢量 (SIMD) CPU 指令,何时生成?
旁注:System.Numerics 命名空间包含允许显式使用 Vector 操作的类型,这些操作可能会或可能不会生成 SIMD 指令,具体取决于 CPU、CLR 版本、JITer 版本,是否直接编译为本机代码。这个问题特别是关于非向量代码(例如在 C# 或 F# 中)何时会产生 SIMD 指令。
c - gcc 不会矢量化简单循环
我正在尝试从 gcc auto-vectorize 文档中对示例 4 的简化版本进行矢量化。对于我的一生,我不知道该怎么做;
我正在使用 gcc -o apps/craft_dbsplit.o -c -Wall -g -ggdb -O3 -msse2 -funsafe-math-optimizations -ffast-math -ftree-vectorize -ftree-vectorizer-verbose= 运行 gcc 4.7.2 5 -funsafe-loop-optimizations -std=c99
它回复:
gcc - 为什么 O3 优化在使用浮点类型时没有提高性能?
我编译了两个和矩阵乘法程序的相应C
实现,当我编译它们时几乎所有东西都是相同的,但是当我使用标志来使用自动矢量化功能时,它们都产生了不同的加速。我看到了程序集并发现了差异,但我不知道为什么要这样编译?type 和type之间的原因和区别是什么?float
int
O2
O3
GCC
float
int
由于某些原因,在乘法之前,我转置了第二个矩阵。矩阵的大小为 128x128,当我启用标志时,O2
标量 int 实现的速度比相同的实现快 5.4,并且实现速度几乎差一点。
Int 汇编输出:O3
float
0.94
浮动组件输出:
c - 为什么 GCC 自动矢量化也取决于循环迭代变量的类型?
我有一个带循环的简单函数。GCC 能够在这个函数中向量化循环。我的 GCC 版本是 4.7.4。
但是,当我将函数参数 cnt 的类型从 unsigned int 更改为 int 时,GCC 无法优化循环。
在这个新版本的 foo 中循环没有向量化。循环的 GCC 输出是:
142:未矢量化:数据参考分析失败 D.62366_17 = *D.62365_16;
似乎 GCC 需要它在循环迭代中使用的参数和变量具有相同的确切类型。为什么在这种情况下矢量化取决于循环迭代变量类型?
gcc - gcc -Ofast 是否启用矢量化?
我目前正在使用以下 2 个标志设置编译 spec2000 艺术基准:
-Ofast -m32 -march=native
-Ofast -m32 -march=native -fno-tree-vectorize
第二个设置只是禁用矢量化器。但是,当我检查 2 个设置的 objdump 时,它们都显示了一些打包指令,例如vmovapd
,vxorpd
等。
谁能提供一些解释?谢谢。
performance - 有没有办法帮助自动矢量化编译器发出 LLVM 中固有的饱和算术?
我有一些执行饱和算术运算的 for 循环。例如:
在我的情况下,饱和添加的实现如下:
我看到 x86 中存在 paddsat 固有特性,它可能是这个循环的完美解决方案。我确实将代码自动矢量化,但根据我的代码结合了多个操作。我想知道编写这个循环的最佳方法是什么,自动矢量化器会找到正确的 addat 操作匹配。
向量结构为:
使用的编译器是 clang 3.8,代码是为 AVX2 Haswell x86-64 架构编译的。
c++ - 为什么库需要硬编码矢量化而不是编译器自动矢量化
C++ eigen 库为不同的架构进行向量化,如 SSE、NEON 等。在他们的文档中,他们提到,Eigen 向量化不依赖于编译器。但是,如果使用 -O3 标志启用了矢量化标志,则大多数现代编译器(如 gcc)会自动进行矢量化。
所以我的问题是,当编译器自动为我们执行此操作时,为什么 Eigen 或任何其他库会执行硬编码矢量化?
c++ - 关于矢量化和循环大小的令人费解的 GCC 行为
最初调查#pragma omp simd
指令的效果时,我遇到了一种我无法解释的行为,与简单 for 循环的矢量化有关。如果应用了-O3指令并且我们使用的是 x86 架构,则可以在这个很棒的编译器资源管理器上测试以下代码示例。
有人可以解释一下以下观察背后的逻辑吗?
令我困惑的是,尽管不能保证是 32 的倍数,但 l1 和 l3 都生成矢量化代码。所有其他长度都不会产生矢量化代码,但应该是 32 的倍数。这背后有什么原因吗?
顺便说一句,使用 #pragma omp simd 指令实际上并没有改变任何东西。
编辑:经过进一步调查,当索引类型为 size_t (甚至不需要边界操作)时,行为差异消失了,这意味着这会生成矢量化代码:
如果有人知道为什么循环矢量化如此依赖于索引类型,我很想知道更多!
Edit2,感谢 Mark Lakata,实际上需要 O3
fortran - 英特尔编译器矢量化报告:重开销与轻量级?
在英特尔 Fortran 编译器的这份矢量化报告中:
这里的含义lightweight vector
和heavy-overhead vector
操作是什么?
相关的循环看起来像
有lev
一些整数。
c++ - gcc中的数组与指针自动矢量化
我正在尝试将自动矢量化与 g++ 5.4 ( -ftree-vectorize
) 一起使用。我注意到下面代码中的数组版本导致编译器错过了内部循环中的向量化机会,导致与指针版本相比存在显着的性能差异。在这种情况下,有什么可以帮助编译器的吗?