이 샘플 프로그램에서 저는 두 가지 다른 방식으로 같은 일을하고 있습니다 (적어도 그렇게 생각합니다). Linux PC에서 이것을 실행하고 top으로 메모리 사용량을 모니터링합니다. gfortran을 사용하여 첫 번째 방법 ( "1"과 "2"사이)에서 사용 된 메모리는 8.2GB이고 두 번째 방법 ( "2"와 "3"사이)에서 메모리 사용량은 3.0GB입니다. 인텔 컴파일러의 차이는 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이지만 로컬 세분화에 따라 더 높아질 수 있습니다.