MPI-一个用于MPI_Init和MPI_Init_线程的函数

MPI-一个用于MPI_Init和MPI_Init_线程的函数,mpi,Mpi,是否可以使用一个函数来包装MPI_Init和MPI_Init_线程?这样做的目的是在保持向后兼容性的同时提供更干净的API。当MPI运行时不支持对MPI\u Init\u线程的调用时会发生什么情况?当MPI\u Init\u thread不受支持时,如何使我的包装器函数为MPI实现工作?MPI\u Init\u thread是15年前发布的MPI-2.0规范的一部分。几乎所有现有的MPI实现都是MPI-2兼容的,除了一些真正过时的实现。您可能无法获得所需级别的线程支持,但函数应该在那里,并且您仍

是否可以使用一个函数来包装
MPI_Init
MPI_Init_线程
?这样做的目的是在保持向后兼容性的同时提供更干净的API。当MPI运行时不支持对
MPI\u Init\u线程的调用时会发生什么情况?当
MPI\u Init\u thread
不受支持时,如何使我的包装器函数为MPI实现工作?

MPI\u Init\u thread
是15年前发布的MPI-2.0规范的一部分。几乎所有现有的MPI实现都是MPI-2兼容的,除了一些真正过时的实现。您可能无法获得所需级别的线程支持,但函数应该在那里,并且您仍然可以调用它,而不是
MPI\u INIT

您最好且最可移植的选择是在MPI库中为
MPI_Init_线程
配置一个类似
的机制探测器,例如,通过尝试编译一个非常简单的MPI程序,查看它是否因未解析的符号引用而失败,或者您可以使用
nm
直接检查MPI库的导出表(用于存档)或
objdump
(用于共享ELF对象)。一旦确定MPI库中有
MPI_Init_线程
,就可以定义预处理器符号,例如
CONFIG_has_Init thread
。然后将其包装为类似于此:

int init\u mpi(int*pargc,char***pargv,int-desired,int-provided)
{
#如果已定义(CONFIG_有_INITTHREAD)
返回MPI_Init_线程(pargc、pargv,需要,提供);
#否则
*提供=MPI螺纹单螺纹;
返回MPI_Init(pargc、pargv);
#恩迪夫
}

当然,如果MPI库缺少
MPI_INIT_THREAD
,那么
MPI_THREAD_SINGLE
和其他线程支持级别常量也不会在
MPI.h
中定义,因此您可能需要在某个地方定义它们。

在MPI_版本上很容易定义,而无需构建配置测试。