У меня есть старый код на 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)
?