1 
2 #include <petscsys.h>         /*I  "petscsys.h"  I*/
3 
4 /*
5     Allows sending/receiving larger messages then 2 gigabytes in a single call
6 */
7 
MPIULong_Send(void * mess,PetscInt cnt,MPI_Datatype type,PetscMPIInt to,PetscMPIInt tag,MPI_Comm comm)8 PetscErrorCode MPIULong_Send(void *mess,PetscInt cnt, MPI_Datatype type,PetscMPIInt to, PetscMPIInt tag, MPI_Comm comm)
9 {
10   PetscErrorCode  ierr;
11   static PetscInt CHUNKSIZE = 250000000; /* 250,000,000 */
12   PetscInt        i,numchunks;
13   PetscMPIInt     icnt;
14 
15   PetscFunctionBegin;
16   numchunks = cnt/CHUNKSIZE + 1;
17   for (i=0; i<numchunks; i++) {
18     ierr = PetscMPIIntCast((i < numchunks-1) ? CHUNKSIZE : cnt - (numchunks-1)*CHUNKSIZE,&icnt);CHKERRQ(ierr);
19     ierr = MPI_Send(mess,icnt,type,to,tag,comm);CHKERRQ(ierr);
20     if (type == MPIU_INT)         mess = (void*) (((PetscInt*)mess) + CHUNKSIZE);
21     else if (type == MPIU_SCALAR) mess = (void*) (((PetscScalar*)mess) + CHUNKSIZE);
22     else SETERRQ(comm,PETSC_ERR_SUP,"No support for this datatype");
23   }
24   PetscFunctionReturn(0);
25 }
26 
MPIULong_Recv(void * mess,PetscInt cnt,MPI_Datatype type,PetscMPIInt from,PetscMPIInt tag,MPI_Comm comm)27 PetscErrorCode MPIULong_Recv(void *mess,PetscInt cnt, MPI_Datatype type,PetscMPIInt from, PetscMPIInt tag, MPI_Comm comm)
28 {
29   int             ierr;
30   static PetscInt CHUNKSIZE = 250000000; /* 250,000,000 */
31   MPI_Status      status;
32   PetscInt        i,numchunks;
33   PetscMPIInt     icnt;
34 
35   PetscFunctionBegin;
36   numchunks = cnt/CHUNKSIZE + 1;
37   for (i=0; i<numchunks; i++) {
38     ierr = PetscMPIIntCast((i < numchunks-1) ? CHUNKSIZE : cnt - (numchunks-1)*CHUNKSIZE,&icnt);CHKERRQ(ierr);
39     ierr = MPI_Recv(mess,icnt,type,from,tag,comm,&status);CHKERRQ(ierr);
40     if (type == MPIU_INT)         mess = (void*) (((PetscInt*)mess) + CHUNKSIZE);
41     else if (type == MPIU_SCALAR) mess = (void*) (((PetscScalar*)mess) + CHUNKSIZE);
42     else SETERRQ(comm,PETSC_ERR_SUP,"No support for this datatype");
43   }
44   PetscFunctionReturn(0);
45 }
46