【问题标题】:Is it possible to compile code on one CPU microarch for another (different generation of one arch)?是否可以在一个 CPU 微架构上为另一个(不同代的一个架构)编译代码?
【发布时间】:2019-11-05 06:14:15
【问题描述】:

我想使用支持 AVX 指令的 CPU 的 GCC 编译器编译 C 代码。但是我的构建机器使用不支持 AVX 的 Core Quad CPU。

我阅读了很多关于交叉编译的主题,但没有找到答案。下面是一些具体细节。

英特尔的 C 编译器可以在一个二进制文件中构建多个特定于微架构的函数版本。在运行时选择一个特定的。

Compiling codes on different systems

-xAVX -axCORE-AVX2

其中 -x 给出了编译的基线,而 -ax 是要构建的特定于功能的代码路径的列表。正如英特尔编译器文档所解释的那样:

如果编译器发现这样一个 机会,它首先检查是否生成特定于功能的 函数的版本可能会导致性能提升。如果 在这种情况下,编译器会同时生成一个特定于功能的 函数的版本和函数的基线版本。运行时 时间,选择执行其中一个版本,具体取决于 英特尔(R) 处理器正在使用中。通过这种方式,程序可以受益于 更先进的英特尔处理器的性能提升,同时仍然 在旧处理器和非英特尔处理器上正常工作。一种 非英特尔处理器始终执行基线代码路径。

这是否意味着英特尔的 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 编译器可以解决这个问题吗?

【问题讨论】:

  • configure: error: cannot run test program while cross compile — 好吧,你期待什么?您不应该在主机上执行交叉编译的配置测试程序。您要么在目标(或模拟器)上执行它们,要么根本不执行它们。 -march/-mcpu 是您想要的选项(其中一个就足够了);至少在你得到它之前不要打扰-mtune
  • @phuclv 感谢您提供的信息。我会仔细阅读的。
  • @VladislavIvanishin 我知道我不能为另一个微架构运行二进制文件。所以,我希望得到在 Core Quad CPU 上编译并包含 AVX 指令的二进制文件。我不会在 Core Quad CPU 上运行编译后的二进制文件。
  • 但是这个配置脚本显然是在尝试运行这些二进制文件,不是吗?无论如何,这就是错误消息所说的。为什么脚本这样做是另一个问题(似乎它知道您正在交叉编译)。我建议从 config.log 挖掘测试并尝试了解那里发生了什么。

标签: gcc configure icc


【解决方案1】:

问题不清楚。问题主要属于configure 脚本。当我将--host=x86_64-pc-linux-gnu 传递给configure 脚本时,它启用了交叉编译模式,并且没有运行任何AC_TRY_RUN 指令。

编译成功后,我反汇编了输出二进制文件,发现了 AVX 指令和寄存器。

所以我认为多版本函数是在 GCC 4.8 中引入的。它是通过__attribute__ 预处理器指令的设备。感谢@phuclv 提供有关 GCC 的信息!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-09-24
    • 2016-03-29
    • 1970-01-01
    • 1970-01-01
    • 2011-10-28
    • 2012-12-26
    • 1970-01-01
    相关资源
    最近更新 更多