使用openmpi和x27的mpi4py拆分类型;s OMPI_通信类型_插座

使用openmpi和x27的mpi4py拆分类型;s OMPI_通信类型_插座,mpi,mpi4py,Mpi,Mpi4py,是否可以在mpi4py中使用openmpi的OMPI_COMM_TYPE_套接字拆分通信器 我已经验证了这一点: from mpi4py import MPI comm = MPI.COMM_WORLD sharedcomm = comm.Split_type(MPI.COMM_TYPE_SHARED) 但这并不是: socketcomm = comm.Split_type(MPI.OMPI_COMM_TYPE_SOCKET) 这也不是: socketcomm = comm.Split_

是否可以在mpi4py中使用openmpi的OMPI_COMM_TYPE_套接字拆分通信器

我已经验证了这一点:

from mpi4py import MPI

comm = MPI.COMM_WORLD

sharedcomm = comm.Split_type(MPI.COMM_TYPE_SHARED)
但这并不是:

socketcomm = comm.Split_type(MPI.OMPI_COMM_TYPE_SOCKET)
这也不是:

socketcomm = comm.Split_type(MPI.COMM_TYPE_SOCKET)

我查看了文档,但找不到任何相关信息。

mpi4py
仅提供了标准MPI功能的包装<代码>OMPI通信类型\u套接字是一种开放MPI特定的拆分类型。如果您知道它的数值,因为它只是C
enum的一个成员,那么您仍然可以在
mpi4py
中使用它:

/*
*通信器拆分类型常量。
*在不修改mpif.h.in的情况下,请勿更改这些文件的顺序
*(另请参见mpif common.h.fin)。
*/
枚举{
MPI\u通信类型\u共享,
OMPI_COMM_类型螺纹,
OMPI通信类型核心,
OMPI通信类型缓存,
OMPI_COMM_TYPE_L2CACHE,
OMPI通信类型三级缓存,
OMPI\u COMM\u TYPE\u SOCKET,//此处
OMPI_COMM_TYPE_NUMA,
OMPI通信类型板,
OMPI通信类型主机,
OMPI通信类型CU,
OMPI通信类型集群
};
#定义OMPI\U通信类型\U节点MPI\U通信类型\U共享
作为
enum
的成员意味着
OMPI_COMM_TYPE_SOCKET
的实际数值取决于其在
enum
中的位置,因此不同版本的开放式MPI可能有所不同。这里有几个选项

硬编码值 这是最简单的选择。打开
mpi.h
ompi_info--path incdir
为您提供其位置),计算
ompi_COMM_TYPE_SOCKET
在封装
enum
中的位置,从
0
开始计算
mpi_COMM_TYPE_SHARED
并硬编码该值。代码可能会因不同于您的OpenMPI版本而中断

解析
mpi.h
阅读
mpi.h
,搜索
enum
定义并找到包含
OMPI通信类型\u套接字的定义。如果
MPI\u COMM\u TYPE\u SHARED
0
,则
OMPI\u COMM\u TYPE\u SOCKET
的值是其枚举值序列中基于0的索引。这在很大程度上取决于
mpi.h
中具有特定格式的代码,如果格式发生变化,则很容易中断

解析
mpif.h
Fortran接口更容易解析,因为其中的值定义为:

parameter (OMPI_COMM_TYPE_SOCKET=6)
这很容易用一个简单的正则表达式解析。问题在于,OpenMPI的最新版本将
mpif.h
拆分为几个文件,这些文件随后包含在
mpif.h
中,当前值位于
mpif constants.h
中。因此,您可能需要解析
include
语句并递归到它们引用的文件中。请注意,这些是Fortran
include
语句,而不是预处理器
\include
指令

代码生成 编写一个小型C程序,将
OMPI\u COMM\u TYPE\u SOCKET
的值输出到Python文件,并作为程序设置过程的一部分运行它。比如:

#包括
#包括
int main(int argc,字符**argv)
{
如果(argc!=2)
{
printf(“用法:mkompimod/path/to/module.py\n”);
返回1;
}
文件*fh=fopen(argv[1],“w”);
如果(fh!=NULL){
fprintf(fh,“通信类型\u插座=%d\n”,OMPI\u通信类型\u插座);
fclose(fh);
}
返回0;
}
将其放入名为
mkompimod.c
的文件中。使用
mpicc-o mkompimod mkompimod.c
编译并使用
mkompimod/path/to/ompi.py
运行,以创建一个Python文件
ompi.py
,其值为
ompi\u COMM\u TYPE\u SOCKET
。导入它并在调用
comm.Split_type()
时使用它:

导入ompi
socketcomm=comm.Split_类型(ompi.comm_类型_插槽)
用C编写Python模块 这有点复杂,但是您可以编写一个包含
mpi.h
的C模块,并将
OMPI\u COMM\u TYPE\u SOCKET
的值导出为Python常量。关于如何用C编写扩展,请参阅

使用CFFI模块 让您构建Python模块,包装C库并为您编写所有粘合代码。将以下内容放入名为
ompi\u build.py
的文件中:

来自cffi导入FFI
ffi=ffi()
外国金融机构设置来源(“ompi”,r“包括”)
外国金融机构(
r”“”
const int OMPI_COMM_类型线程;
…这里有更多常数。。。
const int OMPI_通信类型_插座;
…这里还有更多常数。。。
"""
)
如果名称=“\uuuuu main\uuuuuuuu”:
ffi.compile(verbose=True)
像这样跑:

$ CC=mpicc python ompi_build.py
这将创建C模块
ompi.C
,并将其编译成可加载的DSO。然后可以导入它并访问常量,如下所示:

$ CC=mpicc python ompi_build.py
从ompi.lib导入ompi\u COMM\u TYPE\u套接字
socketcomm=comm.Split_类型(OMPI_comm_类型_插座)
CFFI提供了与Python的
distutils
的集成,您可以让它在设置过程中自动构建C模块

使用Cython 这就是
mpi4py
本身编写的内容。它将C和Python混合到一个神秘的语法中。阅读源代码。试着弄清楚发生了什么,如何自己写东西。我帮不了你



无论您选择哪种路径,请记住,所有这些都与运行程序的系统有关,而不仅仅是与开发程序的系统有关。

mpi4py
仅提供了标准MPI功能的包装<代码>OMPI通信类型\u套接字
是一种开放MPI特定的拆分类型。如果您知道它的数值,因为它只是C
enum的一个成员,那么您仍然可以在
mpi4py
中使用它:

/*
*通信器拆分类型常量。
*在不修改mpif.h.in的情况下,请勿更改这些文件的顺序
*(另请参见mpif common.h.fin)。
*/
枚举{
MPI\u通信类型\u共享,
OMPI_COMM_类型螺纹,
OMPI通信类型核心,
OMPI通信类型缓存,
OMPI_COMM_TYPE_L2CACHE,
OMPI通信类型三级缓存,
OMPI\u COMM\u TYPE\u SOCKET,//此处
OMPI_COMM_TYPE_NUMA,