mpi4py 中的共享内存

2024-01-25

I use a MPI (mpi4py)脚本(在单个节点上),适用于非常大的对象。为了让所有进程都能访问该对象,我通过comm.bcast()。这会将对象复制到所有进程并消耗大量内存,尤其是在复制过程中。因此,我想分享一些像指针这样的东西,而不是对象本身。我发现了一些功能memoryview对于促进进程内对象的工作很有用。对象的实际内存地址也可以通过memoryview对象字符串表示形式,可以这样分布:

from mpi4py import MPI

comm = MPI.COMM_WORLD
rank = comm.Get_rank()

if rank:
    content_pointer = comm.bcast(root = 0)
    print(rank, content_pointer)
else:
    content = ''.join(['a' for i in range(100000000)]).encode()
    mv = memoryview(content)
    print(mv)
    comm.bcast(str(mv).split()[-1][: -1], root = 0)

这打印:

<memory at 0x7f362a405048>
1 0x7f362a405048
2 0x7f362a405048
...

这就是为什么我相信一定有一种方法可以在另一个过程中重构对象。但是,我在文档中找不到有关如何执行此操作的线索。

简而言之,我的问题是:是否可以在同一节点上的进程之间共享对象mpi4py?


这是使用 MPI 的共享内存的简单示例,稍作修改https://groups.google.com/d/msg/mpi4py/Fme1n9niNwQ/lk3VJ54WAQAJ https://groups.google.com/d/msg/mpi4py/Fme1n9niNwQ/lk3VJ54WAQAJ

您可以使用以下命令运行它:mpirun -n 2 python3 shared_memory_test.py(假设您将其保存为shared_memory_test.py)

from mpi4py import MPI 
import numpy as np 

comm = MPI.COMM_WORLD 

# create a shared array of size 1000 elements of type double
size = 1000 
itemsize = MPI.DOUBLE.Get_size() 
if comm.Get_rank() == 0: 
    nbytes = size * itemsize 
else: 
    nbytes = 0

# on rank 0, create the shared block
# on rank 1 get a handle to it (known as a window in MPI speak)
win = MPI.Win.Allocate_shared(nbytes, itemsize, comm=comm) 

# create a numpy array whose data points to the shared mem
buf, itemsize = win.Shared_query(0) 
assert itemsize == MPI.DOUBLE.Get_size() 
ary = np.ndarray(buffer=buf, dtype='d', shape=(size,)) 

# in process rank 1:
# write the numbers 0.0,1.0,..,4.0 to the first 5 elements of the array
if comm.rank == 1: 
    ary[:5] = np.arange(5)

# wait in process rank 0 until process 1 has written to the array
comm.Barrier() 

# check that the array is actually shared and process 0 can see
# the changes made in the array by process 1
if comm.rank == 0: 
    print(ary[:10])

应该输出这个(从进程等级 0 打印):

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

mpi4py 中的共享内存 的相关文章

