メモリ階層と性能

上の2つのループを1つにまとめる(ループ融合)と、Nが大きいときに速くなりやすい理由はどれか。

for (i = 0; i < N; i++) a[i] = b[i] * 2;
for (i = 0; i < N; i++) c[i] = a[i] + 1;
  1. A掛け算と足し算が1つの命令にまとまり、計算の量が半分になるから
  2. Ba[i]を書いた直後に使えるので、配列aを主記憶から読み直さずに済むから
  3. Cループの回数がN回から2N回に増え、パイプラインが埋まりやすくなるから
答えと解説を見る

正解:B. a[i]を書いた直後に使えるので、配列aを主記憶から読み直さずに済むから

別々のループのままだと、最初のループで書いたaの全体がキャッシュに入りきらない大きさのとき、2つ目のループで先頭から読み直すたびにミスが起こります。融合すると、a[i]を書いた直後に同じ繰り返しの中で使うので、データがキャッシュやレジスタにある間に再利用でき、主記憶との通信が減ります。計算の量は変わらず、ループの回数は2N回からN回に減ります。

  • A. 演算の数は変わらず、計算量は半分になりません。
  • B. 正しい。書いた直後に再利用でき、配列aの読み直しが不要になります。
  • C. ループの回数は2N回からN回に減ります。
この分野を解く 分野ページへ

メモリ階層と性能のほかの問題

  1. 大きな行列を転置する処理(b[j][i] = a[i][j])で、キャッシュのミスが多くなりやすい理由と、代表的な対策の組み合わせとして正しいものはどれか。
  2. 一般的なコンピュータの記憶階層で、上の階層(CPUに近い側)ほど成り立つ性質として正しいものはどれか。
  3. キャッシュの性能を評価するとき、ミス率だけでなく平均メモリアクセス時間で比べる必要がある理由として正しいものはどれか。
  4. 2つのプログラムを同じコアで交互に実行すると、それぞれを単独で実行するより遅くなることがある。キャッシュの観点から最も適切な説明はどれか。
  5. 時間的局所性の例として最も適切なものはどれか。