编译openblas报错:no such instruction: vpermpd

在centos6.5下编译OpenBLAS时报了好多类似下面的错误:

…/kernel/x86_64/dgemm_kernel_4x8_haswell.S:1759: Error: no such instruction: `vpermpd $ 0xb1,%ymm0,%ymm0‘

在网上找到了解决办法[《centos6.7安装openblas错误》] (http://www.bubuko.com/infodetail-1994834.html),经验证确实有效。
但是这个办法要修改源码,显然有点不太可取,仔细查看了Makefile和Makefile.system两个文件,在Makefile.system中找到如下代码,一下就明白了。

ifeq ($(NO_AVX2), 1)
CCOMMON_OPT	+= -DNO_AVX2
endif

解决办法:
如下在执行make时加NO_AVX2=1参数,就避免修改源码:

make NO_LAPACKE=1 NO_SHARED=1 NO_AVX2=1

<think>好的,我现在需要解决用户遇到的编译器错误:“no such instruction `vpopcntq zmm0`”,尤其是在使用GCC编译时出现这个问题。首先,我得弄清楚这个错误的原因。用户提到了vpopcntq指令,这可能是一个较新的Intel指令,属于AVX-512扩展的一部分。所以,问题可能出在编译器或相关工具链不支持这个指令。 根据用户提供的引用内容,特别是引用[2]中的情况,之前也有类似的错误,问题出在binutils版本过低,无法识别新的汇编指令。因此,可能当前的binutils版本不支持vpopcntq,需要升级。 接下来,我需要确认vpopcntq指令的支持情况。查阅资料发现,vpopcntq是AVX-512中的VPOPCNTDQ指令集的一部分,用于向量化的位计数。支持这个指令的处理器需要具备AVX-512 VPOPCNTDQ扩展,比如Intel的Ice Lake或更新的架构。同时,编译器需要能够生成这些指令,并且汇编器(如GNU as)需要能够识别它们。 用户提到他们可能已经安装了binutils,但版本不够新。所以解决方案应该是升级binutils到支持该指令的版本。根据历史经验,可能需要手动下载并编译最新版的binutils,因为通过yum安装的可能还是旧版本。例如,引用[2]中用户通过编译安装最新版binutils解决了类似的问题。 另外,检查GCC版本也很重要。如果GCC本身不支持生成AVX-512 VPOPCNTDQ指令,即使binutils支持,也无法正确编译。用户需要确保GCC版本足够新,支持相关的指令集。例如,GCC 10或更高版本可能更合适。 可能的步骤包括:首先确认处理器是否支持该指令,然后升级binutils,接着升级GCC,最后在编译时启用相应的指令集参数(如-march=native或特定的AVX-512选项)。如果用户的环境是CentOS,可能需要从源码编译安装这些工具,因为官方仓库的软件包可能较旧。 此外,用户可能需要设置正确的路径,确保新安装的binutils和GCC被优先使用,避免系统自带的旧版本干扰。例如,将新安装的binutils路径添加到PATH环境变量中,或者在编译时指定汇编器的路径。 最后,验证解决方案是否有效,可以通过编译一个包含vpopcntq指令的小测试程序,确认是否不再报错。如果仍然有问题,可能需要进一步检查其他依赖项或配置细节。</think>要解决GCC编译时出现的`no such instruction: 'vpopcntq zmm0'`错误,需从指令支持、工具链版本及编译参数三方面入手。以下是具体分析及解决方案: --- ### 一、错误原因分析 1. **指令特性** `vpopcntq`属于**AVX-512 VPOPCNTDQ**扩展指令集,用于计算向量寄存器中每个64位元素的二进制1的个数[^1]。 2. **工具链支持不足** - **汇编器(as)**:旧版`binutils`无法识别该指令(需≥2.30版本)[^2] - **编译器(GCC)**:需支持AVX-512 VPOPCNTDQ扩展(建议GCC≥10.1)[^3] 3. **硬件依赖** 仅支持Intel Ice Lake、Xeon Scalable(第三代+)等支持AVX-512 VPOPCNTDQ的CPU。 --- ### 二、解决方案步骤 #### 步骤1:验证硬件支持 ```bash # 查看CPU flags是否包含avx512_vpops grep avx512_vpops /proc/cpuinfo ``` 若无输出则硬件不支持,需更换编译目标或硬件。 #### 步骤2:升级binutils ```bash # 下载最新源码(当前最新2.42) wget https://ftp.gnu.org/gnu/binutils/binutils-2.42.tar.gz tar -xzf binutils-2.42.tar.gz cd binutils-2.42 ./configure --prefix=/usr/local/binutils-2.42 make -j$(nproc) sudo make install # 更新PATH echo 'export PATH=/usr/local/binutils-2.42/bin:$PATH' >> ~/.bashrc source ~/.bashrc ``` #### 步骤3:升级GCC ```bash # 安装devtoolset-11(GCC11) sudo yum install centos-release-scl sudo yum install devtoolset-11 scl enable devtoolset-11 bash # 或手动编译GCC wget https://ftp.gnu.org/gnu/gcc/gcc-12.3.0/gcc-12.3.0.tar.gz tar -xzf gcc-12.3.0.tar.gz cd gcc-12.3.0 ./contrib/download_prerequisites ./configure --prefix=/usr/local/gcc-12.3.0 --enable-languages=c,c++ make -j$(nproc) sudo make install ``` #### 步骤4:指定编译参数 ```bash # 显式启用AVX-512 VPOPCNTDQ gcc -march=icelake-server -O3 -c code.c # 或自动检测本地CPU支持 gcc -march=native -O3 -c code.c ``` --- ### 三、验证方案 ```c // test_vpopcntq.c #include <immintrin.h> #include <stdio.h> int main() { __m512i a = _mm512_set_epi64(0xFFFFFFFFFFFFFFFF, 0, 0xFF, 0, 0x0F, 0, 0x03, 0); __m512i b = _mm512_popcnt_epi64(a); printf("%lu\n", b[0]); return 0; } ``` 编译验证: ```bash gcc -march=native test_vpopcntq.c -o test ./test # 应输出对应数值 ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

10km

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值