问题标签 [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 投票
0 回答
430 浏览

c++11 - callgrind不能支持AVX2指令吗?

我正在尝试使用 valgrind 分析我用英特尔 AVX2 指令编写的程序。程序在memcheck下运行流畅。但是当我使用 callgrind ( valgrind --tool=callgrind) 运行时,它会以无法识别的指令错误终止。我检查了Valgrind 3.9.0的发行说明Support for Intel AVX2 instructions. This is available only on 64 bit code.,它说。我编译我的程序,g++-4.8 -std=c++11 -mavx2 -m64但错误仍然存​​在。部分输出如下:

编辑:我发现错误取决于优化级别。-O0 没有错误。但错误出现在 -O1 及以上。

0 投票
5 回答
9687 浏览

simd - Transpose an 8x8 float using AVX/AVX2

Transposing a 8x8 matrix can be achieved by making four 4x4 matrices, and transposing each of them. This is not want I'm going for.

In another question, one answer gave a solution that would only require 24 instructions for an 8x8 matrix. However, this does not apply to floats.

Since the AVX2 contains registers of 256 bits, each register would fit eight 32 bits integers (floats). But the question is:

How to transpose an 8x8 float matrix, using AVX/AVX2, with the smallest instructions possible?

0 投票
3 回答
805 浏览

c - 给定两个 uint8_t 数组,计算 128 个元素的 SAD

我有两个数组,uint8_t它们都有 64 个元素。我想出的“最佳”方法是计算所有元素的 SAD,是加载 4x 16 个元素,将它们放入两个m128i寄存器中,然后将它们都放入一个m256寄存器中。这对两个uint8_t数组都完成,如下所示:

我现在有两个m256寄存器,uv,并且可以计算 SAD:

但是,可能由于时间较晚,我想不出更好的方法来获得结果......这就是我现在得到的:

result是一个 int,如果不清楚的话。

这会产生相当多的指令。在我看来,这是加载我想要的所有 uint 的唯一方法。但是,这可能不是将结果从m256i c寄存器中取出的最佳方法。

你说什么?你能帮我以更优化的方式做到这一点吗?

放在一起,函数看起来像:

由于 uint 的组织方式的性质,我一次只能加载 8 个,然后我必须用stride. 一次加载即十六个,会产生不好的结果。

0 投票
0 回答
105 浏览

x86 - VEXTRACTF128 与 VEXTRACTI128

据我所知,VEXTRACTF128 和 VEXTRACTI128 指令执行相同的操作,具有相同的延迟、相同的吞吐量并使用相同的端口。我无法分辨它们之间的唯一区别是 VEXTRACTF128 只需要 AVX VEXTRACTI128 需要 AVX2。 如果这是唯一有效的区别,为什么要使用 VEXTRACTI128?

我在 Agner Fog 的 vectroclass 中看到了以下内容,我推断这意味着指令之间存在一些重要区别。也许他们共享不同的域(浮点或整数)?

0 投票
1 回答
146 浏览

performance - 将寄存器导出到堆栈对性能有何影响?

我正在编写一些旨在以 32 位模式在 x86 上运行的代码。在那种模式下,我知道我只有 8 个 SIMD/AVX2-Registers (YMM0-7) 可以自由使用。然而,我的一些向量子例程有时会同时使用超过这个数量的寄存器(这意味着它们仍然需要在路上的某个地方——大多数情况下不会那么远)。

我的理解是,编译器在找不到未使用的寄存器时会将旧寄存器导出到堆栈内存。但这对性能有多大影响?(例如,以后每次导出/导入的周期)。我是否可以信任主要位于 L1-D-Cache 中的堆栈内存(在 Haswell 中有 2 个周期延迟),或者避免这种寄存器到内存(反之亦然)传输是否会对性能产生重大影响?

到目前为止,我无法找到该主题的答案,特别是因为寄存器越来越大(即将推出的 Skylake 平台,每个寄存器 1 个缓存线)。如果您能提供消息来源以防您回答,那就太好了。

0 投票
1 回答
21681 浏览

c - 如何验证操作系统是否支持 avx2 指令

我有配置:Intel(R) Core(TM) i7-4702MQ CPU(采用 Haswell 架构)、Windows 8、Intel C++ Compiller XE 13.0。我想用 avx2 优化运行我的程序并放置编译标志:

/QaxCORE-AVX2, /QxCORE-AVX2

但是当我运行程序时出现错误:

致命错误:此程序不是为在您的系统中运行而构建的。请确认操作系统和处理器都支持 Intel(R) AVX2、BMI、LZCNT、HLE、RTM 和 FMA 指令。

我运行页面上给出的 avx2 cpu 支持测试:如何检测第 4 代英特尔酷睿处理器系列中的新指令支持。结果:

该 CPU 支持 Haswell 中引入的 ISA 扩展。

如何检查我的操作系统是否支持 avx2-extensions 以及导致错误的原因是什么?对于使用 avx2 扩展,我需要同时设置/QaxCORE-AVX2/QxCORE-AVX2标志?

更新:如果我设置标志

该计划已成功启动。

0 投票
1 回答
249 浏览

c++ - g++ -O2 错误地优化了 SIMD 变量分配

我正在使用英特尔 AVX2 指令编写程序。我在我的程序中发现了一个错误,它只出现在优化级别 -O2 或更高级别(使用 -O1 很好)。经过大量调试后,我缩小了错误区域。现在该错误似乎是由编译器错误地优化了__m256i变量的简单复制分配引起的。

考虑以下代码片段。Foo 是一个模板函数。我用CMP = kLess, OPT=kSet. 我知道优化器可能会优化开关。它甚至可以优化变量y

越野车线是y = m_lt;. 当使用 -O2 编译时,这一行似乎被忽略了。然后y没有得到正确的值,程序产生错误的结果。但是,该程序使用 -O1 是正确的。

为了验证我的判断,我y = m_lt;用两个替代方案替换:

y = avx_or(m_lt, avx_zero());采用按位 ORm_lt和一个全 0 的向量

y = _mm256_load_si256(&m_lt);使用 SIMD 加载指令从m_lt.

两者在语义上都应该等同于y = m_lt;我的意图是通过添加一些功能来防止一些优化。该程序在所有优化级别下都可以正确使用这两个替换。所以问题很奇怪。据我所知,直接分配 SIMD 变量绝对没问题(我以前用过很多)。会不会是编译器的问题?

0 投票
1 回答
2197 浏览

avx - 使用 -xhost 选项进行英特尔 icpc 编译:AVX 已激活?

我正在使用 icpc 编译器来查看通常使用 g++ 编译的代码的速度。

我编译的处理器属于英特尔的 Sandy Bridge 架构,所以我想使用 AVX 矢量化。

有人告诉我,带有 icpc 的“-xhost”标志可以让我自动从 AVX 矢量化中受益:是这样吗?

如果没有,你能告诉标志与 icpc 一起激活 AVX。

最后一个问题:我也可以从 AVX2 中受益吗?如果是,如何?

谢谢

0 投票
1 回答
787 浏览

macos - mac osx 10.8.5、gcc4.9 AVX 支持的编译问题

我的系统是 mac osx 10.8.5。这台机器上的默认 gcc 是 4.2 (i686-apple-darwin11-llvm-gcc-4.2 (GCC) 4.2.1 (Based on Apple Inc. build 5658) (LLVM build 2335.15.00)) 我已经在 / 上安装了 gcc 4.9本地/本地。

我有一个使用 AVX2 内在函数的代码。已附上带有消息的代码。

现在如果我用 gcc 4.9 编译这段代码,

gcc-4.9 -O3 -march=core-avx2 a7.c,我收到以下错误消息,

我想当我使用 gcc-4.9 时需要更新汇编程序?还是看起来像其他一些问题......任何指针都会有所帮助......

0 投票
1 回答
1668 浏览

c++ - 为什么 MSVC 的自动矢量化不使用 AVX2?

我正在尝试在我的编译器(Microsoft Visual Studio 2013)中使用矢量化。我面临的问题之一是它不想使用 AVX2。在研究这个问题时,我构建了以下示例,它计算 16 个数字的总和,每个数字为 16 位。

编译器将此代码向量化,但仅限于 SSE 指令:

为了确保编译器可以选择生成 AVX2 代码,我编写了如下相同的计算:

我看到这两部分代码是等价的(也就是执行完之后就output11等价了output2)。

它为代码的第二部分输出 AVX2 指令:

但是,我不想重写我的代码以使用内在函数:将其编写为循环更自然,与旧的(仅限 SSE)处理器兼容,并且具有其他优点。

那么如何调整我的示例以使编译器能够以 AVX2 方式对其进行矢量化呢?