为什么MPI_Win_unlock如此之低?

时间:2016-01-26 01:34:24

标签: mpi

我的应用程序使用单向通信(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)

1 个答案:

答案 0 :(得分:3)

函数MPI_Win_unlock将阻止,直到访问时期的所有RMA操作都已完成。

因此,您的探查器将显示此功能占用大部分时间并不奇怪。它将阻止,直到MPI实现完成自相应MPI_Win_lock以来发布的所有单向通信操作。

请注意,单面操作(Put,Get等)只会调度操作而不会阻塞直到操作完成。因此,这些操作实际上非常类似于没有MPI_Isend对象的非阻塞通信功能(MPI_Irecv / MPI_Request)。要继续进行类比,MPI_Win_unlock等待所有操作完成,类似于MPI_Wait_all