编译AVX2程序

时间:2014-12-24 14:37:11

标签: c gcc avx 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内在函数的完美方法是什么

2 个答案:

答案 0 :(得分:4)

如果你告诉gcc使用AVX2,它会这样做,无论你的CPU是否支持它们。这对于交叉编译或检查gcc的代码生成非常有用,但对于运行程序并不是特别有用。如果您的程序因非法指令异常而崩溃,则很可能是您的CPU不支持AVX2扩展。

在i386和x86-64平台上(以及某些其他情况下),您可以指定gcc选项-march=native以生成主机指令代码的代码。编译后的代码可能无法在具有较少功能的其他计算机上运行,​​但它应该允许您使用计算机的所有功能。

尽管-march=native是生成可执行文件的一个很好的解决方案,但它对编写代码实际上并没有多大帮助。你仍然需要为目标体系结构定制内部函数,编写可以利用CPU功能而不依赖于它们的代码变得复杂。我不知道一个好的C解决方案,但有几个C ++模板框架可用。

答案 1 :(得分:-1)

在AVX512中可能会升级到gcc 4.8,因此您需要将所生成的instr混合限制为仅适用于您的机器的AVX2。