このサンプルプログラムでは、2つの異なる方法で同じことを(少なくともそう思います)しています。Linux PCでこれを実行し、topでメモリ使用量を監視しています。gfortranを使用すると、最初の方法(「1」と「2」の間)で使用されるメモリは8.2GBであり、2番目の方法(「2」と「3」の間)でメモリ使用量は3.0GBです。Intelコンパイラーでは、違いはさらに大きくなります:10GB対3GB。これは、ポインターを使用することに対する過度のペナルティのようです。なぜこれが起こるのですか?
program test
implicit none
type nodesType
integer:: nnodes
integer,dimension(:),pointer:: nodes
end type nodesType
type nodesType2
integer:: nnodes
integer,dimension(4):: nodes
end type nodesType2
type(nodesType),dimension(:),allocatable:: FaceList
type(nodesType2),dimension(:),allocatable:: FaceList2
integer:: n,i
n = 100000000
print *, '1'
read(*,*)
allocate(FaceList(n))
do i=1,n
FaceList(i)%nnodes = 4
allocate(FaceList(i)%nodes(4))
FaceList(i)%nodes(1:4) = (/1,2,3,4/)
end do
print *, '2'
read(*,*)
do i=1,n
deallocate(FaceList(i)%nodes)
end do
deallocate(FaceList)
allocate(FaceList2(n))
do i=1,n
FaceList2(i)%nnodes = 4
FaceList2(i)%nodes(1:4) = (/1,2,3,4/)
end do
print *, '3'
read(*,*)
end program test
背景はローカルグリッドの改良です。リンクリストを選択して、顔を簡単に追加および削除しました。ノードの数はデフォルトで4ですが、ローカルの改良に応じてより多くなる可能性があります。