Fortran 任务完成后MPI发送和接收。有可能吗?

Fortran 任务完成后MPI发送和接收。有可能吗?,fortran,mpi,hpc,Fortran,Mpi,Hpc,我使用以下代码并行运行作业。但是,我想知道处理器是否有办法在完成作业后发送/接收消息。使用这段代码,如果我请求4个处理器,但有56个作业要完成,它只完成4个作业,然后结束。我想知道是否有一种方法可以添加到代码中,从而完成所有任务。我认为处理器需要向主处理器发送一条消息,告诉它作业已完成,如果还有tjob剩余,则向我发送另一个作业。我希望这是有道理的。我有点被卡住了。。。提前谢谢您当然可以。。。这称为主/从方法或动态并行。proc0(通常是主进程)将向所有其他进程发送工作。然后它将开始等待。一旦一

我使用以下代码并行运行作业。但是,我想知道处理器是否有办法在完成作业后发送/接收消息。使用这段代码,如果我请求4个处理器,但有56个作业要完成,它只完成4个作业,然后结束。我想知道是否有一种方法可以添加到代码中,从而完成所有任务。我认为处理器需要向主处理器发送一条消息,告诉它作业已完成,如果还有tjob剩余,则向我发送另一个作业。我希望这是有道理的。我有点被卡住了。。。提前谢谢

您当然可以。。。这称为主/从方法或动态并行。proc0(通常是主进程)将向所有其他进程发送工作。然后它将开始等待。一旦一个进程完成,它将收集结果并发回一个新任务(如果可用)

这种伪代码:

if(myid.eq.0) then
  pending_tasks = 0
  sent_tasks = 0
  DO i=1,(numprocs-1)
    read(100,'(A)') command
    call MPI_SEND(command,200,MPI_CHAR,i,0,MPI_COMM_WORLD,ierr)
    pending_tasks = pending_tasks + 1
    sent_tasks = sent_tasks + 1
  ENDDO
  // all procs have one task to work on.
  DO
    // wait for results - from any source
    call MPI_RECV(result,200,MPI_CHAR,MPI_ANY_SOURCE,0,MPI_COMM_WORLD,istatus,ierr)
    free_proc = istatus(MPI_SOURCE)
    if (sent_tasks < nlines) then
      read(100,'(A)') command
      call MPI_SEND(command,200,MPI_CHAR,free_proc,0,MPI_COMM_WORLD,ierr)
      sent_tasks = sent_tasks + 1
    else
      // all tasks sent, but wait all the results
      pending_tasks = pending_tasks - 1
    endif
    call process_and_save_result(result)
    if (penging_tasks == 0) EXIT
  ENDDO
  // in this point the master can send out the 'QUIT' command to all the slaves
else
  DO
    call MPI_RECV(command,200,MPI_CHAR,0,0,MPI_COMM_WORLD,istatus,ierr)
    // that's a suggestion for a clean exit policy - pseudocode, don't forget
    if (command=='QUIT') EXIT
    call do_work(command, result)
    call MPI_SEND(result, 200,MPI_CHAR,0,0,MPI_COMM_WORLD,ierr)
  ENDDO
endif
call MPI_FINALIZE(ierr)
if(myid.eq.0)那么
挂起的任务=0
已发送任务=0
Doi=1(numprocs-1)
读取(100),(A)’命令
调用MPI_SEND(命令,200,MPI_CHAR,i,0,MPI_COMM_WORLD,ierr)
挂起的任务=挂起的任务+1
已发送任务=已发送任务+1
恩多
//所有进程都有一个任务要处理。
做
//等待结果-来自任何来源
调用MPI_RECV(结果,200,MPI_字符,MPI_任意源,0,MPI_通信世界,istatus,ierr)
自由进程=istatus(MPI源)
如果(发送任务
注意:如果不需要,请不要使用标记(将其设置为0)

见:


最终,proc0可以在这段时间内执行一些任务,作为一种优化,使用
mpi\u irecv()
mpi\u test()
mpi\u wait()
。。。这是令人惊讶的是,我看不出用我的答案发布一个新问题的理由。。。但这就是问题所在——根本不是问题。上面提到的两个程序是你的职责!他们必须按照自己的名字行事。“伪代码”的意思是:“这个代码不应该工作,而是给你一个如何构造它的想法”do_work(command,result):获取命令,在本地处理它并填充结果。这里我设置了相同类型的命令,但它可能只是一个整数,一个数组,。。。我不知道你的问题!处理和保存结果(result):获取结果并进行处理。打印出来。将其保存到磁盘。累积所有结果。。。同样,这取决于你的问题。当时,我不确定伪代码是什么意思。休息一下后,我明白了你的意思。我想我知道我现在需要做什么!!谢谢你为我解释。我真的很感谢你的帮助!如果我再次陷入困境,我会发布一些东西。