1. ホーム
  2. アセンブリ

[解決済み】マルチコアアセンブラとはどのようなものですか?

2022-04-02 14:36:42

質問

昔々、x86アセンブラを書く場合、例えば「EDXレジスタに値5をロードする」「EDXレジスタをインクリメントする」等の命令を書いていました。

最近のCPUは4コア(あるいはそれ以上)ありますが、マシンコードレベルでは4つのCPUがあるように見えるのでしょうか(つまり、4つの異なるquot;EDX"レジスタがあるだけでしょうか)。 その場合、「EDXレジスタをインクリメントする」というとき、どのCPUのEDXレジスタがインクリメントされるかは何で決まるのでしょうか?今のx86アセンブラには、quot;CPU context"やquot;thread"という概念はあるのでしょうか?

コア間の通信・同期はどのように行われるのですか?

もしあなたがオペレーティングシステムを書くとしたら、異なるコアでの実行をスケジュールするために、ハードウェアを介してどのようなメカニズムが公開されていますか?それは何か特別な命令なのでしょうか?

マルチコアCPUのための最適化コンパイラ/バイトコードVMを書くとしたら、すべてのコアで効率的に動作するコードを生成するために、例えばx86について特に何を知る必要があるでしょうか?

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

解決方法は?

これは質問に対する直接的な答えではありませんが、コメントに出てくる質問に対する答えです。 本質的には、ハードウェアがマルチスレッド操作にどのようなサポートを与えるかという質問です。

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

この仕組みにより、各スレッドは異なるアドレスからコードを実行することができる。 必要なのは、各スレッドが独自のテーブルとメッセージングキューをセットアップするためのソフトウェアサポートだけです。 OSは それら で、実際のマルチスレッドスケジューリングを行います。

実際のアセンブリに関しては、Nicholasが書いているように、シングルスレッドでもマルチスレッドでも違いはないです。論理的なスレッドはそれぞれ独自のレジスタセットを持つので、書き込みも。

mov edx, 0

が更新されるのは EDX に対して 現在実行中のスレッド . を変更する方法はありません。 EDX を別のプロセッサで使用する場合、1つのアセンブリ命令を使用します。 ある種のシステムコールを使って、OS が他のスレッドに、自分自身の EDX .