是否可以有一个函数来包装两者MPI_Init
和MPI_Init_thread
?这样做的目的是在保持向后兼容性的同时拥有更简洁的 API。MPI_Init_thread
当 MPI 运行时不支持调用时会发生什么情况?MPI_Init_thread
当不支持MPI 实现时,如何让我的包装函数工作?
问问题
1681 次
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 回答