0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

macOS SequoiaのRosetta 2でAVX2が動くらしい件

Last updated at Posted at 2025-05-24

え?MacのRosetta2でAVX2が動くようになった?

前回は動かなかったんですけど、なんかソフトウェアも進化するんですね。
Intelの特許の問題じゃないかって考察もあったようですけどね。

1. 正式にはサポートしていない

出足からズッコケる話をすると、結論から先に言うと正式にはサポートはしていない。どういうことかというと各種ソフトウェアからRosettaがどのようにみえているかを確認してみたい

表向きのRosettaのサポート命令にはAVX*は無い

MacCPUID

Intelが以前公開していたIntel CPU搭載MacのCPUの機能を表示するソフト。
新規販売されているIntel CPU搭載機は無くなってしまったのでIntelのサイトからは削除されているが、手元のMacには保存されていたので確認してみた。

image.png

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*のコードバスを実行する方針で問題はなさそう。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?