如何通过 cython 将 MPI 通信器从 python 传递到 C?

2023-12-02

我正在尝试包装一个 C 函数MPI_Comm通过 cython 通信器句柄作为参数。因此,我希望能够从 python 调用该函数,并将其传递给mpi4py.MPI.Comm目的。我想知道的是,如何进行转换mpi4py.MPI.Comm to MPI_Comm.

为了进行演示,我使用一个简单的“Hello World!”类型函数:

helloworld.h:

#ifndef HELLOWORLD
#define HELLOWORLD
#include <mpi.h>

void sayhello(MPI_Comm comm);

#endif

helloworld.c:

#include <stdio.h>
#include "helloworld.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);
}

我现在想从 python 中调用这个函数,如下所示:

from_python.py:

import mpi4py
import helloworld_wrap

helloworld_wrap.py_sayhello(mpi4py.MPI.COMM_WORLD)

意思是mpirun -np 4 python2 from_python.py应该给出类似的东西:

你好世界!我是 4 个进程中的第 0 个进程。
你好世界!我是 4 个进程中的第 1 个。
你好世界!我是 4 个进程中的第 2 个。
你好世界!我是 4 个进程中的第 3 个。

但如果我尝试通过 cython 来实现这一点,如下所示:

helloworld_wrap.pyx:

cimport mpi4py.MPI as MPI
cimport mpi4py.libmpi as libmpi

cdef extern from "helloworld.h":
   void sayhello(libmpi.MPI_Comm comm)

def py_sayhello(MPI.Comm comm):
    sayhello(comm)

and:

setup.py:

import os
from distutils.core import setup
from distutils.extension import Extension
from Cython.Distutils import build_ext

mpi_compile_args = os.popen("mpicc --showme:compile").read().strip().split(' ')
mpi_link_args    = os.popen("mpicc --showme:link").read().strip().split(' ')

ext_modules=[
    Extension("helloworld_wrap",
              sources            = ["helloworld_wrap.pyx", "helloworld.c"],
              language           = 'c',
              extra_compile_args = mpi_compile_args,
              extra_link_args    = mpi_link_args,
          )
]

setup(
  name = "helloworld_wrap",
  cmdclass = {"build_ext": build_ext},
  ext_modules = ext_modules
)

我收到以下错误消息:

helloworld_wrap.pyx:8:13:无法将 Python 对象转换为“MPI_Comm”

表明mpi4py.MPI.Comm无法转换成MPI_Comm。那么我该如何转换mpi4py.MPI.Comm进入一个MPI_Comm为了让我的包装工作?


The conversion is rather simple, as a mpi4py.MPI.Comm-object internally stores an MPI_Comm handle as member ob_mpi1. Therefore, if one changes the last line of helloworld_wrap.pyx to pass comm.ob_mpi instead of comm, the module compiles and works as intended:

helloworld_wrap.pyx:

cimport mpi4py.MPI as MPI
cimport mpi4py.libmpi as libmpi

cdef extern from "helloworld.h":
   void sayhello(libmpi.MPI_Comm comm)

def py_sayhello(MPI.Comm comm):
    sayhello(comm.ob_mpi)

令人惊讶的是,我没有找到任何相关文档,但只是在研究时才意识到这一点的来源mpi4py.MPI.Comm。我不确定这是否是处理此问题的预期方法,但我无法让它正常工作。


