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