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