我有一个项目,其中我有一个主程序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
中的相应标量变量时会发生溢出。
在这里和英特尔开发人员论坛上阅读其他主题,看起来这应该只有在我有> 2GB的静态数据时才会发生(可能在COMMON块中,我没有;加上,如上所列上面,我的变量远不及2GB)。此外,这些主题给出的主要处方是:
i)在主程序中声明所有可分配的大数组(哪个 我弄完了;但是,我还没有声明它们是可分配的 个别子程序)和
ii)在模块中声明所有数据(我也已经完成)
有些回答提到问题可能出现在“全局”变量上,我不确定它们在Fortran中的意思,特别是因为上面的处方ii)。
鉴于我在这一点上很丢失,我想知道问题是否源于将每个子程序放在一个单独的模块中,将临时数组放在“全局”中,无论在其他线程中意味着什么?
还有其他潜在客户?