2017-06-02 165 views
0

在我的C++应用程序中,我应该每次都在进程间共享信息。使用MPI_Send和MPI_Recv可以很好地工作,但在我的工作中,发送/接收消息时不需要由进程形成的“同步障碍”。即使使用MPI_Isend类型等,程序中也会出现“同步障碍”。有没有办法在使用MPI的并行过程中共享内存?

找到的解决方案是将信息放在文件上(无需消息共享数据),以便进程可以在不等待另一个人到达特定的代码点的情况下获取/放置数据。它也可以工作,但它会使程序失去时间表现,这个想法恰恰相反。

因此,有一个内存空间(或方式),可以工作类似于上面描述的文件应用程序?不需要通过消息使流程进行通信,并且确保安全?

PS:“同步屏障”我的意思是一个进程必须等待另一个发送/ recv信息的时间。

+0

如果所有进程都在一台计算机上,则可以使用POSIX共享内存。 –

+0

@MarkSetchell如果OP限于一台机器,并且不想使用显式消息,那么他不应该首先使用MPI。 – Zulan

+0

@赞兰我同意这一点,所以我没有把它作为答案。但是,如果他已经使用MPI编写了他的应用程序,并且想通过分享一些内存来加速其中的一部分,我的建议可能会有所帮助。 –

回答

1

是的,可以在没有与MPI同步的情况下访问存储器。这称为单向通信或RMA(远程内存访问)。称为窗口的存储区域必须明确可用于此,例如,使用MPI_Win_create。内存访问是使用像MPI_PutMPI_Get这样的函数明确指定的。请注意,它们中的每一个都是非阻塞的,并且数据移动必须显式同步。总体而言,存在相当多的样板和陷阱,因此请仔细阅读材料。

这里是更多detailed introduction

+0

谢谢你的回答。您的建议似乎是一个很好的选择,而不是使用文件。我会尝试研究和评估它是否适合我的应用。 – GLMF

+0

我认为这对我有好处,我正在学习。我意识到,对于我的应用程序来说,使用锁定/解锁获胜的被动目标会很有趣,但我不知道什么意思是像“原子操作”这样的术语,并且我不太确定会发生什么,例如,当我需要编写一些本地信息,并同时具有读取或写入过程。你有另外一种材料可以更好地解释吗? – GLMF

相关问题