Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/mercurial/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何通过cython将MPI通信器从python传递到C?_Python_C_Mpi_Cython_Mpi4py - Fatal编程技术网

如何通过cython将MPI通信器从python传递到C?

如何通过cython将MPI通信器从python传递到C?,python,c,mpi,cython,mpi4py,Python,C,Mpi,Cython,Mpi4py,我试图通过cython将一个MPI\u Commcommunicator句柄作为参数来包装一个C函数。因此,我希望能够从python调用该函数,并向其传递一个mpi4py.MPI.Comm对象。我想知道的是,如何从mpi4py.MPI.Comm转换到MPI\u Comm 为了演示,我使用了一个简单的“Hello World!”类型函数: helloworld.h: \ifndef HELLOWORLD #定义HELLOWORLD #包括 void sayhello(MPI_通信); #恩迪夫

我试图通过cython将一个
MPI\u Comm
communicator句柄作为参数来包装一个C函数。因此,我希望能够从python调用该函数,并向其传递一个
mpi4py.MPI.Comm
对象。我想知道的是,如何从
mpi4py.MPI.Comm
转换到
MPI\u Comm

为了演示,我使用了一个简单的“Hello World!”类型函数:

helloworld.h

\ifndef HELLOWORLD
#定义HELLOWORLD
#包括
void sayhello(MPI_通信);
#恩迪夫
helloworld.c

#包括
#包括“helloworld.h”
void sayhello(MPI_通信){
整数大小、等级;
MPI_通信大小(通信和大小);
MPI_通信等级(通信和等级);
printf(“你好,世界!”
“我正在处理%d个进程,共%d个。\n”,
级别、大小);
}
我现在想从python中调用此函数,如下所示:

来自_python.py

导入mpi4py
导入helloworld\u包装
helloworld\u wrap.py\u sayhello(mpi4py.MPI.COMM\u WORLD)
这意味着来自_python.py的
mpirun-np 4 python2应该给出如下内容:

你好,世界!我是4个进程中的0个。
你好,世界!我是流程1/4。
你好,世界!我是流程2/4。
你好,世界!我是4个过程中的第3个

但如果我试图通过cython实现这一点,就像这样:

helloworld\u wrap.pyx

cimport mpi4py.MPI作为MPI
cimport mpi4py.libmpi作为libmpi
“helloworld.h”中的cdef外部程序:
void sayhello(libmpi.MPI_Comm)
def py_sayhello(MPI.Comm Comm):
你好(通讯)
以及:

setup.py

导入操作系统
从distutils.core导入设置
从distutils.extension导入扩展
从Cython.Distutils导入生成\u ext
mpi_compile_args=os.popen(“mpicc--showme:compile”).read().strip().split(“”)
mpi_link_args=os.popen(“mpicc--showme:link”).read().strip().split(“”)
外部模块=[
扩展(“helloworld_wrap”,
sources=[“helloworld_wrap.pyx”,“helloworld.c”],
语言='c',
额外编译参数=mpi编译参数,
额外链接参数=mpi链接参数,
)
]
设置(
name=“helloworld\u wrap”,
cmdclass={“build\u ext”:build\u ext},
外部模块=外部模块
)
我收到以下错误消息:

helloworld_wrap.pyx:8:13:无法将Python对象转换为“MPI_Comm”


表示无法将
mpi4py.MPI.Comm
转换为
MPI\u Comm
。因此,如何将
mpi4py.MPI.Comm
转换为
MPI_Comm
,以使包装器正常工作?

转换相当简单,因为
mpi4py.MPI.Comm
对象在内部将
MPI_Comm
句柄存储为成员
ob-MPI
1。因此,如果将
helloworld\u wrap.pyx
的最后一行更改为通过
comm.ob\u mpi
,而不是
comm
,则模块将按照预期进行编译和工作:

helloworld\u wrap.pyx

cimport mpi4py.MPI作为MPI
cimport mpi4py.libmpi作为libmpi
“helloworld.h”中的cdef外部程序:
void sayhello(libmpi.MPI_Comm)
def py_sayhello(MPI.Comm Comm):
你好(通讯员)
令人惊讶的是,我没有找到任何关于这方面的文档,只是在研究。我不确定,如果这是处理这个问题的预期方法,但我无法让它工作,否则



1事实上,
mpi4py.MPI
中的大多数对象(如果不是所有对象的话)在C中建模了相应的MPI句柄,作为成员持有相应的句柄。
ob\u mpi

根据我的经验,
mpi4py
的文档记录非常少,经常需要查看源代码以了解事情是如何工作的。@Zulan我也有这种感觉。我想,我至少应该在这里记录下来。