2016-09-04 6 views
1

간단한 프로그램이있어서 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이므로 어디서 잘못되었는지 확신 할 수 없습니다.

+1

'include 'mpif.h'대신'use mpi'를 사용하면 컴파일러는 특정 종류의 오류 (라이브러리 버전에 따라 다름)를 확인할 수 있습니다. –

+0

필자는 그것을 변경했지만, 사용하지 않은 두 변수를 제외하고 나는 어떤 erros/warnings도 얻지 못했다. – Stein

답변

2

MPI 집단의 프로세스 수를 지정하지 마십시오. 그것은 엄지의 간단한 규칙입니다.

따라서 n_procs * BUFSIZE 라인은 분명히 잘못되었습니다.

그리고 실제로 매뉴얼에 있음 : 싱글 상관 요소의 recvcount수는 (루트 만에 큰 정수를)받을 수 있습니다.

BUFSIZE을 사용해야합니다. 이것은 C와 Fortran에서 동일합니다.

+0

이것은 올바른 것으로 보이지만 모든 오류 코드는 0입니까? – Stein

+1

오류 코드는 특정 오류에 대해서만 검사합니다. 그리고 기본적으로 그들은 전혀 사용되지 않습니다. 프로그램이 감지되면 프로그램은 즉시 중지됩니다. http://beige.ucs.indiana.edu/I590/node85.html을 참조하십시오. –

관련 문제