我用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 :(得分: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。