为什么march=native不能在Apple M1上工作?



每当我尝试在带有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

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

$ 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的最佳选择。

在Clang 15中,-march=native现在存在于Apple M1中(我个人使用它)。

据我所知,这不是Apple M1特有的,它也发生在各种其他体系结构(主要是各种其他arm处理器)的clang中。参见此bug报告https://github.com/DMOJ/judge-server/issues/303

基本上,对于一个新体系结构,clang的每个构建都必须选择提供默认值"march=native"对于编译器是否为其构建的目标;如果没有,那么你会看到这个错误消息。即使对于那些确实有优化目标的手臂处理器,你也经常必须专门使用"-mcpu=xxx"而不是"-march"

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

然而,Apple M1还没有实现这样的目标

另一个解决方案是用brew更新clang

lang: error: clang编译器不支持'-march=native'

1°-安装llvm con brew

brew install llvm

2°-检查clang版本

cd /opt/homebrew/opt/llvm
.clang --version

结果:

Homebrew clang version 15.0.6
Target: arm64-apple-darwin22.2.0
Thread model: posix
InstalledDir: /opt/homebrew/opt/llvm/bin

3°-使用新版本修改路径,例如添加到。zshrc

export PATH="/opt/homebrew/opt/llvm/bin:$PATH"

最新更新