xref: /petsc/src/vec/is/sf/impls/basic/sfbasic.h (revision 9371c9d470a9602b6d10a8bf50c9b2280a79e45a)
140e23c03SJunchao Zhang #if !defined(__SFBASIC_H)
240e23c03SJunchao Zhang #define __SFBASIC_H
340e23c03SJunchao Zhang 
4cd620004SJunchao Zhang #include <petsc/private/sfimpl.h> /*I "petscsf.h" I*/
5cd620004SJunchao Zhang 
6cd620004SJunchao Zhang typedef struct _n_PetscSFLink *PetscSFLink;
740e23c03SJunchao Zhang 
840e23c03SJunchao Zhang #define SFBASICHEADER \
940e23c03SJunchao Zhang   PetscMPIInt    niranks;          /* Number of incoming ranks (ranks accessing my roots) */ \
1040e23c03SJunchao Zhang   PetscMPIInt    ndiranks;         /* Number of incoming ranks (ranks accessing my roots) in distinguished set */ \
1140e23c03SJunchao Zhang   PetscMPIInt   *iranks;           /* Array of ranks that reference my roots */ \
1240e23c03SJunchao Zhang   PetscInt       itotal;           /* Total number of graph edges referencing my roots */ \
1340e23c03SJunchao Zhang   PetscInt      *ioffset;          /* Array of length niranks+1 holding offset in irootloc[] for each rank */ \
1440e23c03SJunchao Zhang   PetscInt      *irootloc;         /* Incoming roots referenced by ranks starting at ioffset[rank] */ \
15cd620004SJunchao Zhang   PetscInt      *irootloc_d[2];    /* A copy of irootloc[local/remote] in device memory if needed */ \
16cd620004SJunchao Zhang   PetscInt       rootbuflen[2];    /* Length (in unit) of root buffers, in layout of [PETSCSF_LOCAL/REMOTE] */ \
17cd620004SJunchao Zhang   PetscBool      rootcontig[2];    /* True means the local/remote segments of indices in irootloc[] are contiguous ... */ \
18cd620004SJunchao Zhang   PetscInt       rootstart[2];     /* ... and start from rootstart[0] and rootstart[1] respectively */ \
19cd620004SJunchao Zhang   PetscSFPackOpt rootpackopt[2];   /* Pack optimization plans based on patterns in irootloc[]. NULL for no optimizations */ \
20fcc7397dSJunchao Zhang   PetscSFPackOpt rootpackopt_d[2]; /* Copy of rootpackopt[] on device if needed */ \
21cd620004SJunchao Zhang   PetscBool      rootdups[2];      /* Indices of roots in irootloc[local/remote] have dups. Used for data-race test */ \
22cd620004SJunchao Zhang   PetscInt       nrootreqs;        /* Number of MPI reqests */ \
23cd620004SJunchao Zhang   PetscSFLink    avail;            /* One or more entries per MPI Datatype, lazily constructed */ \
24cd620004SJunchao Zhang   PetscSFLink    inuse             /* Buffers being used for transactions that have not yet completed */
2540e23c03SJunchao Zhang 
2640e23c03SJunchao Zhang typedef struct {
2740e23c03SJunchao Zhang   SFBASICHEADER;
2871438e86SJunchao Zhang #if defined(PETSC_HAVE_NVSHMEM)
2971438e86SJunchao Zhang   PetscInt rootbuflen_rmax;     /* max rootbuflen[REMOTE] over comm */
30*9371c9d4SSatish Balay   PetscInt nRemoteLeafRanks;    /* niranks - ndiranks */
3171438e86SJunchao Zhang   PetscInt nRemoteLeafRanksMax; /* max nRemoteLeafRanks over comm */
3271438e86SJunchao Zhang 
3371438e86SJunchao Zhang   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 */
3471438e86SJunchao Zhang   PetscInt *leafsigdisp; /* [nRemoteLeafRanks]. For my i-th remote leaf rank, I am its leafsigdisp[i]-th root rank */
3571438e86SJunchao Zhang 
3671438e86SJunchao Zhang   PetscInt    *leafbufdisp_d;
3771438e86SJunchao Zhang   PetscInt    *leafsigdisp_d; /* Copy of leafsigdisp[] on device */
3871438e86SJunchao Zhang   PetscMPIInt *iranks_d;      /* Copy of the remote part of (leaf) iranks[] on device */
3971438e86SJunchao Zhang   PetscInt    *ioffset_d;     /* Copy of the remote part of ioffset[] on device */
4071438e86SJunchao Zhang #endif
4140e23c03SJunchao Zhang } PetscSF_Basic;
4240e23c03SJunchao Zhang 
43*9371c9d4SSatish Balay static inline PetscErrorCode PetscSFGetRootInfo_Basic(PetscSF sf, PetscInt *nrootranks, PetscInt *ndrootranks, const PetscMPIInt **rootranks, const PetscInt **rootoffset, const PetscInt **rootloc) {
4440e23c03SJunchao Zhang   PetscSF_Basic *bas = (PetscSF_Basic *)sf->data;
4540e23c03SJunchao Zhang 
4640e23c03SJunchao Zhang   PetscFunctionBegin;
4740e23c03SJunchao Zhang   if (nrootranks) *nrootranks = bas->niranks;
4840e23c03SJunchao Zhang   if (ndrootranks) *ndrootranks = bas->ndiranks;
4940e23c03SJunchao Zhang   if (rootranks) *rootranks = bas->iranks;
5040e23c03SJunchao Zhang   if (rootoffset) *rootoffset = bas->ioffset;
5140e23c03SJunchao Zhang   if (rootloc) *rootloc = bas->irootloc;
5240e23c03SJunchao Zhang   PetscFunctionReturn(0);
5340e23c03SJunchao Zhang }
5440e23c03SJunchao Zhang 
55*9371c9d4SSatish Balay static inline PetscErrorCode PetscSFGetLeafInfo_Basic(PetscSF sf, PetscInt *nleafranks, PetscInt *ndleafranks, const PetscMPIInt **leafranks, const PetscInt **leafoffset, const PetscInt **leafloc, const PetscInt **leafrremote) {
5640e23c03SJunchao Zhang   PetscFunctionBegin;
5740e23c03SJunchao Zhang   if (nleafranks) *nleafranks = sf->nranks;
5840e23c03SJunchao Zhang   if (ndleafranks) *ndleafranks = sf->ndranks;
5940e23c03SJunchao Zhang   if (leafranks) *leafranks = sf->ranks;
6040e23c03SJunchao Zhang   if (leafoffset) *leafoffset = sf->roffset;
6140e23c03SJunchao Zhang   if (leafloc) *leafloc = sf->rmine;
6240e23c03SJunchao Zhang   if (leafrremote) *leafrremote = sf->rremote;
6340e23c03SJunchao Zhang   PetscFunctionReturn(0);
6440e23c03SJunchao Zhang }
6540e23c03SJunchao Zhang 
6640e23c03SJunchao Zhang PETSC_INTERN PetscErrorCode PetscSFSetUp_Basic(PetscSF);
6740e23c03SJunchao Zhang PETSC_INTERN PetscErrorCode PetscSFView_Basic(PetscSF, PetscViewer);
6840e23c03SJunchao Zhang PETSC_INTERN PetscErrorCode PetscSFReset_Basic(PetscSF);
6940e23c03SJunchao Zhang PETSC_INTERN PetscErrorCode PetscSFDestroy_Basic(PetscSF);
70ad227feaSJunchao Zhang PETSC_INTERN PetscErrorCode PetscSFBcastEnd_Basic(PetscSF, MPI_Datatype, const void *, void *, MPI_Op);
7100816365SJunchao Zhang PETSC_INTERN PetscErrorCode PetscSFReduceEnd_Basic(PetscSF, MPI_Datatype, const void *, void *, MPI_Op);
72eb02082bSJunchao Zhang PETSC_INTERN PetscErrorCode PetscSFFetchAndOpBegin_Basic(PetscSF, MPI_Datatype, PetscMemType, void *, PetscMemType, const void *, void *, MPI_Op);
7372502a1fSJunchao Zhang PETSC_INTERN PetscErrorCode PetscSFCreateEmbeddedRootSF_Basic(PetscSF, PetscInt, const PetscInt *, PetscSF *);
7440e23c03SJunchao Zhang PETSC_INTERN PetscErrorCode PetscSFGetLeafRanks_Basic(PetscSF, PetscInt *, const PetscMPIInt **, const PetscInt **, const PetscInt **);
7571438e86SJunchao Zhang 
7671438e86SJunchao Zhang #if defined(PETSC_HAVE_NVSHMEM)
7771438e86SJunchao Zhang PETSC_INTERN PetscErrorCode PetscSFReset_Basic_NVSHMEM(PetscSF);
7871438e86SJunchao Zhang #endif
7971438e86SJunchao Zhang 
8040e23c03SJunchao Zhang #endif
81