Actual source code: sfbasic.h
1: #pragma once
3: #include <petsc/private/sfimpl.h>
5: #define SFBASICHEADER \
6: PetscMPIInt niranks; /* Number of incoming ranks (ranks accessing my roots) */ \
7: PetscMPIInt ndiranks; /* Number of incoming ranks (ranks accessing my roots) in distinguished set */ \
8: PetscMPIInt *iranks; /* Array of ranks that reference my roots */ \
9: PetscInt itotal; /* Total number of graph edges referencing my roots */ \
10: PetscInt *ioffset; /* Array of length niranks+1 holding offset in irootloc[] for each rank */ \
11: PetscInt *irootloc; /* Incoming roots referenced by ranks starting at ioffset[rank] */ \
12: PetscInt *irootloc_d[2]; /* A copy of irootloc[local/remote] in device memory if needed */ \
13: PetscInt rootbuflen[2]; /* Length (in unit) of root buffers, in layout of [PETSCSF_LOCAL/REMOTE] */ \
14: PetscBool rootcontig[2]; /* True means the local/remote segments of indices in irootloc[] are contiguous ... */ \
15: PetscInt rootstart[2]; /* ... and start from rootstart[0] and rootstart[1] respectively */ \
16: PetscSFPackOpt rootpackopt[2]; /* Pack optimization plans based on patterns in irootloc[]. NULL for no optimizations */ \
17: PetscSFPackOpt rootpackopt_d[2]; /* Copy of rootpackopt[] on device if needed */ \
18: PetscBool rootdups[2]; /* Indices of roots in irootloc[local/remote] have dups. Used for data-race test */ \
19: PetscInt nrootreqs; /* Number of MPI requests */ \
20: PetscSFLink avail; /* One or more entries per MPI Datatype, lazily constructed */ \
21: PetscSFLink inuse /* Buffers being used for transactions that have not yet completed */
23: typedef struct {
24: SFBASICHEADER;
25: #if defined(PETSC_HAVE_NVSHMEM)
26: PetscInt rootbuflen_rmax; /* max rootbuflen[REMOTE] over comm */
27: PetscInt nRemoteLeafRanks; /* niranks - ndiranks */
28: PetscInt nRemoteLeafRanksMax; /* max nRemoteLeafRanks over comm */
30: PetscInt *leafbufdisp; /* [nRemoteLeafRanks]. For my i-th remote leaf rank, I will put to its leafbuf_shmem[] at offset leafbufdisp[i], in <unit> to be set */
31: PetscInt *leafsigdisp; /* [nRemoteLeafRanks]. For my i-th remote leaf rank, I am its leafsigdisp[i]-th root rank */
33: PetscInt *leafbufdisp_d;
34: PetscInt *leafsigdisp_d; /* Copy of leafsigdisp[] on device */
35: PetscMPIInt *iranks_d; /* Copy of the remote part of (leaf) iranks[] on device */
36: PetscInt *ioffset_d; /* Copy of the remote part of ioffset[] on device */
37: #endif
38: } PetscSF_Basic;
40: static inline PetscErrorCode PetscSFGetRootInfo_Basic(PetscSF sf, PetscInt *nrootranks, PetscInt *ndrootranks, const PetscMPIInt **rootranks, const PetscInt **rootoffset, const PetscInt **rootloc)
41: {
42: PetscSF_Basic *bas = (PetscSF_Basic *)sf->data;
44: PetscFunctionBegin;
45: if (nrootranks) *nrootranks = bas->niranks;
46: if (ndrootranks) *ndrootranks = bas->ndiranks;
47: if (rootranks) *rootranks = bas->iranks;
48: if (rootoffset) *rootoffset = bas->ioffset;
49: if (rootloc) *rootloc = bas->irootloc;
50: PetscFunctionReturn(PETSC_SUCCESS);
51: }
53: static inline PetscErrorCode PetscSFGetLeafInfo_Basic(PetscSF sf, PetscInt *nleafranks, PetscInt *ndleafranks, const PetscMPIInt **leafranks, const PetscInt **leafoffset, const PetscInt **leafloc, const PetscInt **leafrremote)
54: {
55: PetscFunctionBegin;
56: if (nleafranks) *nleafranks = sf->nranks;
57: if (ndleafranks) *ndleafranks = sf->ndranks;
58: if (leafranks) *leafranks = sf->ranks;
59: if (leafoffset) *leafoffset = sf->roffset;
60: if (leafloc) *leafloc = sf->rmine;
61: if (leafrremote) *leafrremote = sf->rremote;
62: PetscFunctionReturn(PETSC_SUCCESS);
63: }
65: PETSC_INTERN PetscErrorCode PetscSFSetUp_Basic(PetscSF);
66: PETSC_INTERN PetscErrorCode PetscSFView_Basic(PetscSF, PetscViewer);
67: PETSC_INTERN PetscErrorCode PetscSFReset_Basic(PetscSF);
68: PETSC_INTERN PetscErrorCode PetscSFDestroy_Basic(PetscSF);
69: PETSC_INTERN PetscErrorCode PetscSFBcastBegin_Basic(PetscSF, MPI_Datatype, PetscMemType, const void *, PetscMemType, void *, MPI_Op);
70: PETSC_INTERN PetscErrorCode PetscSFBcastEnd_Basic(PetscSF, MPI_Datatype, const void *, void *, MPI_Op);
71: PETSC_INTERN PetscErrorCode PetscSFReduceBegin_Basic(PetscSF, MPI_Datatype, PetscMemType, const void *, PetscMemType, void *, MPI_Op);
72: PETSC_INTERN PetscErrorCode PetscSFReduceEnd_Basic(PetscSF, MPI_Datatype, const void *, void *, MPI_Op);
73: PETSC_INTERN PetscErrorCode PetscSFFetchAndOpBegin_Basic(PetscSF, MPI_Datatype, PetscMemType, void *, PetscMemType, const void *, void *, MPI_Op);
74: PETSC_INTERN PetscErrorCode PetscSFFetchAndOpEnd_Basic(PetscSF, MPI_Datatype, void *, const void *, void *, MPI_Op);
75: PETSC_INTERN PetscErrorCode PetscSFCreateEmbeddedRootSF_Basic(PetscSF, PetscInt, const PetscInt *, PetscSF *);
76: PETSC_INTERN PetscErrorCode PetscSFGetLeafRanks_Basic(PetscSF, PetscInt *, const PetscMPIInt **, const PetscInt **, const PetscInt **);
78: #if defined(PETSC_HAVE_NVSHMEM)
79: PETSC_INTERN PetscErrorCode PetscSFReset_Basic_NVSHMEM(PetscSF);
80: #endif