MPI中的单面沟通:按自己的意愿进行排名

在MPI中使用单面通信时,可以在本地等级上呼叫Get()Put()吗?对我来说似乎很自然。

但是,以下代码(使用mpi4py)无法正常工作。有两种情况取决于标志WILL_IT_FAIL的值:

  • WILL_IT_FAIL = 0在这种情况下,等级0将[1. 2. ... 9.]写入其自己的窗口(即使用Put调用target_rank=0)。等级1等待一秒钟,然后用Get调用target_rank=0,这会从等级0读取数组[1. 2. ... 9.]。这很好。

  • WILL_IT_FAIL = 1在这种情况下,等级0将[1. 2. ... 9.]写入等级1(即用Put调用target_rank=1)。等级1等待一秒钟,然后用Get呼叫target_rank=1。我希望它会产生[1. 2. ... 9.],但是会产生[0. 0. ... 0.]

import mpi4py.MPI as mpi
import numpy as np
import time

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

WILL_IT_FAIL = 0 # Fails if WILL_IT_FAIL = 1

def main():
    assert(comm.Get_size() == 2)

    buff = np.zeros(10,dtype='d')
    win = mpi.Win.Create(buff,comm=mpi.COMM_WORLD)

    if (rank == 0): 
        buff[:10] = np.arange(10)
        win.Lock(WILL_IT_FAIL)
        win.Put([buff,mpi.DOUBLE],target_rank=WILL_IT_FAIL)
        win.Unlock(WILL_IT_FAIL)
    else:
        time.sleep(1)
        print('buff (rank1) before:',buff)
        win.Lock(WILL_IT_FAIL)
        win.Get([buff,target_rank=WILL_IT_FAIL)
        win.Unlock(WILL_IT_FAIL)
        print('buff (rank1) after: ',buff)

    win.Free()

if __name__=='__main__':
    main()

为什么会这样?我不应该用Put()呼叫Get()local_rank = mpi.COMM_WORLD.Get_rank()吗?

ris2000 回答:MPI中的单面沟通:按自己的意愿进行排名

暂时没有好的解决方案,如果你有好的解决方案,请发邮件至:iooj@foxmail.com
本文链接:https://www.f2er.com/3141588.html

大家都在问