为啥 March=native 在 Apple M1 上不起作用?

Posted

技术标签:

【中文标题】为啥 March=native 在 Apple M1 上不起作用?【英文标题】:Why does march=native not work on Apple M1?为什么 March=native 在 Apple M1 上不起作用? 【发布时间】:2021-01-30 10:35:31 【问题描述】:

每当我尝试在带有 M1 芯片的 Macbook 上使用 march=native 编译任何 C++ 程序时,使用 clang 时都会出现以下错误:

clang: error: the clang compiler does not support '-march=native'

但是,它曾经可以在配备 Intel CPU 的旧款 Macbook 上运行。 clang 不支持这种架构吗(还)?

clang --version 给出:

Apple clang version 12.0.0 (clang-1200.0.32.29)
Target: arm64-apple-darwin20.2.0

【问题讨论】:

当你说它曾经在旧款 MacBook 上工作时,它是同一个版本的 Clang 吗? clang --version 在这两个系统上说什么? 【参考方案1】:
$ clang --print-supported-cpus
Apple clang version 12.0.5 (clang-1205.0.22.9)
Target: arm64-apple-darwin20.5.0
Thread model: posix
InstalledDir: /Library/Developer/CommandLineTools/usr/bin
Available CPUs for this target:

    a64fx
    apple-a10
    apple-a11
    apple-a12
    apple-a13
    apple-a14
    apple-a7
    apple-a8
    apple-a9
    apple-latest
    apple-s4
    apple-s5
    carmel
    cortex-a34
    cortex-a35
    cortex-a53
    cortex-a55
    cortex-a57
    cortex-a65
    cortex-a65ae
    cortex-a72
    cortex-a73
    cortex-a75
    cortex-a76
    cortex-a76ae
    cortex-a77
    cortex-a78
    cortex-x1
    cyclone
    exynos-m3
    exynos-m4
    exynos-m5
    falkor
    generic
    kryo
    lightning
    neoverse-e1
    neoverse-n1
    saphira
    thunderx
    thunderx2t99
    thunderx3t110
    thunderxt81
    thunderxt83
    thunderxt88
    tsv110
    vortex

-mcpu=apple-a14 可能是 M1 的最佳选择。

【讨论】:

根据最新的llvm定义,apple-m1和apple-a14的定义是一样的。如果您的系统尚未为 apple-m1 定义 cpu 名称,但为 apple-a14 定义了 cpu 名称,则 4 月的此定义更新确认了 Guanyang 的答案是我撰写此评论时最好的答案。见:github.com/llvm/llvm-project/blob/main/llvm/include/llvm/…【参考方案2】:

据我所知,这不是 Apple M1 特定的,它也发生在各种其他架构(主要是各种其他 arm 处理器)的 clang 中。 例如在此处查看此错误报告https://github.com/DMOJ/judge-server/issues/303

基本上,新架构的每个 clang 构建都必须选择为编译器构建的目标提供默认值“march=native”;如果没有,那么您将看到此错误消息。即使对于那些确实有优化目标的 arm 处理器,您也经常必须专门使用“-mcpu=xxx”而不是“-march”。

例如对于 iphone,您可以使用 -mcpu=apple-a11 -mcpu=apple-a12 等。

但是Apple M1 还没有实现这样的目标

【讨论】:

我可以强制使用非native 选项吗? @HenryMazza 当然,你可以通过例如-mcpu=apple-a11 即使您在 M1 上编译,这也会生成未优化(或可能甚至可能无法在)您的“本机”目标上运行的代码,而是针对 a11。就这一点而言,目前针对 M1 优化的最佳标志(鉴于 clang 还没有 M1 特定目标)可能是最接近 ipad 或 iphone 产品的目标之一。 撰写本文时最接近的选项是 -mcpu=lightning,它针对 A13 进行了优化,使编译器能够访问 ARMv8.4-A 指令。【参考方案3】:

在 Apple clang 版本 13.0.0 中,-mcpu=apple-m1 现在可用。

【讨论】:

您从何处获得此信息?它不适用于 Apple clang 版本 13.0.0,错误:“clang:错误:clang 编译器不支持 '-march=apple-m1'”(基础)构建 % clang --version Apple clang 版本 13.0 .0 (clang-1300.0.29.3) 目标:arm64-apple-darwin21.1.0 @SevenDays 我的回答是“-mcpu”而不是“-march”。它提供了想要的功能。这些信息的来源是我自己使用的。您还可以通过运行“clang --print-supported-cpus”进行验证。 谢谢!似乎新选项对 macbook m1 进行了更优化,并且在我使用 mcpu 选项重新编译后,我的 mac 工作更安静

以上是关于为啥 March=native 在 Apple M1 上不起作用?的主要内容,如果未能解决你的问题,请参考以下文章

如何查看哪些标志 -march=native 将激活?

相当于其他编译器中的 gcc/clang 的 March=native?

为啥我的 Ray March 片段着色器反射纹理查找会减慢我的帧速率?

[BZOJ]3514: Codechef MARCH14 GERALD07加强版

BZOJ3514 Codechef MARCH14 GERALD07加强版

[BZOJ3514]Codechef MARCH14 GERALD07加强版