C++ MPI:如何中断MPI任务但不终止MPI进程?

C++ MPI:如何中断MPI任务但不终止MPI进程?,c++,parallel-processing,mpi,C++,Parallel Processing,Mpi,假设我创建了一个主要的worker程序,包括以下步骤: 1-main将任务发送给所有工作人员 2-更快的员工完成任务并将结果发送回主服务器 3-main从最快的工作人员那里接收结果,并向每个人发送新任务 4-速度较快的工作人员准备好接收任务,但速度较慢的工作人员必须中断或取消他们正在执行的旧的、缓慢的任务,以便与速度较快的工作人员同时启动新任务 我知道如何执行所有步骤,除了步骤4,在该步骤中,我必须中断较慢的工人正在执行的操作,以便继续执行下一个任务 以下是缺少该部分的不完整代码的示例: #in

假设我创建了一个主要的worker程序,包括以下步骤:

1-main将任务发送给所有工作人员

2-更快的员工完成任务并将结果发送回主服务器

3-main从最快的工作人员那里接收结果,并向每个人发送新任务

4-速度较快的工作人员准备好接收任务,但速度较慢的工作人员必须中断或取消他们正在执行的旧的、缓慢的任务,以便与速度较快的工作人员同时启动新任务

我知道如何执行所有步骤,除了步骤4,在该步骤中,我必须中断较慢的工人正在执行的操作,以便继续执行下一个任务

以下是缺少该部分的不完整代码的示例:

#include <mpi.h>
#include <iostream>
#include <string>
#include <unistd.h>

using namespace std;

int main(int argc, char* argv[])
{
  MPI_Init(&argc,&argv);

  int rank;
  MPI_Comm_rank(MPI_COMM_WORLD, &rank);

    int world_size;
    MPI_Comm_size(MPI_COMM_WORLD, &world_size);


  if (rank == 0) {
    int value = 17;
    string valuec = "Hello";

    for(int i = 1; i < world_size; i++){


        int result = MPI_Send(valuec.c_str(), valuec.length(), MPI_CHAR, i, 0, MPI_COMM_WORLD);
            if (result == MPI_SUCCESS)
          std::cout << "Rank 0 OK!" << std::endl;
    }

    int workersDone = 0;
    MPI_Status status;
    int flag = 0;

    while(1){
        flag=0;
        MPI_Iprobe(MPI_ANY_SOURCE, MPI_ANY_TAG, MPI_COMM_WORLD, &flag, &status);
        if(flag==1){
            workersDone++;
            cout << "Workers done: " << workersDone << endl;
        }

        if(workersDone >= world_size/2){/* here the main moves on
                                          before all workers are done
                                          */
            cout << "Main breaking" << endl; 
            break;
        }

    }

    /* interruption Here:
                    How do I make the main tell to the slow workers
                    interrupt or cancel what they were doing in order
                    to receive new tasks
                    */

    // New tasks should go here here

  } else if (rank != 0) {
    int receivedMessages = 0;
    while(1){ 
                MPI_Status status;
            int flag = 0;

        MPI_Iprobe(MPI_ANY_SOURCE, MPI_ANY_TAG, MPI_COMM_WORLD, &flag, &status);

    if(flag==1){
        receivedMessages++;
            int value;
            char buffer[256];
            int result = MPI_Recv(&buffer, 256, MPI_CHAR, 0, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
            cout << rank << " received " << buffer << endl;

            sleep(rank); /* this hypothetical task will be slower
                            in some workers, faster in others. In the
                            final version of code of course this
                            will not be a sleep command, and the time
                            it takes will not be proportional to the
                            process rank.
                            */
        MPI_Send(buffer, sizeof(buffer), MPI_CHAR, 0, 0, MPI_COMM_WORLD);

        cout << rank << " breaking" << endl;

        break; 

    }
 }
}
  MPI_Finalize();
  return 0;
} 
#包括
#包括
#包括
#包括
使用名称空间std;
int main(int argc,char*argv[])
{
MPI_Init(&argc,&argv);
整数秩;
MPI通信等级(MPI通信世界和等级);
国际大世界;
MPI_Comm_大小(MPI_Comm_WORLD和WORLD_大小);
如果(秩==0){
整数值=17;
字符串valuec=“Hello”;
对于(int i=1;istd::cout您可以参考。您的解决方案取决于从属服务器是否可以定期检查中断,或者它们是否应该异步“中断”(您将需要多个线程)我找到了那个链接,但它让我有点困惑。你能建议一个修改我的代码的解决方案示例吗?它不需要马上工作,任何接近解决方案的方法都应该有帮助。你提到的任何一种方法都应该能解决我的问题。我不会为你编写代码,但这里有一些提示。在等级0上,你可以
MPI_Recv()
(目前,您基本上是
MPI\u Iprobe()
在一个循环中,并且您从来没有读过消息)。在其他级别上,您可以
MPI\u Ibcast()
并定期
MPI\u Test()
检查您是否应该被中断。当从机完成其工作时,它应该
MPI\u Send()
主站。当足够多的从属站完成其作业时,主站应
MPI_Ibcast();MPI_Wait();
通知奴隶。谢谢你的帮助,但让我澄清一件事:你不会为我写代码,因为这还不接近我为一个大型软件开发的>100000行代码,用于模拟基于规则的模型来描述复杂的酶网络。因此,如果你在这里编写代码示例,我会我不会把它带到任何地方,我只会把你的例子作为一个模板来研究,以便生成我自己的代码。你可以参考。你的解决方案取决于从属服务器是否可以定期检查中断,或者它们是否应该异步“中断”(你需要几个线程)我找到了那个链接,但它让我有点困惑。你能建议一个修改我的代码的解决方案示例吗?它不需要马上工作,任何接近解决方案的方法都应该有帮助。你提到的任何一种方法都应该能解决我的问题。我不会为你编写代码,但这里有一些提示。在等级0上,你可以
MPI_Recv()
(目前,您基本上是
MPI\u Iprobe()
在一个循环中,并且您从来没有读过消息)。在其他级别上,您可以
MPI\u Ibcast()
并定期
MPI\u Test()
检查您是否应该被中断。当从机完成其工作时,它应该
MPI\u Send()
主站。当足够多的从属站完成其作业时,主站应
MPI_Ibcast();MPI_Wait();
通知奴隶。谢谢你的帮助,但让我澄清一件事:你不会为我写代码,因为这还不接近我为一个大型软件开发的>100000行代码,用于模拟基于规则的模型来描述复杂的酶网络。因此,如果你在这里编写代码示例,我会我不会把它带到任何地方,我只会把你的例子作为一个模板来学习,以便编写我自己的代码。