问题标签 [avx2]

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 回答
2207 浏览

assembly - 旋转或转置数组的最佳 SIMD 算法

我正在研究一个数据结构,其中有一个 16 个 uint64 的数组。它们在内存中的布局是这样的(下面每个代表一个 int64):

期望的结果是将数组转置为:

数组旋转 90 度也是未来循环可接受的解决方案:

我需要这个以便稍后快速操作箭头(用另一个 SIMD 行程顺序遍历它,一次 4 个)。

到目前为止,我已经尝试通过加载 A 的 4 x 64 位向量、位掩码和混洗元素并将其与 B 等进行 OR 运算,然后对 C 重复该操作来“混合”数据......不幸的是,这是数组中每段 4 个元素的 5 x 4 SIMD 指令(一个加载、一个掩码、一个随机播放、一个或带有下一个元素,最后是一个存储)。看来我应该可以做得更好。

我有可用的 AVX2,我用 clang 编译。

0 投票
0 回答
506 浏览

assembly - AVX2 旋转矢量

我的平台是MASM64,AVX2。我需要对 YMM 注册表执行旋转操作,如下所示:

|| A0 || A1 || A2 || A3 || = > || A1 || A2 || A3 || A0 ||

其中 Ai 是一个 qword。我找不到任何文档对同一问题的引用。

提前致谢!

0 投票
0 回答
202 浏览

fortran - `loop was not vectorized: subscript too complex` in Intel Fortran with OpenMP

我在尝试使用 OpenMP 进行并行化并使用 ifort 14.0.2 对嵌套循环进行矢量化时遇到问题。

这是循环:

当我尝试单独运行并行或矢量化时,一切都按预期工作;但是当我尝试编译时-O3 -openmp -axavx -vec-report6,报告似乎忽略了最里面的循环 - 一个结束,并在初始化的行i给我这个消息:c

remark: loop was not vectorized: subscript too complex

我无法理解。

如果-openmp标志被关闭,循环将i被矢量化,它运行得确实更快,给出正确的结果。

提到相同的代码在英特尔编译器的实际版本(即15 )上编译并按预期工作可能很有用。

它只是一个编译器问题吗?

无论如何,我可以让它与 14.0.2 版本一起使用吗?

0 投票
2 回答
19082 浏览

c - 编译AVX2程序

我用 AVX 内部函数编写了一个程序,它使用 Ubuntu 12.4 LTS 和 GCC 4.6 以及以下编译行运行良好: g++ -g -Wall -mavx ProgramName.cc -o ProgramName

当我将编译器更新到 4.7 和 4.8.1 版本以支持 16 位 AVX2 内在函数时,问题就开始了,这在 gcc 4.6 中不受支持

目前,更新的 gcc 版本可以正确编译 AVX 和 AVX2 程序。但是,当我运行程序时,它给了我以下错误:非法指令(核心转储),虽然它在 gcc 4.6 上工作

我的问题是:编译和运行 AVX 和 AVX2 内在函数的完美方法是什么

0 投票
1 回答
1141 浏览

intrinsics - _mm256_xor_si256() 和 _mm256_xor_ps() 之间的区别

我试图从 AVX(2)中找到_mm256_xor_si256_mm256_xor_ps内在函数之间的实际区别。

它们分别映射到 intel 指令:

  • vpxor ymm, ymm, ymm
  • vxorps ymm, ymm, ymm

英特尔将其定义为:

相对

但坦率地说,我看不出它们的效果有什么不同?它们都异或 256 位。但是后者可以用在AVX和AVX2上,第一个只能用在AVX2上。为什么你会使用第一个,兼容性较低?

0 投票
0 回答
422 浏览

c++ - Visual Studio 2013 中的 AVX2 指令中断

这是C++代码:

当我在 VS2013 中运行此代码时,或操作将中断。

而且我认为我的cpu可以支持AVX2,因为x和y可以成功输出。

有人可以告诉我如何解决这个问题吗?

0 投票
1 回答
681 浏览

c++ - 使用 __m256 值的数组生成不正确的代码是一个铿锵的错误吗?

我遇到了似乎是导致使用 clang 3.4、3.5 和 3.6 主干生成错误代码的错误。实际触发问题的来源非常复杂,但我已经能够将其简化为这个独立的示例:

上面的总结:我有一个简单的类型simd_pack,它包含一个成员,一个__m256i值的数组。在我的应用程序中,存在采用这些类型的运算符和函数,但可以通过上面的示例说明问题。具体来说,test_broken()应该从in1数组中读取,然后将其值复制到out数组中。memcmp()因此,对in的调用main()应该返回零。我使用以下内容编译上述内容:

我发现在优化级别-O0-O1上,测试通过,而在级别-O2和上-O3,测试失败。我尝试使用 gcc 4.4、4.6、4.7 和 4.8 以及 Intel C++ 13.0 编译相同的文件,并且测试通过了所有优化级别。

仔细查看生成的代码,这是在优化级别生成的程序集-O3

我将重现重点部分:

这有点让人头疼。它首先使用我要求的未对齐移动加载 256 位ymm0,然后将xmm0(仅包含已读取数据的低 128 位)存储到堆栈中,然后立即ymm0从刚刚的堆栈位置读取 256 位写给。效果是ymm0的高 128 位(写入输出缓冲区)是垃圾,导致测试失败。

除了编译器错误之外,还有什么好的理由会发生这种情况吗?我是否违反了某些规则,让simd_pack类型包含一个值数组__m256i?这似乎与此有关;如果我更改_val为单个值而不是数组,则生成的代码将按预期工作。但是,我的应用程序需要_val是一个数组(其长度取决于 C++ 模板参数)。

有任何想法吗?

0 投票
1 回答
1761 浏览

x86 - 将两个 32 位整数向量相乘,产生一个 32 位结果元素向量

_mm256i将两个寄存器的每个 32 位条目相乘的最佳方法是什么?

_mm256_mul_epu32不是我要找的,因为它产生 64 位输出。我想要每个 32 位输入元素的 32 位结果。

此外,我确信两个 32 位值的乘法不会溢出。

谢谢!

0 投票
1 回答
1448 浏览

x86 - AVX2 移位(16 位)整数

是否有内置指令可以对 AVX2 中的(16 位)整数元素执行右移和左移操作?

像下面的例子:

其中_mm_srli_si128(H,14)_mm_slli_si128(H,2)在 SSE3 16 位元素上运行良好。我问是因为性能(运行时间)对我来说至关重要。

0 投票
3 回答
888 浏览

c++11 - 将最佳 uint8_t 位图转换为 8 x 32 位 SIMD“布尔”向量

作为压缩算法的一部分,我正在寻找实现以下目标的最佳方法:

我有一个简单的位图uint8_t。例如 01010011

我想要的是一个__m256i形式: (0, maxint, 0, maxint, 0, 0, maxint, maxint)

实现此目的的一种方法是将 8 x maxint 的向量改组为零向量。但这首先需要我将我的扩展uint8_t为正确的随机播放位图。

我想知道是否有更好的方法?