toge's diary

コンピュータ関連の趣味をつらつらと。

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つけておけば良さそう。