前へ 上へ 次へ
前へ 上へ 次へ
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
前へ 上へ 次へ