2

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

4

1 回答 1

7

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

您最好和最便携的选择是在 MPI 库中使用类似configure机制的探针MPI_Init_thread,例如通过尝试编译一个非常简单的 MPI 程序并查看它是否因未解析的符号引用而失败,或者您可以直接检查导出表带有nm(用于存档)或objdump(用于共享 ELF 对象)的 MPI 库。一旦您确定 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,因此您可能需要在某处定义它们。

于 2013-04-27T10:23:54.187 回答