1

異なるプロセッサ間で単一のスレッドをスケジュールする場合、毎回キャッシュをクリアする必要がありますか? キャッシュがクリアされていない場合、次のことが起こりません。

次の (疑似) コードを 2 つのプロセッサ P1 と P2 で実行するとします。

     1. foo() {
     2. int x=5;
     3. x=10;
     4. print x;
     5. }

最初に、スレッドは P1 でスケジュールされ、行 1 と 2 が実行され、x のメモリ位置 (スタック上) のキャッシュに 5 が格納されます。

次に、スレッドは、行 3 を実行する P2 でスケジュールされ、x のメモリ位置のキャッシュに10を格納します。

最後に、スレッドは再び P1 でスケジュールされ、4 行目を実行すると、5 (P1 のキャッシュ内の x の値) が出力されます。

それでも、明らかに 10 が印刷されることを期待しています。

4

1 に答える 1

1

はい、プロセッサのキャッシュ/レジスタを更新するか、少なくともメインメモリにフラッシュする必要があります。これにより、スレッドが別のコア/プロセッサに移行した場合に、スレッドが最新のメモリに到達できるようになります。

幸いなことに、私たちが通常コードを記述する一般的なサーバー/デスクトップ プラットフォームはキャッシュ コヒーレントであるため、ハードウェアがすべての魔法を処理してこれを正しく機能させ、オペレーティング システムはスレッド/プロセスに適切なメモリが割り当てられるようにする必要があります。オペレーティング システムがそのスレッドの実行を決定した場所ならどこでも使用できます。これは、アプリケーション コードが考慮する必要があるタスクではありません。

キャッシュコヒーレントではないプラットフォームを使用している場合は、おそらく知っているでしょう。OS がスレッドを別のプロセッサ。

于 2012-12-07T19:25:27.497 に答える