我的动机是将 MPI 信息从 python 有效地传递给通过 ctypes 调用的 C 函数。我在 python 中使用 mpi4py 进行 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 -shared -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 程序的最佳方法。