【问题标题】:Problem with included modules when compiling program with mpifort使用 mpifort 编译程序时包含模块的问题
【发布时间】:2019-10-27 20:36:42
【问题描述】:

我正在开发一个 python 工具,用于对用 fortran 模拟工具编写的数据进行后处理。由于许多方法已经在 fortran 中实现,我不想在 python 中进行资源繁重的计算,所以我做了以下操作:

  1. 编写了一个 fortran 包装器,初始化了一些数据并从模拟程序中导入了模块。
  2. 使用 mpifort 编译 fortran 模块并将它们链接到一个共享库 (.so) 中
  3. 将共享库与包装器相关联,并创建了一个可以在 python 中加载的新共享库。

编译程序模块时出现第一个问题。编译退出并出现错误,因为它找不到模块文件(已编译并在模块目录中)。

mpifort -fPIC -xHost -fpp -O3 -heap-arrays -shared -mcmodel=large -safe-cray-ptr -g -traceback -I./obj/ -module ./obj/ -c src//decomp_2d.f90 -o obj//decomp_2d.o
mpifort -fPIC -xHost -fpp -O3 -heap-arrays -shared -mcmodel=large -safe-cray-ptr -g -traceback -I./obj/ -module ./obj/ -c src//glassman.f90 -o obj//glassman.o
mpifort -fPIC -xHost -fpp -O3 -heap-arrays -shared -mcmodel=large -safe-cray-ptr -g -traceback -I./obj/ -module ./obj/ -c src//ftt_generic.f90 -o obj//ftt_generic.o
mpifort -fPIC -xHost -fpp -O3 -heap-arrays -shared -mcmodel=large -safe-cray-ptr -g -traceback -I./obj/ -module ./obj/ -c src//module_param.f90 -o obj//module_param.o
src//module_param.f90(3): error #7002: Error in opening the compiled module file$
  check INCLUDE paths.   [DECOMP_2D]
  use decomp_2d, only : mytype 
-----------^

这里要注意的是,glassman.f90 和 ftt_generic 也使用 decomp_2d 并且似乎没有问题找到它。 现在,如果我再次运行 make,一切都会编译并创建我的共享库:

mpifort -fPIC -xHost -fpp -O3 -heap-arrays -shared -mcmodel=large -safe-cray-ptr -g -traceback -I./obj/ -module ./obj/ ./obj//decomp_2d.o ./obj//glassman.o ./obj/ /fft_generic.o ./obj//module_param.o ./obj//io.o ./obj//variables.o ./obj//poisson.o ./obj//schemes.o ./obj//BC-Channel-flow.o ./obj//derive.o ./obj//parameters.o ./obj//tools.o -DVISU -DVISUEXTRA -DDOUBLE_PREC -DSTRETCHING -DPOST  -o lib/i3dlib.so     

创建另一个共享库:

mpifort -fPIC -xHost -fpp -O3 -heap-arrays -shared -mcmodel=large -safe-cray-ptr -g -traceback -I./obj/ -module ./obj/ -Ilib/i3dlib.so ./obj//ipp.o -o lib/ipplib.so

我在 python 中运行:

from ctypes import cdll
ipp = cdll.LoadLibrary('./lib/ipplib.so')
ipp.ipp_mp_init_()

我得到的是:

Traceback (most recent call last):
File "test/derivtest.py", line 5, in <module>
Ipp = cdll.LoadLibrary('./lib/ipplib.so')
File "/usr/lib/python3.5/ctypes/__init__.py", line 425, in LoadLibrary
return self._dlltype(name)
File "/usr/lib/python3.5/ctypes/__init__.py", line 347, in __init__
self._handle = _dlopen(self._name, mode)
OSError: ./lib/ipplib.so: undefined symbol: decomp_2d_mp_decomp_2d_init_

这是我编译的包装共享对象中的符号

>> nm ./lib/ipplib.so

00000000002013b8 B __bss_start
00000000002013c0 b completed.7594
                 w __cxa_finalize@@GLIBC_2.2.5
0000000000000000 N .debug_info_seg
                 U decomp_2d_mp_decomp_2d_init_
0000000000000c20 t deregister_tm_clones
0000000000000cb0 t __do_global_dtors_aux
0000000000201088 t __do_global_dtors_aux_fini_array_entry
00000000002013b0 d __dso_handle
0000000000201098 d _DYNAMIC
00000000002013b8 D _edata
00000000002014e8 B _end
0000000000000e80 T _fini
                 U for_read_seq_lis
                 U for_write_seq_lis
0000000000000cf0 t frame_dummy
0000000000201080 t __frame_dummy_init_array_entry
0000000000001078 r __FRAME_END__
0000000000201398 d _GLOBAL_OFFSET_TABLE_
                 w __gmon_start__
0000000000000f70 r __GNU_EH_FRAME_HDR
0000000000000be0 T _init
0000000000000d20 T ipp._
0000000000000d50 T ipp_mp_getfield_
0000000000000d60 T ipp_mp_init_
0000000000000d30 T ipp_mp_main_
0000000000000d40 T ipp_mp_setfield_
                 w _ITM_deregisterTMCloneTable
                 w _ITM_registerTMCloneTable
0000000000201090 d __JCR_END__
0000000000201090 d __JCR_LIST__
                 w _Jv_RegisterClasses
00000000002014a0 B mpi_fortran_argv_null_
00000000002014e0 B mpi_fortran_argvs_null_
0000000000201420 B mpi_fortran_bottom_
0000000000201460 B mpi_fortran_errcodes_ignore_
0000000000201440 B mpi_fortran_in_place_
00000000002013e0 B mpi_fortran_statuses_ignore_
0000000000201400 B mpi_fortran_status_ignore_
0000000000201480 B mpi_fortran_unweighted_
00000000002014c0 B mpi_fortran_weights_empty_
                 U mpi_init_
                 U parameter_
0000000000000c60 t register_tm_clones
                 U schemes_
0000000000000e8c r __STRLITPACK_0
0000000000000e98 r __STRLITPACK_2.0.3
0000000000000ea0 r __STRLITPACK_3.0.3
00000000002013b8 d __TMC_END__
                 U var_mp_init_variables_

而且 i3dlib.so 有一行

0000000000049fc0 T decomp_2d_mp_decomp_2d_init_

【问题讨论】:

  • 你应该有 ipplib.so 依赖于 id3lib.so

标签: python fortran mpi


【解决方案1】:

问题(部分)解决了。我在编译器命令中有错字:

mpifort -fPIC -xHost -fpp -O3 -heap-arrays -shared -mcmodel=large -safe-cray-ptr -g -traceback -I./obj/ -module ./obj/ -Ilib/i3dlib.so ./obj//ipp.o -o lib/ipplib.so

代替:

mpifort -fPIC -xHost -fpp -O3 -heap-arrays -shared -mcmodel=large -safe-cray-ptr -g -traceback -I./obj/ -module ./obj/ -I./obj/ lib/i3dlib.so ./obj//ipp.o -o lib/ipplib.so

在库未链接之前。现在我可以从 python 调用我想要的方法了。

另一个问题仍然存在 - 为什么我必须编译两次?为什么第一次运行时在包含目录中看不到已编译的模块,但在第二次运行时可以看到?

【讨论】:

  • 您是否通过脚本按顺序编译文件?还是您并行构建您的应用程序(例如make -j)?在后一种情况下,可能会丢失一些依赖项。
猜你喜欢
  • 1970-01-01
  • 2012-09-10
  • 1970-01-01
  • 2021-03-21
  • 2018-09-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多