首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么MPI_Win_unlock这么低?

为什么MPI_Win_unlock这么低?
EN

Stack Overflow用户
提问于 2016-01-26 01:34:23
回答 1查看 315关注 0票数 2

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

代码语言:javascript
复制
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)
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35005654

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档