我已经编写了一个具有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内部函数的完美方法是什么?
如果您告诉gcc使用AVX2,它将这样做,无论您的CPU是否支持它们。这对于交叉编译或检查gcc的代码生成很有用,但是对于运行程序并不是特别有用。如果您的程序因非法指令异常而崩溃,则很可能您的CPU不支持AVX2扩展。
在i386和x86-64平台上(以及在某些其他情况下),您可以指定gcc选项-march=native
为主机指令代码生成代码。编译后的代码可能无法在功能较少的另一台计算机上运行,但应允许您使用计算机的所有功能。
虽然这-march=native
是生成可执行文件的好方法,但实际上对编写代码并没有多大帮助。您仍然需要为目标的体系结构定制内在函数,并且编写可以利用CPU功能而不依赖于它们的代码变得很复杂。我不知道一个好的C解决方案,但是有几种C ++模板框架可用。