MPI 在任务完成后发送和接收。有可能吗?
MPI send and receive after task is completed. Is it even possible?
我正在使用以下代码并行处理 运行 个作业。但是,我想知道是否有一种方法可以让处理器在完成作业后 send/receive 一条消息。使用此代码,如果我请求 4 个处理器但有 56 个作业要完成,它只会完成 4 个作业然后结束。我想知道是否有一种方法可以添加到代码中以便完成所有任务。我认为处理器需要向主处理器发送一条消息,告诉它作业已完成,如果还有 tjob,请给我发送另一个作业。我希望这是有道理的。我有点卡住了...提前致谢
当然可以...这称为 master/slave 方法或动态并行性。 proc0(通常是主程序)将向所有其他 proc 发送工作。然后它将开始等待。一旦一个过程完成,它将收集结果并发回一个新任务(如果可用)。
这种伪代码:
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)
注意:如果不需要,请不要使用标签(将其设置为 0)。
参见:
https://www.mcs.anl.gov/research/projects/mpi/mpi-standard/mpi-report-1.1/node35.htm
https://mpitutorial.com/tutorials/dynamic-receiving-with-mpi-probe-and-mpi-status/
最终 proc0 可以在此期间执行一些任务,作为优化,使用 mpi_irecv()
、mpi_test()
、mpi_wait()
.
我正在使用以下代码并行处理 运行 个作业。但是,我想知道是否有一种方法可以让处理器在完成作业后 send/receive 一条消息。使用此代码,如果我请求 4 个处理器但有 56 个作业要完成,它只会完成 4 个作业然后结束。我想知道是否有一种方法可以添加到代码中以便完成所有任务。我认为处理器需要向主处理器发送一条消息,告诉它作业已完成,如果还有 tjob,请给我发送另一个作业。我希望这是有道理的。我有点卡住了...提前致谢
当然可以...这称为 master/slave 方法或动态并行性。 proc0(通常是主程序)将向所有其他 proc 发送工作。然后它将开始等待。一旦一个过程完成,它将收集结果并发回一个新任务(如果可用)。
这种伪代码:
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)
注意:如果不需要,请不要使用标签(将其设置为 0)。
参见:
https://www.mcs.anl.gov/research/projects/mpi/mpi-standard/mpi-report-1.1/node35.htm
https://mpitutorial.com/tutorials/dynamic-receiving-with-mpi-probe-and-mpi-status/
最终 proc0 可以在此期间执行一些任务,作为优化,使用 mpi_irecv()
、mpi_test()
、mpi_wait()
.