AVX2 的汇编错误

Posted

技术标签:

【中文标题】AVX2 的汇编错误【英文标题】:Assemble Error for AVX2 【发布时间】:2014-03-10 12:55:57 【问题描述】:

我尝试用 gcc(g++) 编译一个 AVX2 程序。但它没有正常工作。

#include<immintrin.h>
....
__m256i _vector256  = _mm256_loadu_si256((__m256i*)pin);
__m256i _vectorMask = _mm256_loadu_si256((__m256i*)mask_hbits); 
_vector256 = _mm256_slli_epi32 (_vector256, AVX_LOGDESC); // AVX_LOGDESC == 4
__m256i _vectorRes = _mm256_and_si256(_vector256, _vectorMask);
....

我的编译命令是(作为 Makefile 中的一行):

g++ avx_shift.cpp -c -mavx2

我也试过这个:

g++ avx_shift.cpp -c -march=native

但是错误信息是一样的:

/tmp/ccSFs6U0.s: Assembler messages:
/tmp/ccSFs6U0.s:1083: Error: suffix or operands invalid for `vpslld'
/tmp/ccSFs6U0.s:1091: Error: suffix or operands invalid for `vpand'
....

汇编代码(加行号):

vmovdqa 988(%rsp), %ymm0    # __A, D.48219
movl    984(%rsp), %eax # __B, tmp205
movl    %eax, -120(%rsp)    # tmp205, %sfp
vmovd   -120(%rsp), %xmm6   # %sfp, tmp205
vpslld  %xmm6, %ymm0, %ymm0 # tmp205, D.48219, D.48220      // 1083
....
vmovdqa 668(%rsp), %ymm0    # __B, tmp220
vmovdqa 700(%rsp), %ymm1    # __A, tmp221
vpand   %ymm0, %ymm1, %ymm0 # tmp220, tmp221, D.48215       // 1091
....

我的 gcc(g++) 版本是 4.8.0。我的操作系统版本是 Centos6.5 X86_64。我已经确认我的 CPU 支持 AVX2 指令。那么谁能帮我找出错误呢?

【问题讨论】:

你的汇编器 (binutils) 版本是什么? 2.22 组装得很好。 【参考方案1】:

您粘贴的两条源代码行不应该生成任何 vpslldvpand 指令,并且在我的机器上也不应该。使用-S -g -fverbose-asm 开关询问汇编源代码并尝试找到匹配的源代码行。

【讨论】:

对不起,我不会如何在 cmets 中格式化代码,所以我将代码发布在问题中。 似乎在我的 debian gcc 4.7.2 和使用 ubuntu g++ 4.8 的 gcc.godbolt.org 上编译得很好 我从源代码构建了 gcc4.8,因为 Centos 中的原始版本是 4.4.7。如果是编译器的错误,gcc的make命令有什么特殊的选项吗? 这听起来更像是汇编器而不是编译器,因为您已经粘贴了 asm 输出并且看起来没问题。 感谢您的提示。我已经解决了这个问题。看来binutils(2.20)的版本太低了。我已经构建了 binutils 2.22 并解决了问题。

以上是关于AVX2 的汇编错误的主要内容,如果未能解决你的问题,请参考以下文章

如何计算avx和avx2指令集的数量

英特尔 AVX2 组装开发

AVX2中的按位非/补码[重复]

gnu 内联汇编错误

汇编中常见的一些错误信息

关于“找不到附属汇编 Microsoft.VC90.CRT,上一个错误是 参照的汇编没有安装在系统上。”的解决