исправление общего перемещения fortran, усеченного для соответствия R_X86_64_32S и модулям

У меня есть старый код на Fortran 77, написанный вокруг множества подпрограмм, каждая подпрограмма в отдельном файле, и они широко используют операторы COMMON. Я профилировал код, из 18 включаемых файлов я нашел два, которые являются сильными нападающими, которые объявляют самые большие статические массивы. Например, мой файл параметров global.par определяет

C  keep nodes/elements below 400000 / 600000 to prevent relocation
C  truncated to fit compiler error

   INTEGER MAXNODES
   PARAMETER ( MAXNODES = 1000000 )

   INTEGER MAXELEMS
   PARAMETER ( MAXELEMS = 4000000 )

затем этот файл параметров я теперь включаю в два переписанных включаемых файла, которые я превратил в модули. Однако каждый из этих новых файлов модулей делает все то же самое, что и раньше, в отношении объявления статических массивов, таких как

      C this module file name is aa_module.f

      MODULE AA

      IMPLICIT NONE
      INCLUDE 'global.par'

      REAL    NODES   (3, MAXNODES)
      REAL    NODES2  (3, MAXNODES)
      INTEGER EL1     (12, MAXELEMS)
      INTEGER EL2     (12, MAXELEMS)
C     and so on, many more arrays based around MAXNODES & MAXELEMS

      END MODULE AA

Когда я скомпилирую и свяжу программу, если я оставлю MAXNODES и MAXELEMS маленькие вещи, они будут работать. Но мне нужно обрабатывать большие модели, поэтому, когда я поднимаю эти значения, я все равно получаю сообщение

перемещение усечено, чтобы соответствовать: R_X86_64_32S по сравнению с символом... определенным в разделе COMMON в AA_module.o.

Какое лучшее решение для этого? Мои знания Фортрана ограничены.

Если я создам новую подпрограмму с именем Init_big_arrays, например, и ALLOCATE, все эти массивы в модуле AA во время выполнения решат эту проблему, имея в виду, что есть еще 16 или около того других подключаемых файлов, которые объявляют кучу статических целочисленных и реальных массивов. на основе параметров в файле global.par, но худшим из них является что-то вроде INTEGER ID(256,256) и CHARACTER*256 NAME(3,256)?


person ron    schedule 11.04.2016    source источник
comment
Какой компилятор/ОС вы используете?   -  person francescalus    schedule 11.04.2016
comment
Я использую Intel Parallel Studio XE 2016, где ifort --version сообщает 16.0.0. Я отредактировал код, чтобы он был синтаксически совместим с gfortran-4.8, но я получаю ошибки времени выполнения. Так что я планирую придерживаться Intel ifort.   -  person ron    schedule 11.04.2016
comment
Честно говоря, если вы не можете заставить его работать как с gfortran, так и с компилятором Intel, я боюсь, что у вас есть более серьезные проблемы, чем указано выше. С Intel вы компилируете со всеми включенными параметрами отладки?   -  person Ian Bush    schedule 11.04.2016
comment
Я скомпилировал как gfortran-4.8, так и ifort с -warn all и получил от более чем 100 предупреждений до менее 10, которые теперь просто эта переменная не используется из-за того, как переменные были сгруппированы во включаемые файлы и используются только в операторах IF в файлах. Забыл сказать, что операционная система линукс. Суза 11.   -  person ron    schedule 11.04.2016
comment
Прочитайте stackoverflow.com/questions/12916176/ Это также относится к компилятору Intel.   -  person IanH    schedule 11.04.2016