関連情報

ナビゲーション:前へ   上へ   次へ

9 多次元配列のアクセス順序に注意する

計算プログラムの作成において、結果の正しさの次に パフォーマンスが重要となってきます。以下に多次元配列の アクセス順序で気をつけると良い点を述べます。

多次元配列の各成分をループ内でアクセスする場合に、 左側の添字から順番に変更されるようにすると、 一般的にパフォーマンスが良くなります。(キャッシュに関連しています)

例えば以下の例でa(i1,i2,i3)とするよりもa(i3,i2,i1)とする方が 一般的にパフォーマンスが良くなります。

  real a(100,100,100)
  do i1=1,100
    do i2=1,100
      do i3=1,100

        ! ↓の書き方よりも
        !a(i1,i2,i3) = a(i1,i2,i3)+1.0

        ! ↓の書き方が優れています
        a(i3,i2,i1) = a(i3,i2,i1)+1.0

      end do
    end do
  end do

以下のサンプルをあるPC上で(最適化なし)で走らせた場合に、 13行目をa(k,j,i)とした場合には15.92秒かかり、a(i,j,k)では1.11秒かかりました。 このように配列のアクセス順序に気をつけるメリットは十分にあります。

[ array-access.f90 ] - 配列成分アクセス順序のサンプル

program array_access
  implicit none
  integer,parameter :: n = 512
  integer a(n,n,n)
  integer val, i, j, k
  real t1, t2
  print *, "Enter a value:"
  read *, val
  call cpu_time(t1)
  do k=1, n
    do j=1, n
      do i=1, n
        a(i,j,k) = val
      end do
    end do
  end do
  call cpu_time(t2)
  print *, "Time was:", t2-t1
end program array_access
出力例:
 Enter a value:
55
 Time was:   1.1388073



ナビゲーション:前へ   上へ   次へ

Results matter. Trust NAG.
Privacy Policy | Trademarks