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: }