一体いつから ――――― クリスマス当日に26件目のアドカレを投稿しないと錯覚していた
はい、グランドフィナーレしたはずだったのですが、書き忘れですね。
■ はじめに:溶け合う世界へ
異なるCPUアーキテクチャのバイナリを動かす方法、というとどんな手段を想像しますかね?おおよそ、こんな感じだと思います。
- 力技で解釈→実行(QEMU)
- どっちのバイナリも抱える(AppleのUniversal Binary)
- バイナリを動かすときに動的変換(AppleのRosetta)
- バイナリをインストールするときに動的変換(AppleのRosetta2)
いったいどこのだれが、「アーキテクチャの過渡期?だったら、どっちのバイナリを1つに混ぜればいーじゃん」とか思いつくんですかね!!本当、Microsoftの中の人は天才です!(最大限の誉め言葉)
■ Arm64EC
Windows 11からサポートされているArm64ECという仕組みは、上記のような手段と違って「異なるコードを混ぜても動かせる」という中々トリッキーなABIである。ライブラリじゃないよ!!ABIだよ!!(ここが重要)。
▢ 従来:Arm64ECがない世界
x64形式でしか提供されないバイナリがあります。動かしたい実行環境はArm64です。
手元にはソースコードは有るので、バイナリは作れます、と。
〇Arm64でリンク
x64形式のバイナリは、Arm64のバイナリと一緒にリンクできません。
お帰り下さい、ご主人様
(冷たい)
〇x64でリンク
x64形式のバイナリは、x64のバイナリと一緒にリンクできますよ!よかったですね!じゃあ、さっそく動かしますか!!
でも、Arm64上でエミュレーションしながら動かすので、
当然ながらパフォーマンス出ません・・・![]()
つまり、どんなに小さいユーティリティなバイナリでも
x64バイナリが1つでもあったら、全滅だったわけですよ。
▢ 現代:Arm64ECのある世界
Arm64ECがあると、ちょっと世界が変わります。
〇Arm64ECでリンク
x64形式のバイナリと、Arm64EC形式のバイナリがあるんですか。 混ぜちゃいましょう!!
Arm64EC形式のところは、CPU Native相当で動かしますね!![]()
x64形式のところ、エミュレーションで動かしますね!!![]()
本当に素晴らしい発想です。もはや力技の極みです(本当にほめている)。
■ OpenCVのArm64EC対応
(おいおいOpenCVはどこ行ったんだ、と思った方もいらっしゃるかもしれませんが・・・)
さて、OpenCV 4.13.0に向けて、気合でOpenCVもArm64EC対応いれたわけですよ。16ファイル直しちゃったんですよ(なので、この記事を書いています)。
https://github.com/opencv/opencv/pull/27416
https://github.com/opencv/opencv/pull/25903
ただ、残念ながら完璧ではないのですよね・・・
追加修正があると、こんな感じでポロポロぬけることもある。
まあ、しゃーないのです。
裏を返せば、OpenCVのContributorになってみたい方!!ここがチャンスですよ!!!
さあ、ベンチマークの時間だ、ヒャッハアアーー!!!!
■ まとめ
もう、x64バイナリしかない、と性能を諦めなくてもいいのです。
もう、Arm64バイナリに統一しなきゃ動かない、と嘆かなくていいのです。
Arm64ECは全部を包み込んでくれます、ありがとう……![]()
え?パフォーマンスのボトルネックになるモジュールがx64なんだけど、どうしよっか、だって?
WRRRRRRRRYYYYYYYYYYYYYYY!!!
無ーーー駄無駄無駄無駄無駄無駄無駄無駄無駄無駄無駄ァァァァァァ!!!
そんなもの!!!Arm用にbuildしなおし一択だァァァァ!!! ![]()
失礼、取り乱しました。
でもこのバイナリ混在できる柔軟性こそが、次の進化に繋がるステップなのです。世の中、0か100かばかりじゃない。たまーには50とかもいいもんです。
以上です、ありがとうございました。