Blame test/mpi/f77/coll/alltoallvf.f

Packit 0848f5
C -*- Mode: Fortran; -*- 
Packit 0848f5
C
Packit 0848f5
C  (C) 2011 by Argonne National Laboratory.
Packit 0848f5
C      See COPYRIGHT in top-level directory.
Packit 0848f5
C
Packit 0848f5
      program main
Packit 0848f5
      implicit none
Packit 0848f5
      include 'mpif.h'
Packit 0848f5
      integer ierr, errs
Packit 0848f5
      integer i, ans, size, rank, color, comm, newcomm
Packit 0848f5
      integer maxSize, displ
Packit 0848f5
      parameter (maxSize=128)
Packit 0848f5
      integer scounts(maxSize), sdispls(maxSize), stypes(maxSize)
Packit 0848f5
      integer rcounts(maxSize), rdispls(maxSize), rtypes(maxSize)
Packit 0848f5
      integer sbuf(maxSize), rbuf(maxSize)
Packit 0848f5
Packit 0848f5
      errs = 0
Packit 0848f5
      
Packit 0848f5
      call mtest_init( ierr )
Packit 0848f5
Packit 0848f5
C Get a comm
Packit 0848f5
      call mpi_comm_dup( MPI_COMM_WORLD, comm, ierr )
Packit 0848f5
      call mpi_comm_size( comm, size, ierr )
Packit 0848f5
      if (size .gt. maxSize) then
Packit 0848f5
         call mpi_comm_rank( comm, rank, ierr )
Packit 0848f5
         color = 1
Packit 0848f5
         if (rank .lt. maxSize) color = 0
Packit 0848f5
         call mpi_comm_split( comm, color, rank, newcomm, ierr )
Packit 0848f5
         call mpi_comm_free( comm, ierr )
Packit 0848f5
         comm = newcomm
Packit 0848f5
         call mpi_comm_size( comm, size, ierr )
Packit 0848f5
      endif
Packit 0848f5
      call mpi_comm_rank( comm, rank, ierr )
Packit 0848f5
C      
Packit 0848f5
      if (size .le. maxSize) then
Packit 0848f5
C Initialize the data.  Just use this as an all to all
Packit 0848f5
C Use the same test as alltoallwf.c , except displacements are in units of
Packit 0848f5
C integers instead of bytes
Packit 0848f5
         do i=1, size
Packit 0848f5
            scounts(i) = 1
Packit 0848f5
            sdispls(i) = (i-1)
Packit 0848f5
            stypes(i)  = MPI_INTEGER
Packit 0848f5
            sbuf(i) = rank * size + i
Packit 0848f5
            rcounts(i) = 1
Packit 0848f5
            rdispls(i) = (i-1)
Packit 0848f5
            rtypes(i)  = MPI_INTEGER
Packit 0848f5
            rbuf(i) = -1
Packit 0848f5
         enddo
Packit 0848f5
         call mpi_alltoallv( sbuf, scounts, sdispls, stypes,
Packit 0848f5
     &        rbuf, rcounts, rdispls, rtypes, comm, ierr )     
Packit 0848f5
C
Packit 0848f5
C check rbuf(i) = data from the ith location of the ith send buf, or
Packit 0848f5
C       rbuf(i) = (i-1) * size + i   
Packit 0848f5
         do i=1, size
Packit 0848f5
            ans = (i-1) * size + rank + 1
Packit 0848f5
            if (rbuf(i) .ne. ans) then
Packit 0848f5
               errs = errs + 1
Packit 0848f5
               print *, rank, ' rbuf(', i, ') = ', rbuf(i), 
Packit 0848f5
     &               ' expected ', ans
Packit 0848f5
            endif
Packit 0848f5
         enddo
Packit 0848f5
C
Packit 0848f5
C     A halo-exchange example - mostly zero counts
Packit 0848f5
C
Packit 0848f5
         do i=1, size
Packit 0848f5
            scounts(i) = 0
Packit 0848f5
            sdispls(i) = 0
Packit 0848f5
            stypes(i)  = MPI_INTEGER
Packit 0848f5
            sbuf(i) = -1
Packit 0848f5
            rcounts(i) = 0
Packit 0848f5
            rdispls(i) = 0
