A further test that shows:
array larger than 2gb
array with more than 2^31 elements
use of SIZE and LOC as I*8
.. all working well
integer*4, parameter :: n1 = 107
integer*4, parameter :: n2 = 667
integer*4, parameter :: n3 = 1357
!
real*8 Array1, Array2
integer*2 Array3
common /commbl1/ Array1(n1,n1,n1) ! 9.0 mb, 1.2 m elements
common /commbl2/ Array2(n2,n2,n2) ! 2.21 gb, 297 m elements : test 2gb
common /commbl3/ Array3(n3,n3,n3) ! 4.65 gb, 2.4 g elements : test long addressing
!
! Now if i increase it 1000 times to 8GB
!
call test8 (array1, n1, 1)
call test8 (array2, n2, 2)
!
call test2 (array3, n3, 3)
!
write (*,*) 'end of test'
end
subroutine test8 ( array, n, id)
integer*4 n, id
real*8 array(n,n,n)
!
integer*4 i,j,k,ne
integer*8 mem,ig, ng
real*4 gb, sec
external sec
!
ng = n
ng = ng*ng*ng
mem = loc(array)
ig = ((mem/1024)/1024)/1024
write (*,*) ' '
gb = real(size(array))*8. / (1024.**3)
write (*,11) 'Initialising Array ',id,' : gb = ',gb, sec(), ' sec'
11 format (a,i0,a,f0.3,f8.3,a)
write (*,*) 'n = ',n
write (*,*) 'ng = ',ng
write (*,*) 'size = ',size(array)
write (*,*) 'loc = ',loc (array), ig
do i = 1,n
do j = 1,n
do k = 1,n
array(k,j,i) = i+j+k
end do
end do
end do
!
write (*,12) 'Checking Array ',id, sec(), ' sec'
12 format (a,i0,f8.3,a)
ne = 0
ng = 0
do i = 1,n
do j = 1,n
do k = 1,n
ng = ng+1
if ( array(k,j,i) /= i+j+k ) ne = ne+1
end do
end do
end do
write (*,13) ng,' elements : ',ne,' errors detected', sec(), ' sec'
13 format (i10,a,i10,a,f10.3,a)
!
end subroutine test8
subroutine test2 ( array, n, id)
integer*4 n, id
integer*2 array(n,n,n)
!
integer*4 i,j,k
integer*8 ne,ng, mem, ig
real*4 gb, sec
external sec
!
ng = n
ng = ng*ng*ng
mem = loc(array)
ig = ((mem/1024)/1024)/1024
write (*,*) ' '
gb = real(size(array))*2. / (1024.**3)
write (*,11) 'Initialising Array ',id,' : gb = ',gb, sec(), ' sec'
11 format (a,i0,a,f0.3,f8.3,a)
write (*,*) 'n = ',n
write (*,*) 'ng = ',ng
write (*,*) 'size = ',size(array)
write (*,*) 'loc = ',loc (array), ig
do i = 1,n
do j = 1,n
do k = 1,n
array(k,j,i) = i+j+k
end do
end do
end do
!
write (*,12) 'Checking Array ',id, sec(), ' sec'
12 format (a,i0,f8.3,a)
ne = 0
ng = 0
do i = 1,n
do j = 1,n
do k = 1,n
ng = ng+1
if ( array(k,j,i) /= i+j+k ) ne = ne+1
end do
end do
end do
write (*,13) ng,' elements : ',ne,' errors detected', sec(), ' sec'
13 format (i10,a,i10,a,f10.3,a)
!
end subroutine test2
real*4 function sec ()
integer*4 clock, rate
integer*4 :: start = -1
!
call system_clock ( clock, rate )
if ( start < 0) start = clock
sec = real(clock-start) / real (rate)
end function sec
Results are
Initialising Array 1 : gb = 0.009 0.000 sec
n = 107
ng = 1225043
size = 1225043
loc = 55050304 0
Checking Array 1 0.014 sec
1225043 elements : 0 errors detected 0.025 sec
Initialising Array 2 : gb = 2.211 0.025 sec
n = 667
ng = 296740963
size = 296740963
loc = 24324997184 22
Checking Array 2 2.160 sec
296740963 elements : 0 errors detected 3.549 sec
Initialising Array 3 : gb = 4.654 3.549 sec
n = 1357
ng = 2498846293
size = 2498846293
loc = 19327287360 17
Checking Array 3 15.834 sec
2498846293 elements : 0 errors detected 26.092 sec
end of test