链接使用MPI的库,我不';t、 引擎盖后面发生了什么

链接使用MPI的库,我不';t、 引擎盖后面发生了什么,mpi,dynamic-linking,openmpi,Mpi,Dynamic Linking,Openmpi,我正在链接一个库,该库是用OpenMPI支持内部进程构建的 我的应用程序是在没有MPI支持的情况下构建的,我链接到这个库。我不知道引擎盖后面发生了什么关于mpi的事情。如果库A从openmpi加载/调用函数,这是否意味着我可以使用runmpi运行我的应用程序,以使库进程自行分发?如果我决定让应用程序具有MPI意识,并希望使用mpich2而不是OpenMPI,或者如果我希望使用与mpich链接的库B而不是OpenMPI,库和我的应用程序是否会在各自的消息空间中运行?强制应用程序开发人员显式链接mp

我正在链接一个库,该库是用OpenMPI支持内部进程构建的


我的应用程序是在没有MPI支持的情况下构建的,我链接到这个库。我不知道引擎盖后面发生了什么关于mpi的事情。如果库A从openmpi加载/调用函数,这是否意味着我可以使用runmpi运行我的应用程序,以使库进程自行分发?如果我决定让应用程序具有MPI意识,并希望使用mpich2而不是OpenMPI,或者如果我希望使用与mpich链接的库B而不是OpenMPI,库和我的应用程序是否会在各自的消息空间中运行?强制应用程序开发人员显式链接mpi实现以使用启用mpi的库是典型的做法吗?

通常的做法是,开发人员最终根据单个mpi实现编译并链接所有内容。如果有依赖于MPI的库,我通常会看到系统上每个可用MPI实现的库的构建。如果您能够以某种方式连接两个MPI实现,并在单独的代码段中使用它们各自的
MPI_Init
MPI_COMM_WORLD
定义,那么它甚至可以工作。然而,这将是非常脆弱的。不要这样做


至于前面的问题,几乎可以使用MPI对库进行应用程序调用,并让它做正确的事情。首先,代码必须在某个地方调用
MPI\u Init
。无论是在客户机中还是完全封装在库中,都可能有所不同。库必须知道它应该使用什么MPI通信器;通常,客户端代码会传入一个。最后,客户机代码必须考虑这样一个事实,即它将在所有MPI进程上运行,而不仅仅是其中一个进程。因此,如果它执行任何IO或其他只应在一个进程中发生的计算,则需要相应地设置条件。

感谢您的澄清。另一个问题,虽然有点主观。如果应用程序不使用MPI,但库在内部传递MPI数据类型,那么请开发人员确保库头导入正确的MPI.h实现并链接到正确的MPI,即使我们根本不需要它,这是否合理(当它应该只由库对象加载并在源代码中处理,而不是由标头处理时,会有很多额外的链接)。我正在为错误报告/更改请求寻找一些燃料。如果库使用MPI,那么针对整个应用程序的相同MPI实现编译和链接确实是必要的。这就是它在该空间中的工作方式。作为编写类似于使用MPI的库的代码的人,我将拒绝此类错误报告/更改请求这是无效的,不值得我付出努力