我的应用程序使用单边通信(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库ver5.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)发布于 2016-01-26 01:47:53
函数MPI_Win_unlock将阻塞,直到访问时代的所有RMA操作已经完成。
因此,您的分析器将显示此功能花费了大部分时间,这并不奇怪。它将阻塞,直到MPI实现完成了自相应的MPI_Win_lock以来发布的所有单边通信操作。
请注意,单边操作(Put、Get等)只会分派操作,在操作完成之前不会阻塞。因此,这些操作实际上非常类似于没有MPI_Isend对象的非阻塞通信函数( MPI_Request /MPI_Irecv)。要继续这个类比,MPI_Win_unlock将等待所有操作完成,类似于一个MPI_Wait_all。
https://stackoverflow.com/questions/35005654
复制相似问题