マルチコアアセンブリ言語とはどのようなものですか? 質問する

マルチコアアセンブリ言語とはどのようなものですか? 質問する

かつて、たとえば x86 アセンブラを書くには、「EDX レジスタに値 5 をロードする」、「EDX レジスタを増分する」などの命令が必要でした。

4 つのコア (またはそれ以上) を持つ最新の CPU では、マシン コード レベルでは 4 つの別々の CPU があるように見えますか (つまり、4 つの異なる「EDX」レジスタがあるだけですか)? もしそうなら、「EDX レジスタを増分する」と言うとき、どの CPU の EDX レジスタが増分されるかを決定するのは何ですか? 現在、x86 アセンブラには「CPU コンテキスト」または「スレッド」の概念がありますか?

コア間の通信/同期はどのように機能しますか?

オペレーティング システムを作成する場合、異なるコアでの実行をスケジュールできるようにするために、ハードウェアを介してどのようなメカニズムが公開されますか? それは特別な特権命令ですか?

マルチコア CPU 用の最適化コンパイラ/バイトコード VM を作成する場合、すべてのコアで効率的に実行されるコードを生成するには、たとえば x86 について具体的に何を知っておく必要があるでしょうか?

マルチコア機能をサポートするために x86 マシン コードにどのような変更が加えられましたか?

ベストアンサー1

これは質問への直接的な回答ではありませんが、コメントに表示された質問への回答です。基本的に、質問はハードウェアがマルチコア操作、つまりソフトウェアによるコンテキスト切り替えなしで複数のソフトウェアスレッドを実際に同時に実行する機能にどのようなサポートを提供するかということです。(SMPシステム)。

ニコラス・フリントは正しかった、少なくとも x86 に関してはそうです。マルチコア環境 (ハイパースレッディング、マルチコア、またはマルチプロセッサ) では、ブートストラップ コア(通常はプロセッサ 0 のコア 0 のハードウェア スレッド (別名論理コア) 0) がアドレス からコードのフェッチを開始します0xfffffff0。他のすべてのコア (ハードウェア スレッド) は、Wait-for-SIPIと呼ばれる特別なスリープ状態で起動します。初期化の一環として、プライマリ コアは、WFS にある各コアに、APIC 経由で SIPI (Startup IPI) と呼ばれる特別なプロセッサ間割り込み (IPI) を送信します。SIPI には、そのコアがコードのフェッチを開始するアドレスが含まれています。

このメカニズムにより、各コアは異なるアドレスからコードを実行できます。必要なのは、各ハードウェア コアが独自のテーブルとメッセージ キューを設定するためのソフトウェア サポートだけです。

OS はこれらを使用して、ソフトウェア タスクの実際のマルチスレッド スケジューリングを実行します。(通常の OS は、仮想マシンなどで CPU をホットプラグしない限り、起動時に他のコアを 1 回だけ起動する必要があります。これは、それらのコアへのソフトウェア スレッドの開始または移行とは別です。各コアはカーネルを実行しており、カーネルは他に実行する処理がない場合、割り込みを待機するためにスリープ関数を呼び出すことに時間を費やします。)

実際のアセンブリに関しては、Nicholas が書いたように、シングル スレッド アプリケーションとマルチ スレッド アプリケーションのアセンブリに違いはありません。各コアには独自のレジスタ セット (実行コンテキスト) があるため、次のように記述します。

mov edx, 0

現在実行中のスレッドEDXのみが更新されます。単一のアセンブリ命令を使用して別のプロセッサ上で変更する方法はありません。別のスレッドに独自のを更新するコードを実行するように OS に指示するには、何らかのシステム コールが必要です。EDXEDX

おすすめ記事