是否可以使用一个函数来包装MPI_Init
和MPI_Init_thread
?这样做的目的是在保持向后兼容性的同时拥有更清晰的API。当MPI运行时不支持调用MPI_Init_thread
时会发生什么?如果不支持MPI_Init_thread
,如何让我的包装函数保持MPI实现?
答案 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
中定义,因此您可能需要定义它们某处。