コンパイラ

ループ展開(ループアンローリング)の主な効果として正しいものはどれか。

  1. A回数の判定や分岐の手間が減り、命令も並べ替えやすくなる
  2. Bループの本体が1回分だけになり、プログラムのコードが小さくなる
  3. Cループを関数として切り出し、ほかの場所から呼び出せるようにする
答えと解説を見る

正解:A. 回数の判定や分岐の手間が減り、命令も並べ替えやすくなる

ループ展開は、ループの本体を例えば4回分並べて書き、繰り返しの回数を4分の1にする最適化です。回数の判定や分岐の命令が減るうえ、並べた本体どうしの命令を組み合わせて並べ替えられるので、演算の待ち時間を埋めやすくなります。その代わりコードは大きくなり、命令キャッシュを圧迫することもあります。本体が1回分になってコードが小さくなるのは逆の説明で、ループを関数に切り出すのは別の変換です。

  • A. 正しい。分岐などの手間が減り、命令を並べ替えやすくなります。
  • B. 本体を複数並べるので、コードはむしろ大きくなります。
  • C. 関数に切り出すのは別の変換です。
この分野を解く 分野ページへ

コンパイラのほかの問題

  1. 上のループで、ループ不変式の移動(ループの外への移動)の対象になる計算はどれか。(x、yはループ内で変更されないものとする)
  2. 上のループで、添字の計算 i * 4 に強度低減を行ったときの変換として正しいものはどれか。
  3. 上のループを、SIMD命令を使ってベクトル化しにくい主な理由はどれか。
  4. 上の関数で、コンパイラが *b の読み込みをループの外に出す最適化を、そのままでは行えない理由はどれか。
  5. コンパイラのレジスタ割り当てで、干渉グラフを塗り分ける(彩色する)方法を使うとき、グラフの節と辺が表すものの組み合わせとして正しいものはどれか。