제 문제는 Fortran에서 mpi 체계를 사용할 때 어떻게 서브 루틴을 호출해야할지 모르겠다는 것입니다. TRC.f90이라는 작은 코드에 CONCENTRATION.f90이라는 서브 루틴이 있습니다. 코드를 작동 시키려면 어떻게 CONCENTRATION.f90을 변경해야합니까? 나는 서브 루틴 CONCENTRATION.f90에 대한 몇 가지 변경 한해야한다고 생각하기 때문에 코드는 현재 나에게 오류를 제공MPI로 병렬화 된 포트란에서 서브 루틴을 호출하는 방법은 무엇입니까?
SUBROUTINE CONCENTRATION(GRIDX, GRIDY, NUM_PROCS, MY_ID , PSI)
implicit none
INTEGER*8, INTENT(IN) :: GRIDX, GRIDY
INTEGER , INTENT(IN) :: NUM_PROCS, MY_ID
REAL*8 , DIMENSION(GRIDX,GRIDY), INTENT(OUT) :: PSI
INTEGER*8 I, J
DO I=1+MY_ID*GRIDX/NUM_PROCS, (MY_ID+1)*GRIDX/NUM_PROCS
DO J=1,GRIDY
PSI(I,J)=2.0
END DO
END DO
END SUBROUTINE CONCENTRATION
:
PROGRAM TRY
USE MPI
integer status(mpi_status_size)
INTEGER I, J, K, II, IERR, MY_ID, NUM_PROCS, PSP
INTEGER , PARAMETER :: GRIDX =64, GRIDY=64
REAL , DIMENSION(gridx,gridy) :: PSI
PSI=0
PRINT*, 'VARIABLE'
CALL MPI_INIT(IERR)
CALL MPI_COMM_RANK(MPI_COMM_WORLD,MY_ID,IERR)
CALL MPI_COMM_SIZE(MPI_COMM_WORLD,NUM_PROCS,IERR)
CALL CONCENTRATION(GRIDX, GRIDY, NUM_PROCS, MY_ID , PSI)
IF (MY_ID .NE. 0) THEN
CALL mpi_send(PSI(1+MY_ID*GRIDX/NUM_PROCS:(MY_ID+1)*GRIDX/NUM_PROCS:1,1:GRIDY:1),&
(GRIDX/NUM_PROCS)*GRIDY,mpi_real, 0,10,mpi_comm_world,ierr)
END IF
IF (MY_ID .EQ. 0) THEN
DO II=1,NUM_PROCS-1
CALL mpi_recv(PSI(1+II*GRIDX/NUM_PROCS:(II+1)*GRIDX/NUM_PROCS:1,1:GRIDY:1),&
(GRIDX/NUM_PROCS)*GRIDY,mpi_real, &
II,10,mpi_comm_world,status,ierr)
END DO
END IF
CALL MPI_FINALIZE(IERR)
END PROGRAM TRY
I는 CONCENTRATION.f90라는 이름의 서브 루틴을 사용하고 있습니다. 또는 서브 루틴이라고 부르는 방식을 변경해야합니다.
변경 사항은 무엇입니까? 사전에 도움을 주셔서 감사합니다
무엇이 오류입니까? – wallyk
mpirun은 노드 Goodin의 PID 9249가있는 프로세스 순위 0이 신호 11 (세그먼트 오류)에서 나왔다는 것을 알았습니다. 그러나 mpi 구성표를 제거한 다음 gfortran 컴파일러를 적용하면 모든 것이 올바르게 작동합니다. – user1464558
"MPI 체계"란 무엇을 의미합니까? –