Rosetta 2 とエミュレーションを使用して Apple M1 プラットフォームで x86-64 バイナリを実行すると、パフォーマンス特性が大きく異なることに興味があります。たとえば、Docker Desktop が現在QEMUを使用して行っていることです。
エミュレーションが非常に遅い理由は理解していますが、Rosetta 2 が非常に高速である理由については、次の Twitter スレッドで詳しく説明しています: https://twitter.com/ErrataRob/status/1331735383193903104
その説明の要点は、通常の状況では、arm と x86 は反対の (そして互換性のない) メモリ アドレッシング スキームを持ち、かなりのエミュレーション オーバーヘッドを必要とするが、M1 チップは、両方のアドレッシング スキームを使用してメモリにアクセスできるようにするハードウェア最適化でこれに対処するということです。実際には、Rosetta 2 でエミュレートされた命令が実行されると、x86 スタイルのアドレス指定方式を使用するようにプロセッサに知らせるフラグが設定されます。
この説明が妥当であると仮定すると (そして、誰かが上記の Twitter スレッドよりも優れたソースのレポートを持っている場合は、コメントに含めていただければ幸いです)、この最適化を完全なハードウェア エミュレーション (x86 の実行など) に活用できることは技術的に妥当ですか? 64 個の Linux Docker コンテナ、またはVMware Fusion/VirtualBoxのように完全なx86-64 Windows デスクトップ仮想マシンを実行していますか? または、これらのシナリオではオペレーティング システム レイヤーが分離されているため、メモリ順序の最適化を利用できませんか?
これとは別に、このプロセッサ モード (フラグまたは命令) は文書化され、サードパーティの使用のために公開されていますか、それとも Apple だけに非公開ですか?