gpt4 book ai didi

python - 如何将 MPI 信息传递给 python 中的 ctypes

转载 作者:太空狗 更新时间:2023-10-30 02:48:31 25 4
gpt4 key购买 nike

我的动机是将 MPI 信息有效地从 python 传递到通过 ctypes 调用的 C 函数。我在 python 中使用 mpi4py 进行 MPI 绑定(bind)。我想通过一个用 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);
}

我用gcc/openmpi-1.6编译了上面的c代码如下:

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 程序 MPI 函数中使用 *MPI_COMM_WORLD* 而不是 comm 可以帮助我消除错误。不过,我仍然想知道这是否是将 MPI 信息传递给 C 程序的最佳方式。

最佳答案

您缺少一种将 Python 的 MPI.COMM_WORLD(它是 mpi4py 的 Comm 类的一个实例)映射到 MPI_COMM_WORLD(它是一个 int 句柄)的方法。这可以通过使用 SWIG 生成包装器来完成。 mpi4py tutorial与您的示例基本相同,但添加了 SWIG 接口(interface)文件。

如果您不想使用 SWIG,可以在 C 代码中执行转换。如果您查看 SWIG 示例正在导入的文件 mpi4py.i,您可以看到转换是使用 PyMPIComm_Get 完成的。 mpi4py 源代码自带 an example that does not use SWIG .

关于python - 如何将 MPI 信息传递给 python 中的 ctypes,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12459906/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com