MPI - MPI_Init和MPI_Init_thread的一个函数

pyC*_*hon 2 mpi

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

Hri*_*iev 7

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

你最好和最便携的选择是在MPI库中有一个类似configure机制的探测器MPI_Init_thread,例如通过尝试编译一个非常简单的MPI程序并查看它是否失败并带有未解析的符号引用,或者你可以直接检查导出表MPI库nm(用于存档)或objdump(用于共享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
}
Run Code Online (Sandbox Code Playgroud)

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

  • 在没有构建配置测试的情况下,在MPI_VERSION上ifdef很容易. (2认同)