Как передать информацию MPI в ctypes в Python
Моя мотивация - эффективно передавать информацию MPI из Python в функции C, вызываемые через ctypes. Я использовал mpi4py для привязки MPI в python. Я хотел бы изучить его с помощью простого примера MPI-кода, написанного на C и вызываемого через ctypes в python. Я подробно описал шаги и ошибку, которую я получаю при запуске ниже.
Код C [passMpi4Py.c]
#include
#include
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);
}
Я скомпилировал приведенный выше код c с помощью gcc / openmpi-1.6 следующим образом:
mpicc -shared -Wl, -soname, passMpi4Py -o passMpi4Py.so -fPIC passMpi4Py.c
Python Wrapper [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
Traceback (most recent call last):
File "passMpi4PyWrapper.py", line 5, in
File "passMpi4PyWrapper.py", line 5, in
Traceback (most recent call last):
testlib.sayhello(MPI.COMM_WORLD)
ctypes.ArgumentError: argument 1: : Don't know how to convert parameter 1
testlib.sayhello(MPI.COMM_WORLD)
ctypes.ArgumentError: argument 1: : Don't know how to convert parameter 1
testlib.sayhello(MPI.COMM_WORLD)
ctypes.ArgumentError: argument 1: : Don't know how to convert parameter 1
File "passMpi4PyWrapper.py", line 5, in
testlib.sayhello(MPI.COMM_WORLD)
ctypes.ArgumentError: argument 1: : Don't know how to convert parameter 1
Обновить:
Использование * MPI_COMM_WORLD * вместоПрдч в программе на языке Си функции MPI помогают мне устранить ошибку. Однако я все еще хотел бы знать, является ли это наилучшим из возможных способов передачи информации MPI в C-программу.