メモリ階層と性能

大きな行列を転置する処理(b[j][i] = a[i][j])で、キャッシュのミスが多くなりやすい理由と、代表的な対策の組み合わせとして正しいものはどれか。

  1. A理由は計算が多いこと。対策は浮動小数点を整数に変えること
  2. B理由は読み出しが飛び飛びになること。対策は書き込み側だけを連続にすること
  3. C理由は読みか書きの片方が列方向になること。対策はブロックごとの転置
答えと解説を見る

正解:C. 理由は読みか書きの片方が列方向になること。対策はブロックごとの転置

転置ではaを行方向に読むとbには列方向に書き、逆にbを行方向に書けばaを列方向に読むことになり、どちらかは必ず飛び飛びのアクセスになります。そこで行列をキャッシュに収まる小さなブロックに分け、ブロックの中で転置すると、読み込んだラインを使いきってから次へ進め、ミスが大きく減ります。書き込み側だけを連続にしても読み出しが飛び飛びになるだけで、根本の解決になりません。計算量の問題でもありません。

  • A. 転置はほとんど計算せず、型を変えても解決しません。
  • B. 片方を連続にしても、もう片方が飛び飛びになるだけです。
  • C. 正しい。必ず片方が列方向になるので、ブロックごとに転置します。
この分野を解く 分野ページへ

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

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