【发布时间】:2018-06-01 13:13:21
【问题描述】:
我的 Fortran 代码如下(test.f):
subroutine sub(n1,n2,wa)
implicit none
integer, intent(in) :: n1, n2
real(4), intent(inout) :: wa(1_8:1_8*n1*n2)
integer(8) :: i, j, ms
print*, 'in sub, 1_8*n1*n2=', 1_8*n1*n2
print*, 'in sub, size of wa:', size(wa,kind=8)
ms=0
!$omp parallel default(shared) private(i,j,ms)
!$omp do
do i=1, n1
do j=1, n2
ms=(i-1)*n2+j
wa(ms)=ms*1.d0
enddo; enddo;
!$omp end do nowait
!$omp end parallel
print*, 'size of wa:', size(wa,kind=8)
return
end subroutine sub
program main
implicit none
integer, parameter :: n1=2**11,n2=2**20
real(4), allocatable :: wave(:)
integer :: ierr
integer(8) :: i
allocate(wave(1_8*n1*n2), stat=ierr)
!$omp parallel default(shared) private(i)
!$omp do
do i=1_8,1_8*n1*n2
wave(i)=0.d0
enddo
!$omp end do nowait
!$omp end parallel
print*, 'in main, size of wave:', size(wave,kind=8)
call sub(n1, n2, wave)
print*, wave(1_8*n1*n2)
deallocate(wave, stat=ierr)
end program main
n1 和 n2 可以更大,并确保 n1*n2 是一个长整数(>2**31-1)。我只是想测试如何在子程序中使用非常大的数组。
我编译时使用:ifort -openmp -CB test.f。
如果我使用-CB 选项检查数组的边界,子程序sub 中的数组wa 会出错。
这是错误信息:
主要,波浪大小:2147483648
在子中,1_8*n1*n2= 2147483648
在 sub 中,wa 的大小:0
forrtl: 严重 (408): fort: (2): 数组 WA 的下标 #1
值 108003329 大于 -2147483648 的上限。
错误信息中的数字是随机的。
当我在子程序中将wa 声明为real(4), intent(inout) :: wa(1) 时,程序将运行良好。谁能告诉我为什么?
【问题讨论】:
-
您是否知道编译器可能会将
real(4), intent(inout) :: wa(1)解释为不意味着wa是一个大小为1 的数组(但假定大小)?根据编译器看到的“错误”,这可能很重要。如果您有来自编译器的消息(编译或运行),请显示出来。 -
这是错误信息:forrtl:severe (408):fort:(2): 数组 WA 的下标 #1 的值为 108003329,大于 -2147483648 的上限。错误信息中的数字是随机的。
-
请edit的问题,不要使用cmets。不,不建议直接使用种类编号作为
4和8,也不可移植。这些数字不是字节数stackoverflow.com/questions/838310/fortran-90-kind-parameter -
我在运行您的代码时没有收到任何错误消息。此外,号码
-2147483648是可疑的。请仔细检查您显示的代码是否准确且与错误消息完全对应。 -
当我将 n1 和 n2 设置得更小(n1*n2
标签: arrays fortran subroutine