因为到目前为止我没有找到我的问题的答案而且我对这个问题感到疯狂,我只是问这个问题折磨我的想法; - )
我正在研究已经编程的节点消除算法的并行化。目标环境是一个集群。
在我的并行程序中,我区分主进程(在我的情况下为0级)和工作从属(除0之外的每个等级)。 我的想法是,主人正在跟踪哪些奴隶可用并发送然后工作。因此,出于某些其他原因,我尝试建立一个基于具有锁定 - 放置 - 解锁序列的被动RMA的工作流程。我使用一个名为schedule的整数数组,其中表示等级的数组中的每个位置对于工作进程为0或对于可用进程为1(因此如果schedule [1] = 1则可用于工作)。 如果一个进程完成了它的工作,它将主数据放入1,表示它的可用性。我试过的代码如下:
MPI_Win_lock(MPI_LOCK_EXCLUSIVE,0,0,win); // a exclusive window is locked on process 0
printf("Process %d:\t exclusive lock on process 0 started\n",myrank);
MPI_Put(&schedule[myrank],1,MPI_INT,0,0,1,MPI_INT,win); // the line myrank of schedule is put into process 0
printf("Process %d:\t put operation called\n",myrank);
MPI_Win_unlock(0,win); // the window is unlocked
它工作得很好,特别是当主进程与锁定结束时同步时,因为然后在put操作之后进行了master的输出。
作为下一步,我试图让主人定期检查是否有可用的奴隶。因此,我创建了一个while循环来重复,直到每个进程都表明它的可用性(我重复说它是程序教我的原则,我知道实现仍然没有做我想要的)。 循环是基本变体,只是打印我的数组计划,然后检查函数fnz是否还有其他工作进程而不是master:
while(j!=1){
printf("Process %d:\t following schedule evaluated:\n",myrank);
for(i=0;i<size;i++)printf("%d\t",schedule[i]);//print the schedule
printf("\n");
j=fnz(schedule);
}
然后这个概念爆炸了。在反转过程并从主服务器获取所需信息而不是将服务器从从服务器转到主服务器之后我发现我的主要问题是获取锁:解锁命令不成功,因为在put的情况下,根本没有授予锁定,并且在获取锁定的情况下,仅当从属进程完成其工作并在屏障中等待时才授予锁定。在我看来,我的想法中必定存在严重错误。被动RMA的概念不能仅在目标进程处于同步整个通信器的障碍时才能实现锁定。然后我可以继续进行标准的Send / Recv操作。我想要实现的是,流程0始终在委派工作中工作,并且能够由奴隶的RMA识别它可以委派给谁。 可以请某人帮助我并解释我如何在进程0中休息以允许其他进程获取锁定?
提前谢谢!
更新 我不确定你是否曾经使用过锁,只是想强调我完全能够获得远程内存窗口的更新副本。如果我从奴隶获得可用性,则仅在奴隶在障碍物中等待时才授予锁定。所以我需要工作的是,进程0执行lock-get-unlock,而进程1和2正在模拟工作,使得进程2占用的时间明显长于1。我期望的结果是进程0打印一个时间表(0,1,0),因为进程0一直没有被询问它是否正常工作,进程1完成了工作,进程2仍在工作。在下一步中,当进程2准备就绪时,我期望输出(0,1,1),因为从站都准备好进行新的工作。我得到的是,当他们在障碍中等待时,奴隶只授予进程0的锁定,因此我得到的第一个也是唯一的输出是我期望的最后一个,告诉我为每个人授予了锁定首先,当它完成它的工作时。所以如果有人可以告诉我目标流程何时可以授予锁定而不是试图混淆我对被动 RMA的了解,我将非常感激
答案 0 :(得分:0)
如果我使用较新版本的Open-MPI库,Hristo Lliev的答案将完美无缺。
但是,在我们当前使用的群集上,这是不可能的,对于旧版本,最终解锁调用存在死锁行为,如Hhristo所述。添加选项--mca osc pt2pt
确实在某种意义上解决了死锁,但MPI_Win_unlock
调用似乎仍未完成,直到拥有被访问变量的进程自己锁定/解锁窗口。当你的工作完成时间非常不同时,这不是很有用。
因此,从实用的角度来看,虽然严格地说是离开了被动RMA同步的主题(我为此道歉),但我想指出一种解决方法,它利用外部文件为那些坚持使用的人旧版本的Open-MPI库,所以他们不必像我那样耗费太多时间:
您基本上创建一个外部文件,其中包含有关哪个(从属)进程执行哪个作业而不是内部数组的信息。这样,您甚至不需要专门用于奴隶簿记的主进程:它也可以执行作业。无论如何,每个进程都可以在这个文件中查看接下来要完成的工作,并可能确定一切都已完成。
现在重要的一点是,多个进程不会同时访问此信息文件,因为这可能会导致工作重复或更糟。通过使用锁定文件,可以最简单地模仿MPI中窗口的锁定和解锁:此文件由当前访问信息文件的进程创建。其他进程必须等待当前进程完成,方法是稍微延迟检查锁文件是否仍然存在。
可以找到完整的信息here。