え?MacのRosetta2でAVX2が動くようになった?
前回は動かなかったんですけど、なんかソフトウェアも進化するんですね。
Intelの特許の問題じゃないかって考察もあったようですけどね。
1. 正式にはサポートしていない
出足からズッコケる話をすると、結論から先に言うと正式にはサポートはしていない。どういうことかというと各種ソフトウェアからRosettaがどのようにみえているかを確認してみたい
表向きのRosettaのサポート命令にはAVX*は無い
MacCPUID
Intelが以前公開していたIntel CPU搭載MacのCPUの機能を表示するソフト。
新規販売されているIntel CPU搭載機は無くなってしまったのでIntelのサイトからは削除されているが、手元のMacには保存されていたので確認してみた。
AVX関連が完全に未サポートとなっているのがわかる。
sysctl
続いてMac標準のAPIで機能フラグを確認する。
arch -x86_64 sysctl hw.optional を実行してみたところの出力結果(抜粋)。
hw.optional.mmx: 1
hw.optional.sse: 1
hw.optional.sse2: 1
hw.optional.sse3: 1
hw.optional.supplementalsse3: 1
hw.optional.sse4_1: 1
hw.optional.sse4_2: 1
hw.optional.x86_64: 1
hw.optional.aes: 1
hw.optional.avx1_0: 0
hw.optional.rdrand: 0
hw.optional.f16c: 0
hw.optional.enfstrg: 0
hw.optional.fma: 0
hw.optional.avx2_0: 0
hw.optional.bmi1: 0
hw.optional.bmi2: 0
hw.optional.rtm: 0
hw.optional.hle: 0
hw.optional.adx: 0
hw.optional.mpx: 0
hw.optional.sgx: 0
hw.optional.avx512f: 0
hw.optional.avx512cd: 0
hw.optional.avx512dq: 0
hw.optional.avx512bw: 0
hw.optional.avx512vl: 0
hw.optional.avx512ifma: 0
hw.optional.avx512vbmi: 0
2. サポートはされていないが動く
「だめじゃん!動かないじゃん!!」って思った人は一旦足を止めて欲しい。
どうやら正式対応をうたってはいないが、CPUIDを確認せずにAVX/AVX2を決めうちで実行するようなフローになっているプログラムでも動くようになっている、とのことである。
SFMT19937で動作検証
SIMD命令のサポートで性能が伸びるプログラムを動かしてみるのが手っ取り早いので、とりあえず動かしてみよう。
得手・不得手はあるからIntel CPUと比べてパフォーマンスがどうかの議論は今回はしない。
ARM64 NEON+SHA3
まずARMネイティブである。
32 bit BLOCK:49ms for 100000000 randoms generation
32 bit SEQUE:51ms for 100000000 randoms generation
64 bit BLOCK:49ms for 50000000 randoms generation
64 bit SEQUE:38ms for 50000000 randoms generation
x86-64/SSE2
Rosetta2が公式にサポートしているのはSSE4.2+AES+PCLMULDQまでなので当然サポート範囲内である。
ネイティブとそれほど遜色ないレベルのパフォーマンスが出ているので、RosettaのAOTコンパイル技術はそれなりに優秀と言えるのではないだろうか。
32 bit BLOCK:52ms for 100000000 randoms generation
32 bit SEQUE:77ms for 100000000 randoms generation
64 bit BLOCK:54ms for 50000000 randoms generation
64 bit SEQUE:65ms for 50000000 randoms generation
x86-64/AVX2
肝心のAVX2。動くには動くが、なんとSSE2より3倍ほど遅い。
32 bit BLOCK:183ms for 100000000 randoms generation
32 bit SEQUE:207ms for 100000000 randoms generation
64 bit BLOCK:187ms for 50000000 randoms generation
64 bit SEQUE:193ms for 50000000 randoms generation
x86-64/AVX-512
試しにAVX-512版も実行してみたがこちらは動作せず。
zsh: illegal hardware instruction ./test-avx512-M19937 -s
3. 現状の方針
CPUIDを確認しない行儀の悪いプログラムでもとりあえず落ちないようにするためにという方針なんでしょうか。AVX2のコードは動かなくはないが、置き換えた方がいいくらいには遅いので、すでにそうやっている人は、サポートフラグを見てSSE*のコードバスを実行する方針で問題はなさそう。