MPI - MPI_Init和MPI_Init_thread的一个函数

时间:2013-04-26 00:00:31

标签: mpi

是否可以使用一个函数来包装MPI_InitMPI_Init_thread?这样做的目的是在保持向后兼容性的同时拥有更清晰的API。当MPI运行时不支持调用MPI_Init_thread时会发生什么?如果不支持MPI_Init_thread,如何让我的包装函数保持MPI实现?

1 个答案:

答案 0 :(得分:7)

MPI_INIT_THREAD是MPI-2.0规范的一部分,该规范于15年前发布。实际上所有现有的MPI实现都符合MPI-2标准,除了一些非常古老的MPI-2。您可能无法获得所需的线程支持级别,但该功能应该在那里,您仍然可以调用它而不是MPI_INIT

您最好也是最便携的选择是在MPI库中为configure提供类似MPI_Init_thread的机制探针,例如尝试编译一个非常简单的MPI程序并查看它是否因未解析的符号引用而失败,或者您可以使用nm(对于存档)或objdump直接检查MPI库的导出表(对于共享ELF对象)。一旦确定MPI库具有MPI_Init_thread,就可以定义预处理器符号,例如CONFIG_HAS_INITTHREAD。然后让你的包裹类似于这个:

int init_mpi(int *pargc, char ***pargv, int desired, int *provided)
{
#if defined(CONFIG_HAS_INITTHREAD)
   return MPI_Init_thread(pargc, pargv, desired, provided);
#else
   *provided = MPI_THREAD_SINGLE;
   return MPI_Init(pargc, pargv);
#endif
}

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