에 커뮤니 사이에 작업을 전송 및 수신 : Unable to implement MPI_Intercomm_create내 앞의 질문에 따라 MPI
MPI_INTERCOMM_CREATE의 문제가 해결되었습니다. 하지만 컬러 0의 프로세스 0 (전역 순위 = 0)과 색상 1 (즉, 전체 순위 = 2)의 프로세스 0 사이에서 기본 보내기 작업을 구현하려고하면 코드는받은 버퍼를 인쇄 한 후 끊습니다. 코드 :
program hello
include 'mpif.h'
implicit none
integer tag,ierr,rank,numtasks,color,new_comm,inter1,inter2
integer sendbuf,recvbuf,tag,stat(MPI_STATUS_SIZE)
tag = 22
sendbuf = 222
call MPI_Init(ierr)
call MPI_COMM_RANK(MPI_COMM_WORLD,rank,ierr)
call MPI_COMM_SIZE(MPI_COMM_WORLD,numtasks,ierr)
if (rank < 2) then
color = 0
else
color = 1
end if
call MPI_COMM_SPLIT(MPI_COMM_WORLD,color,rank,new_comm,ierr)
if (color .eq. 0) then
if (rank == 0) print*,' 0 here'
call MPI_INTERCOMM_CREATE(new_comm,0,MPI_Comm_world,2,tag,inter1,ierr)
call mpi_send(sendbuf,1,MPI_INT,2,tag,inter1,ierr)
!local_comm,local leader,peer_comm,remote leader,tag,new,ierr
else if(color .eq. 1) then
if(rank ==2) print*,' 2 here'
call MPI_INTERCOMM_CREATE(new_comm,2,MPI_COMM_WORLD,0,tag,inter2,ierr)
call mpi_recv(recvbuf,1,MPI_INT,0,tag,inter2,stat,ierr)
print*,recvbuf
end if
end
난 그냥 코드에서 매우 빠른 눈을했지만, 분명히 여기에 문제가 있습니다 : 그 두 아이디어를 결합하면 같은 프로그램이 볼 수 (recvbuf를'통화 mpi_recv을, 1, MPI_INT, 0, tag, inter1, stat, ierr)'inter1' 대신에'inter2'를 사용해야합니다. – Gilles
모든 포트란 질문에 대해 [tag : fortran] 태그를 사용하십시오. 더 많은 사람들이 그것을 볼 수 있습니다. Fortran 90은 언어의 구 버전입니다. 조언 : Fortran 90 이후에는'include 'mpif.h'대신'use mpi'를 사용하는 것이 훨씬 낫습니다. –
당신은 또한'implicit none'을 사용하지 않습니다. (정말로 사용해야합니다!)'stat'를 아무 곳에 나 선언하지 마십시오. 배열로 제대로 선언하거나 대신에'MPI_STATUS_IGNORE'를 사용하십시오. –