1 In fact, most, if not all objects in mpi4py.MPI that model a corresponding MPI handle in C, hold a corresponding handle as member ob_mpi.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何通过 cython 将 MPI 通信器从 python 传递到 C? 的相关文章

  • 有没有办法找到dll公开的所有函数

    我一直在寻找一种方法来获取映射到 dll 中函数名称的所有字符串 我的意思是您可以调用 GetProcAddress 的所有字符串 如果你对 dll 进行十六进制转储 符号 字符串 就在那里 但我认为必须有一个系统调用来获取这些名称 如果您
  • 将视频上传/保存到数据库或文件系统

    我以前从未尝试过保存视频 所以我对此了解不多 我知道如果视频很小 我可以转换为字节数组并保存到数据库 但是为了提高效率 我想了解如何将任何上传的视频保存到我的服务器文件中 然后只保存该文件的文件路径我的数据库表中的视频 我完全不知道如何开始
  • 收到“/:未找到事件。”使用 PyCharm 远程调试器时

    当我使用 PyCharm 通过 ssh 进行远程调试时tcsh shell 服务器 很多时候它停止工作 并显示 未找到事件 更具体地说 我在 pycharm 调试控制台中遇到以下内容 ssh username hostserver 22 p
  • 如何生成可变参数包?

    给定不相关的输入是否可以生成非类型参数包 我的意思是 我想改变这一点 template
  • 将 std::pair const 转换为 std::pair const 安全吗?

    理论上或实践上 安全吗reinterpret cast a std pair
  • CryptoJS 和 Pycrypto 一起工作

    我正在使用 CryptoJS v 2 3 加密 Web 应用程序中的字符串 并且需要在服务器上使用 Python 对其进行解密 因此我使用 PyCrypto 我觉得我错过了一些东西 因为我无法让它工作 这是JS Crypto AES enc
  • Cookie 在 ASP.net 中失去价值

    我有以下设置 cookie 的代码 string locale DropDownList this LoginUser FindControl locale SelectedValue HttpCookie cookie new HttpC
  • 返回吃异常

    我至少发现了以下行为weird def errors try ErrorErrorError finally return 10 print errors prints 10 It should raise NameError name E
  • ef core 在更新数据库期间不使用 ASPNETCORE_ENVIRONMENT

    我使用 Visual Studio 通过一定的迁移来更新我的所有环境 使用下面的命令效果很好 update database Migration initMigrationProduct c ProductContext Environme
  • 如何使用资源模块来衡量函数的运行时间?

    我想使用Python代码测量函数的CPU运行时间和挂钟运行时间 此处建议资源模块 如何以 Python 代码 不是从终端 的形式分别测量函数的 CPU 运行时间和挂钟运行时间 https stackoverflow com q 192046
  • 当分配返回 0 时,具有空异常规范的运算符 new 调用构造函数

    我有以下声明 void operator new size t s PersistentMemory m throw return m gt allocatePersistentMemory s 我正在测试启动时的内存耗尽 这会导致m gt
  • 链接到ntdll.lib并调用ntdll.dll内部的函数

    我最近正在对私有 API 进行一些研究 我尝试调用诸如NtOpenFile在 ntdll dll 中LoadLibrary and GetProcAddress在运行时 幸运的是 它成功了 今天早上我在电脑上进行了文件搜索 发现ntdll
  • 如何在 stl 模板中使用导出类 (__declspec(dllexport))?

    我正在使用导出的类 class declspec dllexport myclass private template declspec dllexport class std map
  • 为什么我无法通过 lambda 捕获“this”指针?

    考虑以下代码 class A public void foo auto functor this A a this auto functor a The compiler won t accept this instead of a a g
  • Python Pandas:向类 pandas.core.series.Series 添加方法

    我想在 Python 中处理时间序列 因此 Pandas 的 Series 类非常完美 并且有很多有用的方法 现在我想添加一些我需要但未实现的方法 例如 假设我有兴趣添加一个方法 该方法将两次一值附加到时间序列中 让我们调用该方法appen
  • 如何使用 .NET 捕获我的桌面视频?

    我想知道是否有任何方法可以使用 NET 捕获我的桌面的视频 截屏视频 我并不是在寻找截屏软件 而只是在寻找一种可以让我自己生成桌面视频的技术 我想过拍摄多个屏幕截图 但我不确定如何以编程方式生成带有图像序列的视频 有人有主意吗 Thanks
  • 调用泛型类的方法

    这是上下文 我尝试编写一个映射器来动态地将域模型对象转换为 ViewModel 对象 我遇到的问题是 当我尝试通过反射调用泛型类的方法时 出现此错误 System InvalidOperationException 无法对 Contains
  • 将 .parquet 编码为 io.Bytes

    目标 将 Parquet 文件上传到 MinIO 这需要将文件转换为字节 我已经能够做到这一点了 csv json and txt bytes data to csv encode utf 8 bytes json dumps self d
  • 如何使用实体框架设置连接字符串

    我将 EF6 与 MySQL 结合使用 并有一个用于多个数据库的模型 我希望能够在我的表单中设置连接设置 如何以编程方式设置模型的连接字符串 你应该使用EntityConnectionFactory这就是您所需要的 public strin
  • 真实值与预测值的降维可视化

    我有一个数据框 如下所示 label predicted F1 F2 F3 F40 major minor 2 1 4 major major 1 0 10 minor patch 4 3 23 major patch 2 1 11 min

