我的动机是将MPI信息有效地从python传递到通过ctypes调用的C函数。 我将mpi4py用于python中的MPI绑定。 我想通过一个用C编写并通过python中的ctypes调用的简单示例MPI代码来学习它。 我已经详细说明了以下步骤以及在下面运行时遇到的错误。

C代码 [ passMpi4Py.c ]

#include <stdio.h>
#include <mpi.h>

void sayhello(MPI_Comm comm)
{
  int size, rank;
  MPI_Comm_size(comm, &size);
  MPI_Comm_rank(comm, &rank);
  printf("Hello, World! "
         "I am process %d of %d.\n",
         rank, size);
}

我用gcc / openmpi-1.6编译了上面的c代码,如下所示:

mpicc-共享-Wl,-soname,passMpi4Py -o passMpi4Py.so -fPIC passMpi4Py.c

Python包装器 [ passMpi4PyWrapper.py ]

import ctypes
from mpi4py import MPI
testlib = ctypes.CDLL('path-to-file/passMpi4Py/passMpi4Py.so')

testlib.sayhello(MPI.COMM_WORLD)

当我尝试通过使用以下代码运行上述代码时

mpirun -np 4 python passMpi4PyWrapper.py

我收到以下错误

Traceback (most recent call last):
Traceback (most recent call last):
  File "passMpi4PyWrapper.py", line 5, in <module>
Traceback (most recent call last):
  File "passMpi4PyWrapper.py", line 5, in <module>
  File "passMpi4PyWrapper.py", line 5, in <module>
Traceback (most recent call last):
    testlib.sayhello(MPI.COMM_WORLD)
ctypes.ArgumentError: argument 1: <type 'exceptions.TypeError'>: Don't know how to convert parameter 1
    testlib.sayhello(MPI.COMM_WORLD)
ctypes.ArgumentError: argument 1: <type 'exceptions.TypeError'>: Don't know how to convert parameter 1
    testlib.sayhello(MPI.COMM_WORLD)
ctypes.ArgumentError: argument 1: <type 'exceptions.TypeError'>: Don't know how to convert parameter 1
  File "passMpi4PyWrapper.py", line 5, in <module>
    testlib.sayhello(MPI.COMM_WORLD)
ctypes.ArgumentError: argument 1: <type 'exceptions.TypeError'>: Don't know how to convert parameter 1

更新:

在C程序MPI函数中使用* MPI_COMM_WORLD *代替comm可以帮助我消除错误。 但是,我仍然想知道这是否是将MPI信息传递给C程序的最佳方法。

#1楼 票数:5 已采纳

您缺少将Python的MPI.COMM_WORLD(这是mpi4py的Comm类的实例)映射到MPI_COMM_WORLD(这是一个int句柄)的方法。 这可以通过使用SWIG生成包装器来完成。 mpi4py教程的示例与您的示例基本相同,但是添加了SWIG接口文件。

如果您不想使用SWIG,则可以使用C代码执行转换。 如果查看SWIG示例正在导入的文件mpi4py.i,可以看到使用PyMPIComm_Get完成了PyMPIComm_Get mpi4py源附带了一个不使用SWIG的示例

  ask by WanderingMind translate from so

未解决问题?本站智能推荐:

1回复

如何从Python调用MPI.so文件?

我有一个共享的目标文件,其中包含已编译的C ++ MPI Hello World代码。 当我尝试使用ctypes从Python调用它时,我得到了一些无用的错误列表。 mpiHello.cpp: 编译命令: mpic++ -fPIC -o mpi.so mpiHello.cpp -sha
1回复

将FILE*传递给Python/ctypes中的函数

我有一个库函数(用C编写),它通过将输出写入FILE *来生成文本。 我想在Python(2.7.x)中使用创建临时文件或管道的代码将其包装,将其传递给函数,从文件中读取结果,并将其作为Python字符串返回。 这是一个简单的例子来说明我的目标: Python包装器: 我想知道我最
1回复

Python和ctypes:如何正确地将“指针指针”传递给DLL?

我有一个DLL分配内存并返回它。 DLL中的函数是这样的: 另外,我有一个从我的DLL访问此函数的python代码: 我期待print将显示“4 0 1 2 3”,但它显示“4 221 221 221 221”O_O。 什么提示我做错了什么?
1回复

使用ctypes和Python将字符串传递给FortranDLL

我正在尝试使用ctypes在Python 2.7中加载DLL。 DLL是使用Fortran编写的,并且有多个子例程。 我能够成功设置一些导出的函数,即long和double指针作为参数。 import ctypes as Cimport numpy as npdll = C.windll.L
1回复

Ctypes:分配double**,将其传递给C,然后在Python中使用

编辑3 我有一些C ++代码(以C表示),可以从python访问。 我想在python中分配一个double** ,将其传递给C / C ++代码以复制类内部数据的内容,然后在python中使用它,类似于我将使用列表列表的方式。 不幸的是,我无法指定python内部数组的大小,因此在对
1回复

Python3.7-使用ctypes将参数传递给DLL

我有以下代码: 函数GetOutput定义为 我收到以下错误,要求您的帮助。 如果我将num1转换为: 我收到以下错误: 如果我将num1转换为数组,如下所示: 我收到以下错误: 请尽可能多地向我解释编程知识,并且仅对OOPS,列表,元组,指针等有非常初步的/基本的了
1回复

无法使用ctypes将参数传递给dll(Python)

使用ctypes时遇到一些问题 我有一个带有以下界面的testdll 我也有一个.def文件,所以我有“真正的”名字 我可以通过ctype从dll加载和访问函数,但我无法传递参数,请参阅python输出 但我可以在没有参数的情况下添加功能吗?!?!?!?! 有人能指出我正确的
1回复

如何使用ctypes将void*来回传递给python中的共享库?

我相信基本过程是: 但是,当我调用此代码时,它将破坏void *指针。 从关联的C代码进行调试,我得到: 显然,由于指针不正确,所以free()调用失败。 我已经尝试了几种变体,例如,定义了一个结构,例如: ...但是结果似乎总是一样。 Python会读取该指针,但仅保留3