大型动态数组Fortran声明 - seg错误

时间:2011-12-16 14:32:57

标签: arrays dynamic fortran

我希望在fortran95中使用动态声明,使用allocate(矩阵(大小)),而size = 10 ^ 7,内容是真实的* 8个数字。如果大小<13 * 10 ^ 6,一切都运行顺利任何错误,但如果大小> 13 * 10 ^ 6然后我在运行中得到分段错误。因为数组的大小是在程序中计算的,所以我使用动态声明很重要。我使用Mac OSX 64bit和gfortran 4.6。有人可以帮我吗?

2 个答案:

答案 0 :(得分:4)

10 ** 7个真实* 8的元素是76 MiB,所以应该没有问题(我已经成功地用GFortran分配了几个GiB数组,尽管我不使用OSX)。您是否可以发布一个独立的示例以进一步分析您的问题?

答案 1 :(得分:2)

以下是使用大小为10 ** 8的数组的示例。它适用于Mac OS X和gfortran 4.6。它可以在您的计算机上运行吗?

program test_lrg

   integer, parameter :: DoubleReal_K = selected_real_kind (14)
   integer, parameter :: QuadReal_K = selected_real_kind (32)
   integer, parameter :: RegularInt_K = selected_int_kind (8)
   integer, parameter :: VeryLongInt_K = selected_int_kind (18)

   real (DoubleReal_K), dimension (:), allocatable :: array
   integer (RegularInt_K) :: i
   integer (RegularInt_K), parameter :: N = 100000000_RegularInt_K
   real (QuadReal_K) :: sum
   integer (VeryLongInt_K) :: CalcSum

   allocate (array (N))

   do i=1, N
      array (i) = i
   end do

   do i=1, N
      sum = sum + array (i)
   end do
   write (*, *) sum

   CalcSum = N
   CalcSum = ( CalcSum * (CalcSum + 1_VeryLongInt_K) ) / 2_VeryLongInt_K
   write (*, *) CalcSum

   stop

end program test_lrg

尝试使用调试选项进行编译,例如:

-fimplicit-none  -Wall  -Wline-truncation  -Wcharacter-truncation  -Wsurprising  -Waliasing  -Wimplicit-interface  -Wunused-parameter  -fwhole-file  -fcheck=bounds  -fcheck=do  -fcheck=mem  -fcheck=recursion  -std=f2008  -pedantic  -fbacktrace