Dear all,
I am a beginner of MPI, right now I try to use MPI_GATHERV in my code, the test
code just gather the value of array A to store them in array B, but I found an
error listed as follows,
'Fatal error in MPI_Gatherv: Invalid count, error stack:
PMPI_Gatherv<398>: MPI_Gatherv failed <sbuf=004d96c0, scount=64,MPI_REAL,
rbuf=0049AC0, rcnts=003DCB8, displs=003D4C68, MPI_REAL, root=0, MPI_COMM_WORLD>
failed
PMPI_Gatherv<317>: Negative count, value is -842150451â
Here I post my program with the email, I wonder anyone can help me to fix it or
not? I guess my error is from the sending or receiving buffer and the
displacement of the value stored, I tried to changed âB,jlen,idispâ to â B(1,1),
jlen(myid),idisp(myid)â or other things, but I still cannot work it out.
I am looking forward some help from you.
Zhangping Wei
Â
my code is,
     PROGRAM MAIN
     IMPLICIT NONE
     INCLUDE 'mpif.h'
     INTEGER I,J,IWORK,JWORK,I1,I2,J1,J2
     REAL A(16,16),B(16,16)
     INTEGER,ALLOCATABLE ::idisp(:),jlen(:)
     integer myid,numprocs,rc,ierr,istar,iend,jstar,jend
     integer status(MPI_STATUS_SIZE)
     CALL MPI_INIT(ierr)
     CALL MPI_COMM_RANK(MPI_COMM_WORLD,myid,ierr)
     CALL MPI_COMM_SIZE(MPI_COMM_WORLD,numprocs,ierr)
 !    PRINT *,'process ',myid, 'of',numprocs, 'is alive.' Â
     allocate(idisp(0:numprocs-1),jlen(0:numprocs-1))    Â
     DO J=1,16
       DO I=1,16
           A(I,J)=I+J
           B(I,J)=0.0
       ENDDO
     ENDDO
         I1=1;I2=16;J1=1;J2=16
           JWORK=(J2-J1)/numprocs+1
           JSTAR=MIN(myid*JWORK+J1,J2+1)
           JEND=MIN(JSTAR+JWORK-1,J2)
           ISTAR=I1
           IEND=I2                      Â
     PRINT *,myid,istar,iend,jstar,jend
     jlen(myid)=16*(jend-jstar+1)
     idisp(myid)=16*(jstar-1)
     print *,myid,jlen(myid),idisp(myid)   Â
     CALL MPI_GATHERV(A(1,jstar),jlen(myid),MPI_REAL,
    *B,jlen,idisp,MPI_REAL,0,MPI_COMM_WORLD,IERR)
     IF(myid.EQ.0)THEN
       DO J=1,16
           DO I=1,16
               PRINT *,I,J,B(I,J)
           ENDDO
       ENDDO    Â
     ENDIF
     CALL MPI_Finalize(rc)                                       Â
     END PROGRAM
|