Большой динамический массив Fortran объявление-ошибка сегмента - PullRequest
2 голосов
/ 16 декабря 2011

Я хочу использовать динамическое объявление для большого массива в fortran95 с помощью allocate (matrix (size)), в то время как size = 10 ^ 7 и содержимое вещественное * 8 чисел. Если размер <13 * 10 ^ 6, все работает безлюбая ошибка, но если размер> 13 * 10 ^ 6, то я получаю ошибку сегментации на ходу.Важно, чтобы я использовал динамическое объявление, поскольку размер массива вычисляется в программе.Я использую Mac OSX 64bit и gfortran 4.6.Может ли кто-нибудь мне помочь?

Ответы [ 2 ]

4 голосов
/ 16 декабря 2011

10 ** 7 элементов реального * 8 - 76 МБ, поэтому проблем не должно быть (я успешно выделил несколько массивов GiB с помощью GFortran, хотя я не использую OSX).Можете ли вы опубликовать отдельный пример для дальнейшего анализа вашей проблемы?

2 голосов
/ 16 декабря 2011

Вот пример использования массива размером 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...