11.4. 运行时动态加载 libmpi
如果你想在运行时通过C/C++的dlopen()或Python的ctypes包等工具显式加载Open MPI的共享库libmpi,需要特别注意。Open MPI的默认配置会在内部使用dlopen()加载其支持组件,这些组件依赖于libmpi中可用的符号。为了让Open MPI在运行时加载的组件能够访问libmpi中的符号,你的应用程序必须使用RTLD_GLOBAL选项来加载libmpi。
在C/C++中,该选项被指定为POSIX dlopen(3)函数的第二个参数。
在使用Python的ctypes时,可以通过CDLL()的第二个(可选)参数实现。例如(以下示例展示在Mac OS X系统中,Open MPI的共享库名称以.dylib结尾;其他操作系统使用不同后缀,如.so):
from ctypes import *
mpi = CDLL('libmpi.0.dylib', RTLD_GLOBAL)
f = pythonapi.Py_GetArgcArgv
argc = c_int()
argv = POINTER(c_char_p)()
f(byref(argc), byref(argv))
mpi.MPI_Init(byref(argc), byref(argv))
# Your MPI program here
mpi.MPI_Finalize()
注意
以上仅是一个展示动态加载的示例。如果你想在Python中使用MPI,强烈建议使用MPI4Py。
其他脚本语言在动态加载共享库时也应提供类似选项。