問題タブ [rosetta-2]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
assembly - M1 上の他の x86-64 エミュレーターが、Rosetta 2 で使用されているのと同じ最適化を利用することは可能ですか?
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 だけに非公開ですか?
macos - Rosetta 2 で実行されている x86_64 プロセスでシステム クロックの真の値を raw ティック (つまり、mach_absolute_time) で取得する方法は?
ライブラリの依存関係が x86-64 のみであるため、現在ユニバーサル バイナリとしてコンパイルできない macOS x86-64 アプリケーションを作成しています。
このアプリは、Apple Silicon mac で arm64 として実行されている他のプロセスとやり取りする必要があり、その際、 によって返されるように、生のティックでシステム クロックの値を取得する必要がありますmach_absolute_time()
。
ただし、Apple Silicon mac ではmach_absolute_time()
、ネイティブの arm64 アプリから呼び出された場合と、Rosetta 2 の x86-64 アプリから呼び出された場合とで動作が異なります。
Intel Mac ではmach_absolute_time()
、システム クロックをナノ秒単位でmach_timebase_info()
返し、ナノ秒とクロック ティックの 1:1 の比率を返します。
Apple Silicon mac では、システム クロックの単位がナノ秒ではなくなったためmach_timebase_info()
、1:1 の比率が返されません。(私の M1 Mac Mini では、比率は 125:3 です。)
ただし、Rosetta 2 で実行されている x86-64 アプリは、Intel プロセッサで取得したのと同じ値を取得します。これは 1:1 の比率でmach_absolute_time()
、ナノ秒単位で値を返します。
mach_absolute_time()
x86-64 アプリが arm64 プロセスから呼び出されたかのように実際の値を取得する必要があるため、これは私にとって問題です。
これまでのところ、私はこれを行う方法を見つけていません。私が知っているすべての時計関連の関数は、Rosetta 2 で呼び出されたときに「偽の」値を返します。私が考えることができる唯一の解決策は、ユニバーサル バイナリである実行可能ファイルをアプリにバンドルし、アプリから呼び出して、それを取得することです。 arm64 としてネイティブに実行されているタイムベース情報を取得し、値を返します。しかし、それは私が望むよりもかなり重い解決策です.
Rosetta 2 で実行されている x86-64 アプリで実際のシステム クロックのタイムベースを取得する方法はありますか?