So übergeben Sie MPI-Informationen an ctypes in Python

Meine Motivation ist es, MPI-Informationen effektiv von Python an C-Funktionen zu übergeben, die über ctypes aufgerufen werden. Ich habe MPI4PY für MPI-Bindungen in Python verwendet. Ich möchte es anhand eines einfachen Beispiel-MPI-Codes lernen, der in C geschrieben und in Python über ctypes aufgerufen wurde. Ich habe die Schritte und den Fehler, den ich beim Ausführen bekomme, unten detailliert beschrieben.

C-Code [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);
}

Ich habe den obigen c-Code mit gcc / openmpi-1.6 wie folgt kompiliert:

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)

Wenn ich versuche, den obigen Code unter Verwendung von auszuführen

mpirun -np 4 python passMpi4PyWrapper.py

Ich erhalte den folgenden Fehler

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

Aktualisieren:

Verwenden Sie * MPI_COMM_WORLD * anstelle voncomm im C-Programm helfen mir MPI-Funktionen, den Fehler zu beheben. Ich würde jedoch gerne wissen, ob dies der beste Weg ist, MPI-Informationen an ein C-Programm zu übergeben.

Antworten auf die Frage(1)

Ihre Antwort auf die Frage