随机推荐

  • 如何通过 FileZilla 访问 Google Kubernetes Engine FTP 服务器

    我创建了一个 gcePreviousDisk 并创建了一个集群并挂载它 这是yaml文件 参考https github com aledv kubernetes ftp https github com aledv kubernetes f
  • SubscribeOn 和 ObserveOn 有什么区别

    我刚刚发现SubscribeOn 这让我想知道我是否应该使用它而不是ObserveOn 谷歌带我去here http social msdn microsoft com Forums en US rx thread 6944f097 00f
  • 如何在观察者中处理具有不同状态值类型的 Observables

    首先是上下文和问题 框架代码在帖子底部 我们正在创建并实现一个 C 框架 以便在 Arduino 等环境中使用 为此 我想使用观察者模式 其中任何对传感器状态变化感兴趣的组件 Observables 可以注册自己 并且它将通过 Observ
  • Qt modbus串口流控处理

    我正在通过串行端口使用 QModbusDevice 编写一个小程序 使用QModbusRtuSerialMaster类 并有一些问题 问题之一似乎是串口的流量控制不正确 检查串行端口嗅探器时 我发现工作客户端在发送请求时打开 RTS 然后关
  • 为什么 mySet.erase(it++) 不是未定义的行为,或者确实如此?

    根据对于这个得到高度评价的答案 https stackoverflow com questions 2874441 deleting elements from stl set while iterating 2874533 2874533
  • 方向改变时替换布局

    我的应用程序有一个 webview 和 LinearLayout 内的一些按钮 问题是 我希望按钮在纵向模式下位于底部 在横向模式下位于左侧 同时 web 视图保持其状态 两种不同的布局不起作用 因为它会强制重新创建刷新 Web 视图的活动
  • 用诗歌管理 git 子模块的依赖关系

    我们有一个存储库app lib它在其他 4 个存储库中用作子模块 并且在每个存储库中我都必须添加子模块的所有依赖项 因此 如果我添加 删除依赖项app lib我必须调整所有其他存储库 我有办法告诉 Poetry 安装根存储库依赖项和子模块中
  • 使用 jQuery 选择 id 中带有百分号 (%) 的元素

    我有一个这样的元素 a href hello a 我一直在拼命尝试用 jQuery 选择它 但不能 我试过了 a my id obviously won t work a my id no such luck a my 20id unrec
  • MYSQL触发器更新复制整行

    我正在尝试创建一个触发器来将整行复制到任何UPDATE 我有2张桌子 Frequencies and Frequencies Audit 这是我的触发器 create trigger auditlog before update on fr
  • 通过 VueJS 2 重用模态

    我在 JSFiddle 使用 Vue 版本 1 中看到了重用模式 https jsfiddle net kemar d3jecL8n https jsfiddle net kemar d3jecL8n 但是当我换成Vue 2版本时 就不行了
  • GNUPLOT:从平滑累积中保存数据

    我绘制了实数均匀随机分布 n 1000 的简单累积和直方图 http www filedropper com random1 1 http www filedropper com random1 1 随机1天 宏是 unset key cl
  • React 组件是否会深入比较 props 以检查是否需要重新渲染?

    我想知道 React 组件是否扩展React Component在尝试决定是否需要重新渲染时对对象进行深入比较 例如 给定 const Foo bar gt return div bar baz div class App extends
  • Titanium Desktop 中的 SVG?

    我正在运行 Titanium Desktop 1 1 0 SDK 并且只有我的 SVG 文本元素可以正确呈现 SVG 方法 例如 getBBox 会给出错误消息 该应用程序在 Titanium 环境之外运行良好 即 Chrome Firef
  • 支持可选参数和.Net 4.0的C#模拟框架

    是否存在完全支持 Net 4 0 和 C 的 C 模拟框架 具体来说 我正在寻找它支持可选参数 我能够通过编写一个扩展方法来让 Moq 来处理这个问题 该方法接受方法名称以及参数名称和值的字典 did想要指定 并且扩展方法为您未指定的所有参
  • Docker Compose + Rails:迁移的最佳实践?

    我刚刚关注了这篇文章在 Docker 中运行 Rails 开发环境 https blog codeship com running rails development environment docker 好文章 效果很好 设置完所有内容后
  • 离子启动给出错误:生成的命令有错误:npminstall

    我正在尝试使用 ionic 和 cordova 创建一个移动应用程序 但是当我启动命令时 ionic start appname blank 下载后 npm 给我 Error with start undefined Error Initi
  • ActionBarSherlock 4.2 是否支持 SearchView 的搜索建议?

    一个月前 我将 ActionBarSherlock 4 2 添加到我的项目中 除了我的搜索建议之外 一切都正常工作了SearchView 我创建搜索建议的方式是使用Android文档中的方法 http developer android c
  • Windows Phone 7.1“发送到”功能?

    我被要求用 C 为 Windows Phone 7 1 编写一个原型应用程序 该应用程序可以通过 Android 的 共享 功能等功能获取数据 然后处理这些数据 例如 用户打开邮件应用程序并查看 PDF 附件 对于此附件 他按下应用程序的
  • 出现错误:部署到 heroku 时必须至少安装一个 postgresql-client-

    sdilshod sdilshod Lenovo B590 webapp saturn heroku run rake db migrate Running rake db migrate attached to terminal up r
  • mpi4py 中的共享内存

    I use a MPI mpi4py 脚本 在单个节点上 适用于非常大的对象 为了让所有进程都能访问该对象 我通过comm bcast 这会将对象复制到所有进程并消耗大量内存 尤其是在复制过程中 因此 我想分享一些像指针这样的东西 而不是对