간단한 프로그램이있어서 MPI를 사용하여 여러 개의 작은 배열을 하나의 큰 배열로 모으기로되어 있습니다.Fortran에서 MPI_Gather를 사용할 때 잘못된 포인터 및 분할 오류가 발생했습니다.
PROGRAM main
include 'mpif.h'
integer ierr, i, myrank, thefile, n_procs
integer, parameter :: BUFSIZE = 3
complex*16, allocatable :: loc_arr(:), glob_arr(:)
call MPI_INIT(ierr)
call MPI_COMM_RANK(MPI_COMM_WORLD, myrank, ierr)
call MPI_COMM_SIZE(MPI_COMM_WORLD, n_procs, ierr)
allocate(loc_arr(BUFSIZE))
loc_arr = 0.7 * myrank - cmplx(0.3, 0, kind=8)
allocate(glob_arr(n_procs* BUFSIZE))
write (*,*) myrank, shape(glob_arr)
call MPI_Gather(loc_arr, BUFSIZE, MPI_DOUBLE_COMPLEX,&
glob_arr, n_procs * BUFSIZE, MPI_DOUBLE_COMPLEX,&
0, MPI_COMM_WORLD, ierr)
write (*,*) myrank,"Errorcode:" , ierr
call MPI_FINALIZE(ierr)
END PROGRAM main
C에서 MPI에 대한 경험이 있지만 Fortran 90에서는 아무 것도 작동하지 않습니다. 다음은 컴파일하는 방법입니다 (ifort를 사용합니다).
mpif90 test.f90 -check all && mpirun -np 4 ./a.out
1 12
3 12
3 Errorcode: 0
1 Errorcode: 0
0 12
2 12
2 Errorcode: 0
0 Errorcode: 0
*** Error in `./a.out': free(): invalid pointer: 0x0000000000a25790 ***
===================================================================================
= BAD TERMINATION OF ONE OF YOUR APPLICATION PROCESSES
= PID 10889 RUNNING AT LenovoX1kabel
= EXIT CODE: 6
= CLEANING UP REMAINING PROCESSES
= YOU CAN IGNORE THE BELOW CLEANUP MESSAGES
===================================================================================
===================================================================================
= BAD TERMINATION OF ONE OF YOUR APPLICATION PROCESSES
= PID 10889 RUNNING AT LenovoX1kabel
= EXIT CODE: 6
= CLEANING UP REMAINING PROCESSES
= YOU CAN IGNORE THE BELOW CLEANUP MESSAGES
===================================================================================
무엇이 잘못 되었나요? 때로는이 포인터 문제가 발생합니다. 때로는 세분화 오류가 발생하지만 제게는 ifort 검사에서 불평하지 않는 것처럼 보입니다.
모든 오류 코드는 0이므로 어디서 잘못되었는지 확신 할 수 없습니다.
'include 'mpif.h'대신'use mpi'를 사용하면 컴파일러는 특정 종류의 오류 (라이브러리 버전에 따라 다름)를 확인할 수 있습니다. –
필자는 그것을 변경했지만, 사용하지 않은 두 변수를 제외하고 나는 어떤 erros/warnings도 얻지 못했다. – Stein