在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()
吗?