我的伪代码有这样的东西:
//Some work
MPI_Send(....)
MPI_Irecv(&yesno, 1, MPI_INT, 0, MPI_ANY_TAG, MPI_COMM_WORLD, &status);
//Do some WORK1 (background work) till MPI_Irecv completes and when receive completes do WORK 2.
--WORK1
--WORK2
在接收完成后,我在哪里放置WORK1和WORK2以及如何将控件重定向到WORK2?
更多信息: 我正在尝试实现一个主从程序,其中主机向奴隶发出工作。当主机发出工作说奴隶1并且完成后需要被奴隶1中断时,主机继续工作。当这个中断发生时,一些代码需要由主机执行。然后主人需要在中断之前从中断处继续。
答案 0 :(得分:3)
如果WORK1是循环,则在每次迭代的开始/结束时使用MPI_Test()
以查看IRecv发布的请求是否已完成。如果有,则执行WORK2,发布新的IRecv,然后继续下一次WORK1迭代。
如果WORK1是顺序任务,那么您仍有两个选项。如上所述,你可以通过MPI_Test()
电话简单地加胡椒,但这并不是很优雅。相反,您可能希望在发布初始IRecv时生成一个新线程,然后在原始线程执行WORK1时使用MPI_Wait()
等待它完成。如果你的MPI实现不太合适,MPI_Wait()
应该只阻止调用它的线程,所以WORK1将继续正常。