У меня есть проект, в котором у меня есть основная программа main.f95
, которая использует кучу модулей: каждая подпрограмма, вызываемая main.f95
, содержится в своем собственном модуле. Я сделал это, чтобы избежать блоков интерфейса.
Есть два дополнительных модуля: global.f95
, который содержит 8 скалярных целых чисел, объявленных в качестве параметров, и Param.f95
, который содержит 33 скалярных действительных числа (с использованием рабочей точности NAG, т. е. double). Наконец, одна из упомянутых выше подпрограмм, Set_Param.f95
, присваивает значения скалярам, объявленным в Param.f95
. Это происходит в самом начале main.f95
.
Наконец, я использую библиотеку NAG Fortran (отметка 26) и ifort64-18.
Я получаю следующую ошибку при компиляции (ссылка?):
Set_param_mod.o: In function `set_param_mod_mp_set_param_':
Set_param_mod.f95:(.text+0x47): relocation truncated to fit:
R_X86_64_PC32 against symbol `param_mp_rho_i_' defined in COMMON
section in Param.o
Set_param_mod.f95:(.text+0x73): relocation truncated to fit:
R_X86_64_PC32 against symbol `param_mp_theta_' defined in COMMON
section in Param.o
Set_param_mod.f95:(.text+0x84): relocation truncated to fit:
R_X86_64_PC32 against symbol `param_mp_delta_k_' defined in COMMON
section in Param.o
Set_param_mod.f95:(.text+0x95): relocation truncated to fit:
R_X86_64_PC32 against symbol `param_mp_delta_i_' defined in COMMON
section in Param.o
Set_param_mod.f95:(.text+0xa6): relocation truncated to fit:
R_X86_64_PC32 against symbol `param_mp_theta_i_' defined in COMMON
section in Param.o
Set_param_mod.f95:(.text+0xb7): relocation truncated to fit:
R_X86_64_PC32 against symbol `param_mp_theta_k_' defined in COMMON
section in Param.o
Set_param_mod.f95:(.text+0xc8): relocation truncated to fit:
R_X86_64_PC32 against symbol `param_mp_c_e_' defined in COMMON section
in Param.o
Set_param_mod.f95:(.text+0xd2): relocation truncated to fit:
R_X86_64_PC32 against symbol `param_mp_wage_' defined in COMMON
section in Param.o
Set_param_mod.f95:(.text+0xde): relocation truncated to fit:
R_X86_64_PC32 against symbol `param_mp_csi_' defined in COMMON section
in Param.o
Set_param_mod.f95:(.text+0xea): relocation truncated to fit:
R_X86_64_PC32 against symbol `param_mp_b1_' defined in COMMON section
in Param.o
Set_param_mod.f95:(.text+0xf6): additional relocation overflows
omitted from the output
Если я правильно понял, переполнение происходит, когда Set_Param.f95
пытается присвоить значения соответствующим скалярным переменным в Param.f95
.
Читая другие темы здесь и на форуме разработчиков Intel, может показаться, что это должно происходить только в том случае, если у меня есть> 2 ГБ статических данных (возможно, в ОБЩИХ блоках, которых у меня нет; плюс, как указано выше, мои переменные получить далеко не 2 ГБ). Кроме того, основные предписания, данные этими потоками, таковы:
i) объявить все ваши большие массивы доступными для размещения в вашей основной программе (что я и сделал; однако я не объявил их доступными для размещения в отдельных подпрограммах) и
ii) объявить все ваши данные в модулях (что я также сделал)
В некоторых ответах упоминается, что проблема может возникнуть с «глобальными» переменными, которые я не уверен, что они подразумевают под Фортраном, особенно из-за предписания ii) выше.
Учитывая, что я довольно растерялся в этот момент, мне интересно, связана ли проблема с помещением каждой подпрограммы в отдельный модуль, визуализацией временных массивов внутри «глобальных» в любом смысле, который подразумевается в этих других потоках?
Любые другие зацепки?