2017年9月15日金曜日

効率の良いfortranコードを書きたい

プログラマーではないのだが研究の大部分を占めているのがプログラミング。しかも海洋モデルはfotranで書かれてあるのでいやでもfortranを習得しなければならない。最近並列コンピューティングでシミュレーションをするが大きなデータを扱うのでかなり時間がかかる。そこで少しでも改善の余地があればと思いfortranを効率よく書く秘訣みたいなものを色々ググってみた。以下、その中で理解でき且つ簡単に使えそうなのを書き留めた。

1。do loopは後ろから

do k = 1, kt
  do j = 1, jt
    do i = 1, it
      A(i, j, k) = ...
end do
end do
end do

とする方が

do i = 1, it
  do j = 1, jt
    do k = 1, kt
      A(i, j, k) = ...
end do
end do
end do

より効率いいらしい。


2。同じサイズのarrayはまとめて

real, dimension(3, n) :: a

とする方が

real, dimension(n) :: a, b, c

と三つに分けるよりいいらしい。


1&2のソース:https://jblevins.org/log/efficient-code



3。コロン(:)は左側に

max(A(:, :, i))

とする方が

max(A(i, :, :))

より計算が早いらしい。

ソース:http://www.fortran90.org/src/best-practices.html


4。割り算より掛け算

(A / 2) / 4

より

(A * 0.5) * 0.25

の方が早いらしい。



ソース:https://www.allinea.com/blog/201407/four-simple-tips-optimizing-your-code


最後に。

コンパイラーに最適化のフラッグがあることに気づいた。
-Oというフラッグで-O3がベスト(コンパイルされる時間は増えるが)。
上記にあげたこともしてくれたりするのかな?