微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在 mpi4py 窗口上使用活动目标同步 Start() Complete() Post() Wait() 的正确方法是什么?

如何解决在 mpi4py 窗口上使用活动目标同步 Start() Complete() Post() Wait() 的正确方法是什么?

为什么这不起作用?

import numpy
from mpi4py import MPI

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

mpi_datatype = MPI.DOUBLE # use this for Allocate()
np_datatype = numpy.float64

if rank == 1:
    a = numpy.empty(9,dtype=np_datatype)
    window = MPI.Win.Create(a,comm=comm)
elif rank == 0:
    window = MPI.Win.Create(None,comm=comm)

if rank == 1:
    window.Post(group=group)
    window.Wait()
elif rank == 0:
    b = numpy.full(9,1.5,dtype=np_datatype)
    window.Start(group=group)
    window.Put(b,target_rank=1)
    window.Complete()

if rank == 1:
    val = a[0] # should be 1.5 if Put() worked...

我注意到,如果我删除 window.Complete() 和 window.Wait() 函数,这两个排名进程能够打印 numpy.empty() 值,这意味着它们能够运行直到完成 - 但是不正确。

我在网上找不到有关如何在 mpi4py 中使用活动目标同步功能的示例。顺便说一句,我让 Fence() 和 Lock() 同步功能正常工作。但我相信这种方法会更快,因为我的实际程序将成对同步排名进程(我不想全局同步)。欢迎任何建议。

解决方法

解决办法: 开始(组=EXPOSURE_EPOCH_PROCESS_GROUP)和发布(组=ACCESS_EPOCH_PROCESS_GROUP)

import numpy
from mpi4py import MPI

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

mpi_datatype = MPI.DOUBLE # use this for Allocate()
np_datatype = numpy.float64

if rank == 1:
    a = numpy.empty(9,dtype=np_datatype)
    window = MPI.Win.Create(a,comm=comm)
elif rank == 0:
    window = MPI.Win.Create(None,comm=comm)

if rank == 1:
    g1 = comm.group.Incl([0])
    window.Post(group=g1)
    window.Wait()
elif rank == 0:
    g2 = comm.group.Incl([1])
    b = numpy.full(9,1.5,dtype=np_datatype)
    window.Start(group=g2)
    window.Put(b,target_rank=1)
    window.Complete()

if rank == 1:
    val = a[0] # val = 1.5

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。