for I := 1 to 1024 do
for J := 1 to 1024 do
A[J,I] := A[J,I] * B[I,J]
与えられたコードについて、次の仮定の下で、ディスクとメイン メモリの間で転送されるページ数を数えたいと思います。
- ページサイズ = 512 ワード
- メイン メモリに格納できるページ数は 256 ページまで
- LRU 置換戦略
- すべての 2 次元配列のサイズ (1:1024、1:1024)
- 各配列要素は 1 ワードを占有します
- 2 次元配列は行優先順にメイン メモリにマップされます。
私は解決策を与えられました、そして私の質問はそれから生じます:
A[J,I] := A[J,I] * B[I,J]
writeA := readA * readB
J ループごとに変更される 2 つの転送と、I ループごとにのみ変更される 1 つの転送があることに注意してください。
1024 * (8 + 1024 * (1 + 1)) = 2105344 回の転送
したがって、B の行全体が使用されるたびに読み取られるため、行全体が転送済み (8 ページ) としてカウントされます。ただし、転送時に各 A 行の一部 (1 つの値) のみを読み取るため、毎回 1 ページのみを取得します。
私が理解しようとしているのは、B を読み取るたびに 8 ページが転送され、A の読み取りと書き込みごとに 1 回だけ転送されるようにするにはどうすればよいかということです。