OpenACC ディレクティブによるプログラミング

Fortranにおける配列を引数とする場合の配列形状について

Fortranの仮引数としての配列

 このページでは、Fortranの仮引数の形態に関して纏めておく。OpenACC では、仮引数となる配列の一部の形状が使用できない制約事項があるため、備忘録として以下の主な配列の形状について簡単に纏めておく。

  • 形状明示配列(explicit-shape array)
  • 形状引継ぎ配列(assumed-shape array)
  • 大きさ引継ぎ配列(assumed-size array)

形状明示配列(explicit-shape array)

 形状明示配列は、FORTRSAN77 の時代から使用されてきた仮引数の形状、形態である。すなわち、サブルーチン側には、「配列」とその「大きさ(寸法)」を変数として渡す方式である。この大きさ変数を用いて、配列のサイズを含めて宣言を行う。

subroutine sub(a, n)    ! 配列aと配列寸法nを仮引数としている
 integer :: n
 real(8) :: a(n, n)
 ...

形状引継ぎ配列(assumed-shape array)

 形状引継ぎ配列は、寸法を明示しないで仮引数となる配列を宣言する方法である。一般に、配列の各次元をコロン : で表す。形状引継ぎ配列を使用する場合は、配列の寸法を引数にする必要がないため、プログラミングの自由度が広がるが、これは「モジュール副プログラム」内でしか使用できない。すなわち、MODULE 内での副プログラムの定義が必要である。「モジュール副プログラム」ではなく、一般的な「外部副プログラム」内で形状引継ぎ配列を宣言する場合は、明示的にインターフェース・モジュールを用いなければならない。(コンパイルは成功したとしとしても、実行時に segmentation fault で abort する場合が多い)

module TestMod
	implicit none
contains
	subroutine sub( a )   
 	  integer :: i, n, m
	  real(8) :: a(:, :)   ! 形状引継ぎ配列, 寸法を : で表す
 	  n = size(a,1)        ! 1次元目の寸法
 	  m = size(a,2)        ! 2次元目の寸法
 		do i = 1, n
 		  write (*, *) a(i, 1:m)
 	    end do
 	end subroutine
end module

大きさ引継ぎ配列(assumed-size array)

 大きさ引継ぎ配列とは、実引数の配列の大きさ(全要素)を副プログラム上の仮配列で受け継ぐ際の仮配列を言う。配列の寸法、形状を * で表す。

module TestMod
	implicit none
contains
	subroutine sub( a , m )   ! 仮引数配列 a 
 	  integer ::  m
 	  real(8) :: a(*)   ! 1次元の大きさ引継ぎ配列として受ける(全要素を受ける)
 	    print *, "a =",  a(1:m)
 	end subroutine
end module

program main 
  use TestMod
  implicit none
  integer, parameter :: n = 10
  integer :: i, j
  real(8), dimension :: a(n, n) ! 2次元の配列
	do i = 1, n
	  do j = 1, n
	    a(i,j) = i*j
	  end do
	end do
	call sub( a, n*n )  ! a 実引数は2次元の配列として渡す
end program
	

OpenACCプログラミングのインデックスへ