我的应用程序使用单向通信(MPI_Rget,MPI_Raccumulate)和MPI_Win_Lock和MPI_Win_Unlock等同步原语进行被动目标同步。
我描述了我的应用程序,发现大部分时间都花在了MPI_Win_Unlock函数(而不是MPI_Win_Lock)上,我无法理解为什么。
(1)有谁知道为什么MPI_Win_Unlock函数需要这么多时间? (也许是它的实施问题) (2)如果我移动S / C / P / W同步模型,这种情况会好转吗? 我只需要确保所有单面操作不会同时重叠。
我使用的是英特尔的MPI Library ver 5.1,它实现了MPI V3。
我附上了我的代码的一些片段(实际上它是全部:D)
Each MPI process runs 'Run()'
Run ()
// Join
For each Target_Proc i in MPI_COMM_WORLD
RequestDataFrom ( (i + k) % nprocs ); // requests k-step away neighbor's data asynchronously
ConsumeDataFrom (i);
JoinWithMyData (my_rank, i);
WriteBackDataTo (i);
goto the above 'For loop' again if the termination condition does not hold.
MPI_Barrier(MPI_COMM_WORLD);
// Update Data in Window
UpdateMyWindow (my_rank);
RequstDataFrom (target_rank_id)
MPI_Win_Lock (MPI_LOCK_SHARED, target_rank_id, win)
MPI_Rget (from target_rank_id, win, &requests[target_rank_id])
MPI_Win_Unlock (target_rank_id, win)
ConsumeDataFrom (target_rank_id)
MPI_Wait (&requests[target_rank_id])
GetPointerToBuffer (target_rank_id)
WriteBackDataTo (target_rank_id)
MPI_Win_Lock (MPI_LOCK_EXCLUSIVE, target_rank_id, win)
MPI_Rput (from target_rank_id, win, &requests[target_rank_id])
MPI_Win_Unlock (target_rank_id, win)
UpdateMyWindow ()
MPI_Win_Lock (MPI_LOCK_EXCLUSIVE, target_rank_id, win)
Update()
MPI_Win_Unlock (target_rank_id, win)
答案 0 :(得分:3)
函数MPI_Win_unlock
将阻止,直到访问时期的所有RMA操作都已完成。
因此,您的探查器将显示此功能占用大部分时间并不奇怪。它将阻止,直到MPI实现完成自相应MPI_Win_lock
以来发布的所有单向通信操作。
请注意,单面操作(Put,Get等)只会调度操作而不会阻塞直到操作完成。因此,这些操作实际上非常类似于没有MPI_Isend
对象的非阻塞通信功能(MPI_Irecv
/ MPI_Request
)。要继续进行类比,MPI_Win_unlock
等待所有操作完成,类似于MPI_Wait_all
。