C言語で以下のような2次元配列から2次元配列へ要素をコピーする関数があるとします
c
1typedef int array[2][2]; 2 3void copy_arr(array A, array B){ 4 int i, j; 5 6 for(i=0; i<2; ++i){ 7 for(j=0; j<2; ++j){ 8 A[j][i] = B[i][j]; 9 } 10 } 11}
もし
- キャッシュが1ブロックサイズ=8バイトで合計容量16バイトまで
- sizeof(int)が4バイト
- キャッシュがダイレクトマップ方式で最初は空
- Bがアドレス0から始まってAがアドレス16から始まる
とした場合ですが、
-
キャッシュに
B[i][j]
が無い(ミス
)ので、Bの配列を全てキャッシュに格納(容量が16バイトまでなのでキャッシュはBの要素で埋まる)した後にB[i][j]
を読み込む -
キャッシュに
A[j][i]
が無い(ミス
)ので、Aの配列を全てキャッシュに格納(容量が16バイトまでなのでキャッシュはAの要素で埋まる)した後にA[j][i]
を読み込む -
キャッシュに
B[i][j+1]
が無い(ミス
)ので、Bの配列を全てキャッシュに格納(容量が16バイトまでなのでキャッシュはBの要素で埋まる)した後にB[i][j+1]
を読み込む
4.キャッシュにA[j+1][i]
が無い(ミス
)ので、Aの配列を全てキャッシュに格納(容量が16バイトまでなのでキャッシュはAの要素で埋まる)した後にA[j+1][i]
を読み込む
(以下(8)まで同じ要領でミスが続く)
となりミス率は100% (ヒット率は0%) だと思っていたのですが教科書によるとB[1][1]をコピーする時唯一ヒット
となると書いてありました。これはなぜなのでしょうか…?
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。