Как передать информацию 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-программу.

 mgilson17 сент. 2012 г., 15:43
Нет, я имею в виду сделатьsayhello функция, которая принимает 0 аргументов. напримерvoid sayhello(){ ...; MPI_Comm_size(MPI_COMM_WORLD,&size);... }
 mgilson17 сент. 2012 г., 15:45
Одна проблема здесь заключается в том, что типMPI_COMM_WORLD имеет типMPI_Comm который может быть что угодно. Возможноtypedefедь к ,,intlonglong long ... или это может быть какой-тоstruct (стандарт неСказать) `. Вероятно, это 4-байтовое целое число в большинстве систем, чтобы быть совместимым с привязками Фортрана, но это 'Это точно не гарантировано.
 WanderingMind17 сент. 2012 г., 15:41
Я только что попробовал, но какой тип данных я должен дать для MPI_COMM_WORLD в sayhello, без которого он выдает ошибку при компиляции кода C
 mgilson17 сент. 2012 г., 16:06
Я сомневаюсь, что этоэто лучший способ, но я нене знаю, как еще это сделать.
 WanderingMind17 сент. 2012 г., 15:53
Здорово. MPI_COMM_WORLD, который вы предложили, теперь работает. Спасибо. Но является ли это наилучшим способом отправки информации MPI из оболочки Python в код C? Знаете ли вы какие-нибудь книги или онлайн-учебники, которые подробно разбираются с этим?
 mgilson17 сент. 2012 г., 15:13
Вы пробовали это без коммуникатора? например жестко прописыватьMPI_COMM_WORLD в ?sayhello
 Hristo Iliev18 сент. 2012 г., 12:10
@mgilson, хотя и не зафиксировано в стандарте, в большинстве реализаций дескрипторы C-коммуникатора фактически реализованы как typedef 'd указатели, а дескрипторы Фортрана - это целочисленные индексы в таблицах указателей. ЕстьMPI_Comm_f2c() а такжеMPI_Comm_c2f() вызовы для преобразования между целыми числами Fortran и дескрипторами C, независимо от того, как на самом деле реализованы дескрипторы C (а в системах LP64 указатели даже не имеют такой же размер, как Fortran)INTEGER

Ответы на вопрос(1)

Решение Вопроса

s MPI.COMM_WORLD (который является экземпляром mpi4py 'с классом связи) в MPI_COMM_WORLD (который являетсяint справиться). Это может быть сделано путем создания оболочки с SWIG.Учебник по mpi4py в основном тот же пример, что и у вас, но с добавленным файлом интерфейса SWIG.

Если ты'Если вы не используете SWIG, вы можете выполнить преобразование в коде C. Если вы посмотрите на файл mpi4py.i, который импортирует пример SWIG, вы увидите, что преобразование выполнено.PyMPIComm_Getmpi4py источник приходит спример, который не использует SWIG.

Ваш ответ на вопрос