ソフトⅡコース担当 ブログのおにーさまこと高橋です。
今回は基本情報技術者試験の問2解説です。問題は、IPAのサイトに掲載されています。そちらを参照してください。
問2は、コンパイラが行う最適化の問題です。最適化には問題の表1に示された方法があります。
設問1
表2の最適化の例との対応は次のようになります。
- 最適化の方法①は、共通部分式の削除です。繰り返し内に、「m+n」がy[i]+m+nとw[i]+m+nの2箇所にあります。この2式の間でmとnへの代入はないので、値は変化しません。そこで、あらかじめ変数tにm+nの値を設定し、2式に用いています。
- 最適化の方法②は、ループ内不変式の移動です。繰り返し内でmとnへの代入はありません。m+nの結果が変化しないので、tの値も毎回同じです。そこで、tへの代入を繰り返しの外であらかじめ計算しておくようにします。
- 最適化の方法③は、ループのアンローリングです。繰り返し内の処理を、繰り返しを使わずにすべて書いています。アンローリングすることにより、繰り返しのオーバーヘッドがなくなるので処理が速くなります。ただし、コードサイズは大きくなります。
以上より、aはカ、bはキとなります。
設問2
図1の最適化との対応は次のようになります。
- 図1①は、関数のインライン展開です。関数の呼び出しは関数の定義で置き換えることができ、関数の呼び出しをなくすことができます。呼び出しのオーバヘッド文処理が速くなります。図1①では、func(10)のところがfunc(p)の定義に置き換えています。この時、仮引数は実引数の値に置き換えられます。つまり、仮引数pは、実引数の値10に置き換えられます。
- 図1②は、定数の畳込みです。10>=10、10+5、10+15は計算するとtrue、15、25です。これらは定数なのでプログラム中で変化しません。このように定数式は定数に置き換えることができます。
- 図1③は、無用命令の削除です。条件式の値がtrueになっているので、条件が偽の時の処理、#wに25を代入する処理を実行することはあり得ません。そこで、あり得ない処理を削除して15を代入する処理だけにします。
以上より、cはイとなります。
設問3
問1の32ビット単精度浮動小数点形式を参考に実際に計算を行うと次の図のようになります。(クリックで拡大します)
問題は、最適化を行った場合、赤字の場所でnが0になってしまい計算に反映されなくなってしまうことです。これは、先にm+nを計算することになった結果、極端に絶対値の大きさの異なる加減を行うことで小さいほうの情報がなくなったことによります。このような状態になることを情報落ちといいます。
以上より、dはイ、eはウとなります。
最適化はコンパイラが行うのでプラグラムを作成する時に意識することはないかもしれません。しかし、精度が求められるプログラムでは、この問題のように思わぬ落とし穴がある場合もあります。コンパイラの最適化の癖を知っておくことも大切です。
2012年(平成24年度)春期の解説
- 平成24年度 春 基本情報技術者試験 【問13】(その2)
- 平成24年度 春 基本情報技術者試験 【問13】(その1)
- 平成24年度 春 基本情報技術者試験 【問2】
- 平成24年度 春 基本情報技術者試験 【問3】
- Date:
- この記事を
友だちに教える - LINE
- - HatenaBookmark
- GooglePlus