2016-07-01 5 views
0

Ich versuche, mithilfe von MPI_Comm_spawn MPI_Send() und MPI_Recv() zu kommunizieren zwischen einem Kind und seinen Eltern-Prozess, erstellt zu verwenden, wie unten zu sehen sein:Verwenden MPI_Send und MPI_Recv zwischen Eltern und Kind-Prozess mit MPI_Comm_spawn erstellt

Parent.f90

program master 
use mpi 
implicit none 

    integer :: ierr, num_procs, my_id, intercomm, i, array(10), tag 

    CALL MPI_INIT(ierr) 

    CALL MPI_COMM_RANK(MPI_COMM_WORLD, my_id, ierr) 
    CALL MPI_COMM_SIZE(MPI_COMM_WORLD, num_procs, ierr) 

    if (.not. (ierr .eq. 0)) then 
     print*, "S.Unable to initilaize!" 
     stop 
    endif 

    if (my_id .eq. 0) then 
     call MPI_Comm_spawn("./child.out", MPI_ARGV_NULL, 1, MPI_INFO_NULL, my_id, & 
     & MPI_COMM_WORLD, intercomm, MPI_ERRCODES_IGNORE, ierr) 

     call MPI_Send(array, 255, MPI_INTEGER, my_id, tag, intercomm, ierr) 
    endif 

    call MPI_Finalize(ierr) 

end program master 

Child.f90

program name 
use mpi 
implicit none 

    ! type declaration statements 
    integer :: ierr, parent, my_id, n_procs, i, array(10), tag, intercomm 
    logical :: flag, high 

    ! executable statements 
    call MPI_Init(ierr) 
    call MPI_Initialized(flag, ierr) 
    call MPI_Comm_get_parent(parent, ierr) 
    call MPI_Comm_rank(MPI_COMM_WORLD, my_id, ierr) 
    call MPI_Comm_size(MPI_COMM_WORLD, n_procs, ierr) 

    print *, "Initilaized? ", flag 
    print *, "My mommy is: ", parent 
    print *, "My rank is:", my_id 

    tag = 1 

    call MPI_Recv(array, 255, MPI_INTEGER, MPI_ANY_SOURCE, tag, parent, MPI_STATUS_IGNORE, ierr) 
    print *, "Client received array." 

    call MPI_Finalize(ierr) 
end program name 

Wenn das obige Programm ausgeführt wird, scheinen die Eltern durch feine zu laufen, aber das Kind nie prin ts: "Der Client hat das Array empfangen.", was mich zu der Annahme verleitet hat, dass ich etwas mit dem send/recv vermasselt habe.

Wenn es nicht klar ist, was ich zu erreichen versuchen, mag ich die Eltern, ein Kind zu erzeugen, um das Kind ein Array senden, das Kind das Array und das Kind zu verarbeiten, um das Array zurück an die Mutter senden. (Kursiv wird noch geschrieben werden, ich möchte arbeiten diese grundlegende Kommunikation erhalten zuerst)

Im Moment, als ich laufen: mpiexec -np 1 parent.out, die Kind druckt:

Initilaized? T 
My mommy is:   3 
My rank is:   0 

aber nicht „Client empfangen Array. "

Antwort

0

Ich konnte mein Problem lösen. Der folgende Code startet ein übergeordnetes Element, sendet ein Array der Größe 1000000 an sein untergeordnetes Element, das untergeordnete Element quadriert das Array und sendet es an das übergeordnete Element zurück.

Parent.f90

program master 
use mpi 
implicit none 

    integer :: ierr, num_procs, my_id, intercomm, i, array(1000000), s_tag, s_dest, siffra 

    CALL MPI_INIT(ierr) 

    CALL MPI_COMM_RANK(MPI_COMM_WORLD, my_id, ierr) 
    CALL MPI_COMM_SIZE(MPI_COMM_WORLD, num_procs, ierr) 

    !print *, "S.Rank =", my_id 
    !print *, "S.Size =", num_procs 

    if (.not. (ierr .eq. 0)) then 
     print*, "S.Unable to initilaize bös!" 
     stop 
    endif 

    do i=1,size(array) 
     array(i) = 2 
    enddo 

    if (my_id .eq. 0) then 
     call MPI_Comm_spawn("./client2.out", MPI_ARGV_NULL, 1, MPI_INFO_NULL, my_id, & 
     & MPI_COMM_WORLD, intercomm, MPI_ERRCODES_IGNORE, ierr) 


     s_dest = 0 !rank of destination (integer) 
     s_tag = 1 !message tag (integer) 
     call MPI_Send(array(1), 1000000, MPI_INTEGER, s_dest, s_tag, intercomm, ierr) 

     call MPI_Recv(array(1), 1000000, MPI_INTEGER, s_dest, s_tag, intercomm, MPI_STATUS_IGNORE, ierr) 

     !do i=1,10 
     ! print *, "S.Array(",i,"): ", array(i) 
     !enddo 

    endif 

    call MPI_Finalize(ierr) 

end program master 

Child.f90

program name 
use mpi 
implicit none 

    ! type declaration statements 
    integer :: ierr, parent, my_id, n_procs, i, array(1000000), ctag, csource, intercomm, siffra 
    logical :: flag 

    ! executable statements 
    call MPI_Init(ierr) 
    call MPI_Initialized(flag, ierr) 
    call MPI_Comm_get_parent(parent, ierr) 
    call MPI_Comm_rank(MPI_COMM_WORLD, my_id, ierr) 
    call MPI_Comm_size(MPI_COMM_WORLD, n_procs, ierr) 

    csource = 0 !rank of source 
    ctag = 1 !message tag 

    call MPI_Recv(array(1), 1000000, MPI_INTEGER, csource, ctag, parent, MPI_STATUS_IGNORE, ierr) 

    !do i=1,10 
    ! print *, "C.Array(",i,"): ", array(i) 
    !enddo 

    do i=1,size(array) 
     array(i) = array(i)**2 
    enddo 

    !do i=1,10 
    ! print *, "C.Array(",i,"): ", array(i) 
    !enddo 

    call MPI_Send(array(1), 1000000, MPI_INTEGER, csource, ctag, parent, ierr) 

    call MPI_Finalize(ierr) 
end program name 
Verwandte Themen