随机推荐

  • pip install pydot 引发语法错误

    我从命令行运行 pip 尝试安装 pydot 因为 Django 的 django extensions 需要它来生成 UML 类图 当我运行命令时pip install pydot 它给了我这个错误 Collecting pydot Us
  • 用鼠标移动图片框

    我正在开发一个适用于 Windows Mobile Compact Framework 2 0 的应用程序 它有一个带有 PictureBox 的 WinForms 我想移动PictureBox的图像 但我不知道该怎么做 所以我选择移动Pi
  • Feed RDLC(本地)报告来自列表(实体框架)的报告

    我给自己找了一个BiningList学生 实体框架创建的类 我只想喂饱我的RDLC从中报告而不是使用DataSet或存储过程 该类包含多个属性 例如 string Name string FamilyName string Mid Date
  • Apache Rewrite:基于HTTP主机的图像目录

    我的软件支持多个域名 所有域名都指向服务器上的同一目录 当然每个域名都有不同的数据库 那么这些域 www example1 com www example2 com www example3 com 都指向 public html 在图像目
  • 如何检查 Reddit 帖子是否仅包含图像而没有其他内容?

    背景 我目前正在使用prawPython 3 7 的库 我的机器人需要做的一件事是检查某些 Reddit 子版块上的最新帖子 看看它们是否包含只是一个图像 没有其他任何东西 鉴于 Reddit 上有不同类型的帖子 仅上传图像的帖子和带有图像
  • 简单注入器身份 UserManager 注册错误

    我正在遵循洋葱架构并使用身份框架 在我的核心项目中 我有 public interface IUserRepository IDisposable Repository methods 在我的 Architecture Repository
  • 访问多维数组中任意深度的键

    如果我有一个包含以下内容的数组 key1 key2 key3 有什么方法可以将其映射到数组 array key1 key2 key3 不使用循环或 eval 数组示例 var key1 gt subkey1 gt finalkey gt v
  • 循环结构的迭代器

    以下代码显示了我目前拥有的内容 它是一个适配器 循环数据结构 main 函数展示了它是如何使用的 这 一切都很好而且很快 但我真的很想让迭代器结束 定义的结构circ 到目前为止涉及的所有方法 某种计数方案 如果使用循环器则计算范围 构建一
  • 使用 Visual Studio sdk 取消修饰函数名称

    要取消修饰 Visual Studio 生成的损坏的 C 名称 您可以使用undname exe 但是 如果您想避免每次需要未装饰时创建完整进程的开销 该怎么办 Visual Studio SDK 中是否有任何等效功能 VS2005 应该支
  • 哪些 Grails 项目文件不应该添加到版本控制中? (Grails 1.3.x)

    这个问题之前已经被问过 但不久前 对 Grails gitignore 的建议 这是针对 grails 1 0 x 的回答 Grails 1 3 x 项目中的哪些文件不应包含在版本控制中 See http grails org Checki
  • 静态类成员上未解析的外部符号

    非常简单地说 我有一个主要由静态公共成员组成的类 因此我可以将类似的函数组合在一起 但仍然需要从其他类 函数调用它们 无论如何 我在类公共作用域中定义了两个静态 unsigned char 变量 当我尝试在同一个类的构造函数中修改这些值时
  • Python 多处理模块的开销

    我正在使用multiprocessingPython 中的模块 并期望启动进程 创建队列以及向队列中放入值或从队列中获取值会产生一些开销 但是 如果子流程有足够的工作要做 我预计开销最终会被消除 运行一个简单的示例 如下所述 我生成的进程的
  • 不阻塞地获取进程输出

    我想获得一个进程的输出 Git exe准确地说 并将其转换为 String 对象 以前有时我的代码被阻止 然后我发现这是因为这个过程 ErrorStream有一些输出 我必须手动捕获它 我对此不感兴趣 我将我的代码更改为 public st
  • rand() 是如何工作的?它有一定的倾向吗?有没有更好用的东西?

    我读到它与时间有关 你也可以从包含 time h 中得到 所以我假设了这么多 但它到底是如何工作的呢 另外 它是否有奇数或偶数或类似数字的倾向 最后 C 标准库或 Foundation 框架中是否有更好的分布 简要地 You use tim
  • 输入可点击的电子邮件和网址

    我有一个用 PHP 处理的表单 用户有时会将他们的电子邮件地址放在表单或 URL 中 在我删除标签的输入后 这些通常会以文本形式出现 最近 我的用户开始要求我在打开显示其输入的页面 现在从数据库中提取 时使他们的 URL 和电子邮件可点击
  • 约束规划:在最短的时间内安排发言人

    我正在尝试通过以下方式调整已经解决的约束规划问题哈坎 凯勒斯特兰德 hakankless 并且需要一些帮助 原来解决的问题 有6个公共演讲者和6个房间 每个发言者应分配到一个房间 没有任何房间是空的 每个发言者只能在一个房间内 解决方案在这
  • 如何在 Java 中使用带有托盘图标的上下文菜单?

    我正在使用 Netbeans 开发 Java 应用程序 我想在系统托盘上创建一个托盘图标 并且当我右键单击托盘图标时将显示一个弹出菜单 我通过拖放创建了一个 jframe 和弹出菜单 但我有一个问题 我的弹出菜单有 2 个菜单项 Exit
  • 什么二进制数只能表示为近似值?

    以十进制表示 以 10 为底 1 3只能近似为 0 33333 次重复 只能以近似值表示的二进制数相当于什么数 0 1 就是这样的一个例子 还有 0 2 这个问题也类似于这另一个问题 已经有了很好的答案
  • 对于具有大量字段的对象,是否有更好的方法来实现 Equals?

    也可以看看C 中如何快速检查数据传输的两个对象是否具有相同的属性 我有很多数据传输对象 DTO 每个对象都包含很多简单的字段 我需要对所有这些实现 Equals 这样我就可以编写一些单元测试来传输它们 var WCF 我正在使用的代码是 p
  • 如何通过 cython 将 MPI 通信器从 python 传递到 C?

    我正在尝试包装一个 C 函数MPI Comm通过 cython 通信器句柄作为参数 因此 我希望能够从 python 调用该函数 并将其传递给mpi4py MPI Comm目的 我想知道的是 如何进行转换mpi4py MPI Comm to