高速化
2009年09月02日
現在、某共同研究で、プログラムの高速化に取り組んでいます。
コンパイラを変更することによる高速化は一番手軽でしたが、もっと、根本的に解決をしておかないと行けないので、今日はプログラムの構造をいじりました。
自明のことですが、C言語とFortranとでは、配列のメモリ上での配置が逆であり、C言語は列優先、Fortranは行優先です。これと、繰り返しのループの順番によって、メモリ上のアクセススピードが変わるはずですから、配列の順番を変更すると、結果として計算スピードが変わるはずです。
現時点では、6つ程度の配列について、変更を施したところ、それだけで12%程度スピードがupしました。
具体的には、とあるプログラム5,000回を実行するのに掛かる時間が、コンパイラのデフォルトで2550秒、最適化オプションでCPUに最適化したコードを吐き出させると2476秒、配列の行列入れ替えにより、さらに2178.秒と、どんどん短縮されています。
さらに、 多次元の配列を変更して、どの程度までスピードが変わるか、試してみたいと思います。
睡眠時間【5】時間
コンパイラを変更することによる高速化は一番手軽でしたが、もっと、根本的に解決をしておかないと行けないので、今日はプログラムの構造をいじりました。
自明のことですが、C言語とFortranとでは、配列のメモリ上での配置が逆であり、C言語は列優先、Fortranは行優先です。これと、繰り返しのループの順番によって、メモリ上のアクセススピードが変わるはずですから、配列の順番を変更すると、結果として計算スピードが変わるはずです。
現時点では、6つ程度の配列について、変更を施したところ、それだけで12%程度スピードがupしました。
具体的には、とあるプログラム5,000回を実行するのに掛かる時間が、コンパイラのデフォルトで2550秒、最適化オプションでCPUに最適化したコードを吐き出させると2476秒、配列の行列入れ替えにより、さらに2178.秒と、どんどん短縮されています。
さらに、 多次元の配列を変更して、どの程度までスピードが変わるか、試してみたいと思います。
睡眠時間【5】時間