Index
/
Reload
Edit on
2006-08-11
このコメントを修正します。
内容を修正した後で投稿時のパスワードを入力してください。
現在、コメントを削除する機能がありません。
コメントを削除したい場合には、 コメント欄を空欄にしておいてください (管理人が後で削除します)。
お名前:
E-mail or URL:
Password:
コメント:
まずプログラム例を示した方がよいようですね。 > これについては、命令列を少し変形して、 > 1: STORE [X] = 1 > 2: LOAD r1 = [X] > 3: if r1 == 1 { LOAD r2 = [Y] } > のようにしてみては、どうでしょう。 > Global visibility order が 3. load [Y] → 1. store [X] → 2. load [X] にはなり得ないことがはっきりするんじゃないかと思います。 制御依存を入れてしまうと、元のプログラムとは別のものになると思います。 少し複雑ですが、下の例を見てください。 [Sync1]、[Sync2]、[X]、[Y] という異なる 4 つのメモリ位置があり、初期状態で全て 0 とします。 Processor1: 1: STORE [Sync1] = 1 2: STORE [Sync2] = 1 3: STORE [X] = 1 4: LOAD r1 = [X] 5: LOAD r2 = [Y] Processor2: 6: STORE [Y] = 1 7: MEMBAR 8: LOAD r3 = [Sync1] 9: LOAD r4 = [Sync2] ここで r3 = 1 で r4 = 0 となるにも関わらず、r1 = 1 が r2 = 0 となるパターンが考えられます。 プロセッサ1 で 1:〜3: の store が全て store buffer で待機させられ、4:〜5: の load が追い抜いた場合です。4: は store fowarding を 5: はメモりからデータの供給を受けるとします。 プロセッサ2 からこの状態を観察して、プロセッサ1の中で何が起こっているのかを考えます。 自分が r3 = 1,r4 = 0 というデータを受け取ったとすると、1: の STORE の結果は global visiable になっており、2: 4: はまだだと推測されます。 r2 が 0 ですので、5: load は 6: の store よりも先に visible になったことが確認できます。この結果から 5: が(少なくとも) 2: 3: を追い越したことが分かります。 一方、3: で書き込まれるべき [X]=1 の値は、まだ global visible になっていません (プロセッサ2が 9: で [Sync2] = 0 を確認しているから)。そのため、プロセッサ2から見れば 5: が「実行」されたのは 2: よりも後の事象に見えます。 まとめると r1 = 1, r2 = 0, r3 = 1, r4 = 0 という結果をプロセッサ2 からみると、4: LOAD は 2: よりも後で、5: LOAD は 2: よりも先に実行されたように見えます。4: と 5: の load 間の逆転が起こっているように見えませんか?
Powered by
くっつき BBS