termuxのclangで最適化
termuxでコンパイルする場合、 「とにかくホスト上で最適化して動けばいいんだよ」 といつも思っています。 というかC++でコンパイルする時は大抵そう思ってる、貧乏性です。 「必要になったらそのCPU用にコンパイルすればいいでしょ?」という適当な考え方です。
「termuxのclangで何を指定すればいいんだろうか?」という疑問に関するメモです。
無指定
echo | clang++ -E -v -
の結果を整形
-cc1 -triple aarch64-unknown-linux-android24 -disable-free -disable-llvm-verifier -discard-value-names -main-file-name - -mrelocation-model pic -pic-level 2 -pic-is-pie -mframe-pointer=non-leaf -fno-rounding-math -mconstructor-aliases -target-cpu generic -target-feature +neon -target-abi aapcs -mllvm -aarch64-fix-cortex-a53-835769=1 -fallow-half-arguments-and-returns -fno-split-dwarf-inlining -debugger-tuning=gdb -ferror-limit 19 -fno-signed-char -fgnuc-version=4.2.1 -fcolor-diagnostics
-target-feature +neon
が指定されているけれど、これは使われているのかなぁ。
neon勉強しないと分からない。
-O3
いつものやつ。
echo | clang++ -E -v -O3 -
を整形。
-cc1 -triple aarch64-unknown-linux-android24 -disable-free -disable-llvm-verifier -discard-value-names -main-file-name - -mrelocation-model pic -pic-level 2 -pic-is-pie -mframe-pointer=non-leaf -fno-rounding-math -mconstructor-aliases -target-cpu generic -target-feature +neon -target-abi aapcs -mllvm -aarch64-fix-cortex-a53-835769=1 -fallow-half-arguments-and-returns -fno-split-dwarf-inlining -debugger-tuning=gdb -O3 -ferror-limit 19 -fno-signed-char -fgnuc-version=4.2.1 -fcolor-diagnostics -vectorize-loops -vectorize-slp
うん、いつものO3な気がする。
-O3 -march=natvie
> echo | clang++ -E -v -O3 -march=native - clang version 11.0.0 (https://github.com/termux/termux-packages 39dec01e591687a324c84205de6c9713165c4802) Target: aarch64-unknown-linux-android24 Thread model: posix InstalledDir: /data/data/com.termux/files/usr/bin clang-11: error: the clang compiler does not support '-march=native'
x86_64と違って-march=natvieという指定に対応していない・・・。
-O3 -mtune=native
echo | clang++ -E -v -O3 -mtune=native -
を整形。
-cc1 -triple aarch64-unknown-linux-android24 -disable-free -disable-llvm-verifier -discard-value-names -main-file-name - -mrelocation-model pic -pic-level 2 -pic-is-pie -mframe-pointer=non-leaf -fno-rounding-math -mconstructor-aliases -target-cpu generic -target-feature +neon -target-abi aapcs -mllvm -aarch64-fix-cortex-a53-835769=1 -fallow-half-arguments-and-returns -fno-split-dwarf-inlining -debugger-tuning=gdb -O3 -ferror-limit 19 -fno-signed-char -fgnuc-version=4.2.1 -fcolor-diagnostics -vectorize-loops -vectorize-slp
まだmtuneが生きている。だけど-O3
と変わらない?
-O3 -mcpu=native
echo | clang++ -E -v -O3 -mtune=native -
を整形。
-cc1 -triple aarch64-unknown-linux-android24 -disable-free -disable-llvm-verifier -discard-value-names -main-file-name - -mrelocation-model pic -pic-level 2 -pic-is-pie -mframe-pointer=non-leaf -fno-rounding-math -mconstructor-aliases -target-cpu cortex-a73 -target-feature +fp-armv8 -target-feature +neon -target-feature +crc -target-feature +crypto -target-feature +sha2 -target-feature +aes -target-abi aapcs -mllvm -aarch64-fix-cortex-a53-835769=1 -fallow-half-arguments-and-returns -fno-split-dwarf-inlining -debugger-tuning=gdb -O3 -ferror-limit 19 -fno-signed-char -fgnuc-version=4.2.1 -fcolor-diagnostics -vectorize-loops -vectorize-slp
target-cpuがcortex-a73になり、target-featureに色々ついてますね。
この記事がまだ有効みたいで、x86_64ではもう使われない-mcpuがarmでは有効と。 stackoverflow.com
結論?
aarch64でclang使う時は-mcpu=nativeつけておけば良さそう。