4

私の動機は、MPI情報をPythonからctypesを介して呼び出されるC関数に効果的に渡すことです。PythonのMPIバインディングにmpi4pyを使用しました。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);
}

上記のcコードをgcc/openmpi-1.6で次のようにコンパイルしました。

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プログラムでcommの代わりに*MPI_COMM_WORLD*を使用すると、MPI関数はエラーを取り除くのに役立ちます。ただし、これがMPI情報をCプログラムに渡すための最良の方法であるかどうかを知りたいと思います。

4

1 に答える 1

5

PythonのMPI.COMM_WORLD(mpi4pyのCommクラスのインスタンス)をMPI_COMM_WORLD(intハンドル)にマップする方法がありません。これは、SWIGを使用してラッパーを生成することで実行できます。mpi4pyチュートリアルには、基本的に同じ例がありますが、SWIGインターフェイスファイルが追加されています。

SWIGを使用したくない場合は、Cコードで変換を実行できます。SWIGの例がインポートしているファイルmpi4py.iを見ると、変換がで行われていることがわかりますPyMPIComm_Getmpi4pyソースには、SWIGを使用しない例が付属しています。

于 2012-09-18T05:47:12.457 に答える