Como passar informações MPI para ctypes em python
Minha motivação é passar informações MPI efetivamente de python para funções C chamadas através de ctypes. Eu usei mpi4py para ligações MPI em python. Eu gostaria de aprender através de um código MPI de exemplo simples escrito em C e invocado através de ctypes em python. Eu detalhei os passos e o erro que recebo enquanto corro abaixo.
Código 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);
}
Eu compilei o código c acima com gcc / openmpi-1.6 como segue:
mpicc -shared -Wl, -soname, passMpi4Py -o passMpi4Py.so -fPIC passMpi4Py.c
Wrapper Python [passMpi4PyWrapper.py]
import ctypes
from mpi4py import MPI
testlib = ctypes.CDLL('path-to-file/passMpi4Py/passMpi4Py.so')
testlib.sayhello(MPI.COMM_WORLD)
Quando eu tento executar o código acima usando
mpirun -np 4 python passMpi4PyWrapper.py
Estou tendo o erro a seguir
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
Atualizar:
Usando * MPI_COMM_WORLD * em vez decomm nas funções MPI do programa C me ajuda a remover o erro. No entanto, eu ainda gostaria de saber se esta é a melhor maneira possível de passar informações MPI para um programa em C.