派生データ型のメモリ使用量に関して奇妙な動作を観察しました。次のfortran90コードは、この問題を示しています。
module prec
implicit none
integer, parameter :: d_t = selected_real_kind(15,307)
end module
module typdef
use prec
implicit none
type level_2
real(kind=d_t), allocatable :: lev_3(:)
end type
type level_1
type(level_2),allocatable :: lev_2(:,:)
end type
type array
type(level_1),allocatable :: lev_1(:,:)
end type
end module
program mem_test
use prec
use typdef
implicit none
integer :: n,i,j,k,l,m,egmax,niter,ncells,namom,nsmom
real(kind=d_t),allocatable :: simple_array(:,:,:,:,:)
type(array) :: fancy_array
real(kind=d_t) :: it
egmax=7
niter=2
ncells=3000000
namom=1
nsmom=1
!
!
!
allocate( simple_array(egmax,niter,ncells,namom,nsmom) )
!
!
!
allocate( fancy_array%lev_1(egmax,niter))
do i=1,niter
do j=1,egmax
allocate( fancy_array%lev_1(j,i)%lev_2(ncells,namom) )
end do
end do
do i=1,niter
do j=1,egmax
do k=1,namom
do l=1,ncells
allocate( fancy_array%lev_1(j,i)%lev_2(l,k)%lev_3(nsmom) )
end do
end do
end do
end do
!
do n=1,100000
it=0.0_d_T
do i=1,100000
it=it+1.0_d_t
end do
end do
!
!
deallocate(simple_array)
deallocate(fancy_array%lev_1)
end program
データを多次元配列(egmax * niter * ncell * namom * nsmom倍精度数)に格納したい。私は2つの異なる方法でそれを行いました:
- 多次元標準配列「simple_array(egmax、niter、...、)」
- 私が提供したコードの一部で定義されている、ネストされた派生データ構造「fancy_array」。
を使用してコードをコンパイルしました
ifort -g -o test.exe file.f90
valgrindで実行し、simple_arrayとfancy_arrayのメモリ消費量を比較しました。simple_arrayは予想どおり約300Mbを使用しますが、fancy_arrayは同じ数の実数を格納しているにもかかわらず3Gb(10倍)を使用します。したがって、300Mbしか消費しないはずです。
より単純なテストケースを実行します。ここで、派生型は1レベルの深さしかありません。
type level_1
real(kind=d_t),allocatable :: subarray(:)
end type
type array
type(level_1),allocatable :: lev_1(:)
end type
私が期待している量のメモリを正確に消費します。10倍のメモリを消費しません。誰かが同様の行動を観察したことがありますか、またはこれが発生する理由について何か手がかりがありますか?説明されている動作の理由に関する私の唯一の考えは、fancy_arrayが非連続メモリを割り当て、Fortranがそれを追跡する必要があるため、メモリ消費量が増加することです。ご意見や同様のご意見をいただければ幸いです。
ご協力いただきありがとうございます。
セバスチャン