MPI отправлять и получать после выполнения задачи. Это вообще возможно? - PullRequest
1 голос
/ 15 октября 2019

Я использую следующий код для параллельного выполнения заданий. Однако мне было интересно, есть ли у процессора способ отправить / получить сообщение после завершения работы. С этим кодом, если я запрашиваю 4 процессора, но у меня есть 56 заданий для завершения, он завершает только 4 задания и затем завершается. Мне было интересно, если есть способ добавить в код, чтобы все задачи были выполнены. Я думаю, что процессор должен был бы отправить сообщение главному процессору, сообщающее, что задание выполнено, отправьте мне другое задание, если осталось задание. Я надеюсь, что в этом есть смысл. Я как-то застрял ... Заранее спасибо

1 Ответ

1 голос
/ 15 октября 2019

уверен, что вы можете ... это называется подходом мастер / раб или динамический параллелизм. 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)

примечание: не используйте тег (установите его на 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().

...