マルチプロセッサ対応
出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2021/11/12 07:32 UTC 版)
「NEC SX」の記事における「マルチプロセッサ対応」の解説
※この「マルチプロセッサ対応」の解説は、「NEC SX」の解説の一部です。
「マルチプロセッサ対応」を含む「NEC SX」の記事については、「NEC SX」の概要を参照ください。
マルチプロセッサ対応
出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2020/11/19 08:15 UTC 版)
マルチプロセッサをサポートするにあたって、重要な点のひとつはキャッシュコヒーレンシである。R4000MC/R4400MCでは、スヌープ方式が採用されており、無効型(MESI)プロトコルも更新型(MOESI)プロトコルも選択できるようになっている(MESIプロトコル参照)。 もうひとつ、マルチプロセッサで重要となるのは、並行して動作するスレッド間の同期をとる機構である。MIPSでは以下のふたつの機構で同期をとる。 sync命令 はメモリアクセスの順序性を保証する。たとえば、あるデータを更新したら、更新完了を示すフラグを立てるとする。その順番がTLBやキャッシュの状態に左右されて期待した順番にならないと更新していないものが更新されたように他のプロセッサから見えてしまう。これを防ぐのがsync命令である。まず、プロセッサXが次のようなコードを実行する。 sw t3, DT1 li t4, 1 sync sw t4, FL1 ここで、DT1が更新されたことをFL1で示す。一方プロセッサYは次のようなコードを実行する。 loop: lw t5, FL1 beq t2, zero, loop nop sync lw t6, DT1 これによって順序性を保つ。sync命令はマルチプロセッサでない場合でも、I/Oデバイスへの書き込み(通常キャッシュを使用しないが、プロセッサ内にストアバッファがあるので命令が完了しても書き込まれていないことがある)の完了を保証する目的で使うことができる。 ll/sc命令 ll命令(load linked)はロード命令として動作するが、その際にロードアドレスをCP0のレジスタ LLAddr に格納しておく。その後でロードした内容に変更を加え、sc命令(store conditional)で元のアドレスに書き込む。ただし、sc命令は以下のように動作する。 まずLLAddrに格納されているアドレスとストアしようとしているアドレスが同じかどうかチェックする。違う場合は失敗したとしてストア元のレジスタに 0 を格納して終了する。 次に該当するキャッシュラインの状態をチェックする。これによって他のプロセッサがそのキャッシュラインに該当するメモリアドレスに書き込みを行ったかどうかがわかるので、もし書き込まれていたら失敗したと判断して、ストア元のレジスタに 0 を格納して終了する。 成功すれば、メモリに書き込みを行ってストア元のレジスタに 0 以外を書き込んで終了する。 なお、LLAddr は例外が発生した場合もクリアされる。これを使うと、単純なスピンロックも、リーダー・ライターロックも実現可能である。スピンロックのコードは以下のようになる。 Loop: ll t2, (t1) ; t1 の指すアドレスからロックワードを読み込む(0:未ロック 1:ロック済み) ori t3, t2, 1 ; 1 を立てる beq t3, t2, Loop ; 1 が元から立っている場合はスピンする nop sc t3, (t1) ; 書き戻す beq t3, zero, Loop ; じゃまが入った場合は最初からやり直し nop
※この「マルチプロセッサ対応」の解説は、「R4000」の解説の一部です。
「マルチプロセッサ対応」を含む「R4000」の記事については、「R4000」の概要を参照ください。
- マルチプロセッサ対応のページへのリンク