我想使用GCC编译器为支持AVX指令的CPU编译C代码。但是我的构建机器使用不支持AVX的Core Quad CPU。
我阅读了很多有关交叉编译的主题,但没有找到答案。下面是一些具体细节。
英特尔公司的C编译器可以在一个二进制文件中构建多个微体系结构特定版本的函数。在运行时选择一个特定的对象。
Compiling codes on different systems:
-xAVX -axCORE-AVX2
其中-x给出了编译的基准,而-ax是要构建的特定于功能的代码路径的列表。如英特尔编译器文档所述:
如果编译器发现这样的 机会,它首先检查是否生成特定于功能的 函数的版本可能会导致性能提高。如果 在这种情况下,编译器会同时生成特定于功能的 功能的版本和功能的基准版本。在运行 时间,根据版本,选择其中一个版本执行 使用的英特尔(R)处理器。这样,程序可以从 仍然可以在更先进的英特尔处理器上获得性能提升 在较旧的处理器和非Intel处理器上正常工作。一种 非英特尔处理器始终执行基准代码路径。
这是否意味着英特尔C编译器将Microarch特定指令放入一个功能版本中,而不将这些指令放入另一功能版本中?
GCC编译器不以这种方式支持多微体系结构(摘自上链接):
GCC编译器不支持多个代码路径,因此 “通用”优化的二进制文件是不可能的。这里-march给出了 基准并-mtune处理器进行调整,同时尊重 基线指令集
-march = corei7-avx -mtune = core-avx2
这意味着“使用SandyBridge处理器可用的功能 调整代码,以使其在Haswell处理器上最佳运行。” 这样的优化将无法利用FMA 说明,因为它们不在基线上。
这意味着GCC编译器不会为目标优化微体系结构添加新指令。不是吗?
回到任务。对于Intel编译器,我可以将基本微架构设置为Core Quad(-x
),并为最近的微架构设置优化(-ax
)。应该工作。我还没有测试过它。
但是我该如何处理GCC编译器?它没有为目标优化微体系结构(-mtune
)设置新指令。如果我设置了基本的微拱(-march
),那么configure
将提供下一条消息:
configure: error: cannot run test program while cross compiling
是否可以使用GCC编译器解决此任务?
答案 0 :(得分:0)
问题尚不清楚。问题主要属于configure
脚本。当我将--host=x86_64-pc-linux-gnu
传递给configure
脚本时,它启用了交叉编译模式,并且没有运行任何AC_TRY_RUN
指令。
编译成功后,我反汇编了输出二进制文件,并找到了AVX指令和寄存器。
因此,我将考虑在GCC 4.8中引入了多版本功能。它是通过__attribute__
预处理程序指令提供的设备。感谢@phuclv提供有关GCC的信息!