Packit 0848f5
            rtypes(i)  = MPI_INTEGER
Packit 0848f5
            rbuf(i) = -1
Packit 0848f5
         enddo
Packit 0848f5
Packit 0848f5
C
Packit 0848f5
C     Note that the arrays are 1-origin
Packit 0848f5
         displ = 0
Packit 0848f5
         if (rank .gt. 0) then
Packit 0848f5
            scounts(1+rank-1) = 1
Packit 0848f5
            rcounts(1+rank-1) = 1
Packit 0848f5
            sdispls(1+rank-1) = displ
Packit 0848f5
            rdispls(1+rank-1) = rank - 1
Packit 0848f5
            sbuf(1+displ)     = rank
Packit 0848f5
            displ             = displ + 1
Packit 0848f5
         endif
Packit 0848f5
         scounts(1+rank)   = 1
Packit 0848f5
         rcounts(1+rank)   = 1
Packit 0848f5
         sdispls(1+rank)   = displ
Packit 0848f5
         rdispls(1+rank)   = rank
Packit 0848f5
         sbuf(1+displ)     = rank
Packit 0848f5
         displ           = displ + 1
Packit 0848f5
         if (rank .lt. size-1) then
Packit 0848f5
            scounts(1+rank+1) = 1 
Packit 0848f5
            rcounts(1+rank+1) = 1
Packit 0848f5
            sdispls(1+rank+1) = displ
Packit 0848f5
            rdispls(1+rank+1) = rank+1
Packit 0848f5
            sbuf(1+displ)     = rank
Packit 0848f5
            displ             = displ + 1
Packit 0848f5
         endif
Packit 0848f5
Packit 0848f5
         call mpi_alltoallv( sbuf, scounts, sdispls, stypes,
Packit 0848f5
     &        rbuf, rcounts, rdispls, rtypes, comm, ierr )
Packit 0848f5
C
Packit 0848f5
C   Check the neighbor values are correctly moved
Packit 0848f5
C
Packit 0848f5
         if (rank .gt. 0) then
Packit 0848f5
            if (rbuf(1+rank-1) .ne. rank-1) then
Packit 0848f5
               errs = errs + 1
Packit 0848f5
               print *, rank, ' rbuf(',1+rank-1, ') = ', rbuf(1+rank-1),
Packit 0848f5
     &              'expected ', rank-1
Packit 0848f5
            endif
Packit 0848f5
         endif
Packit 0848f5
         if (rbuf(1+rank) .ne. rank) then
Packit 0848f5
            errs = errs + 1
Packit 0848f5
            print *, rank, ' rbuf(', 1+rank, ') = ', rbuf(1+rank),
Packit 0848f5
     &           'expected ', rank
Packit 0848f5
         endif
Packit 0848f5
         if (rank .lt. size-1) then
Packit 0848f5
            if (rbuf(1+rank+1) .ne. rank+1) then
Packit 0848f5
               errs = errs + 1
Packit 0848f5
               print *, rank, ' rbuf(', 1+rank+1, ') = ',rbuf(1+rank+1),
Packit 0848f5
     &              'expected ', rank+1
Packit 0848f5
            endif
Packit 0848f5
         endif
Packit 0848f5
         do i=0,rank-2
Packit 0848f5
            if (rbuf(1+i) .ne. -1) then
Packit 0848f5
               errs = errs + 1
Packit 0848f5
               print *, rank, ' rbuf(', 1+i, ') = ', rbuf(1+i), 
Packit 0848f5
     &              'expected -1'
Packit 0848f5
            endif
Packit 0848f5
         enddo
Packit 0848f5
         do i=rank+2,size-1
Packit 0848f5
            if (rbuf(1+i) .ne. -1) then
Packit 0848f5
               errs = errs + 1
Packit 0848f5
               print *, rank, ' rbuf(', i, ') = ', rbuf(1+i), 
Packit 0848f5
     &              'expected -1'
Packit 0848f5
            endif
Packit 0848f5
         enddo
Packit 0848f5
      endif
Packit 0848f5
      call mpi_comm_free( comm, ierr )
Packit 0848f5
Packit 0848f5
      call mtest_finalize( errs )
Packit 0848f5
      call mpi_finalize( ierr )
Packit 0848f5
      end
Packit 0848f5