xref: /petsc/src/vec/is/sf/impls/basic/sfbasic.h (revision 71438e86cf8dea9f708c08733b37fef8eb68dc06)
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;
28*71438e86SJunchao Zhang  #if defined(PETSC_HAVE_NVSHMEM)
29*71438e86SJunchao Zhang   PetscInt         rootbuflen_rmax; /* max rootbuflen[REMOTE] over comm */
30*71438e86SJunchao Zhang   PetscInt         nRemoteLeafRanks;    /* niranks - ndiranks */                                                                       \
31*71438e86SJunchao Zhang   PetscInt         nRemoteLeafRanksMax; /* max nRemoteLeafRanks over comm */
32*71438e86SJunchao Zhang 
33*71438e86SJunchao 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 */
34*71438e86SJunchao Zhang   PetscInt         *leafsigdisp;    /* [nRemoteLeafRanks]. For my i-th remote leaf rank, I am its leafsigdisp[i]-th root rank */
35*71438e86SJunchao Zhang 
36*71438e86SJunchao Zhang   PetscInt         *leafbufdisp_d;
37*71438e86SJunchao Zhang   PetscInt         *leafsigdisp_d;  /* Copy of leafsigdisp[] on device */
38*71438e86SJunchao Zhang   PetscMPIInt      *iranks_d;       /* Copy of the remote part of (leaf) iranks[] on device */
39*71438e86SJunchao Zhang   PetscInt         *ioffset_d;      /* Copy of the remote part of ioffset[] on device */
40*71438e86SJunchao Zhang  #endif
4140e23c03SJunchao Zhang } PetscSF_Basic;
4240e23c03SJunchao Zhang 
4340e23c03SJunchao Zhang PETSC_STATIC_INLINE PetscErrorCode PetscSFGetRootInfo_Basic(PetscSF sf,PetscInt *nrootranks,PetscInt *ndrootranks,const PetscMPIInt **rootranks,const PetscInt **rootoffset,const PetscInt **rootloc)
4440e23c03SJunchao Zhang {
4540e23c03SJunchao Zhang   PetscSF_Basic *bas = (PetscSF_Basic*)sf->data;
4640e23c03SJunchao Zhang 
4740e23c03SJunchao Zhang   PetscFunctionBegin;
4840e23c03SJunchao Zhang   if (nrootranks)  *nrootranks  = bas->niranks;
4940e23c03SJunchao Zhang   if (ndrootranks) *ndrootranks = bas->ndiranks;
5040e23c03SJunchao Zhang   if (rootranks)   *rootranks   = bas->iranks;
5140e23c03SJunchao Zhang   if (rootoffset)  *rootoffset  = bas->ioffset;
5240e23c03SJunchao Zhang   if (rootloc)     *rootloc     = bas->irootloc;
5340e23c03SJunchao Zhang   PetscFunctionReturn(0);
5440e23c03SJunchao Zhang }
5540e23c03SJunchao Zhang 
5640e23c03SJunchao Zhang PETSC_STATIC_INLINE PetscErrorCode PetscSFGetLeafInfo_Basic(PetscSF sf,PetscInt *nleafranks,PetscInt *ndleafranks,const PetscMPIInt **leafranks,const PetscInt **leafoffset,const PetscInt **leafloc,const PetscInt **leafrremote)
5740e23c03SJunchao Zhang {
5840e23c03SJunchao Zhang   PetscFunctionBegin;
5940e23c03SJunchao Zhang   if (nleafranks)  *nleafranks  = sf->nranks;
6040e23c03SJunchao Zhang   if (ndleafranks) *ndleafranks = sf->ndranks;
6140e23c03SJunchao Zhang   if (leafranks)   *leafranks   = sf->ranks;
6240e23c03SJunchao Zhang   if (leafoffset)  *leafoffset  = sf->roffset;
6340e23c03SJunchao Zhang   if (leafloc)     *leafloc     = sf->rmine;
6440e23c03SJunchao Zhang   if (leafrremote) *leafrremote = sf->rremote;
6540e23c03SJunchao Zhang   PetscFunctionReturn(0);
6640e23c03SJunchao Zhang }
6740e23c03SJunchao Zhang 
6840e23c03SJunchao Zhang PETSC_INTERN PetscErrorCode PetscSFSetUp_Basic(PetscSF);
6940e23c03SJunchao Zhang PETSC_INTERN PetscErrorCode PetscSFView_Basic(PetscSF,PetscViewer);
7040e23c03SJunchao Zhang PETSC_INTERN PetscErrorCode PetscSFReset_Basic(PetscSF);
7140e23c03SJunchao Zhang PETSC_INTERN PetscErrorCode PetscSFDestroy_Basic(PetscSF);
72ad227feaSJunchao Zhang PETSC_INTERN PetscErrorCode PetscSFBcastEnd_Basic  (PetscSF,MPI_Datatype,const void*,void*,MPI_Op);
7300816365SJunchao Zhang PETSC_INTERN PetscErrorCode PetscSFReduceEnd_Basic      (PetscSF,MPI_Datatype,const void*,void*,MPI_Op);
74eb02082bSJunchao Zhang PETSC_INTERN PetscErrorCode PetscSFFetchAndOpBegin_Basic(PetscSF,MPI_Datatype,PetscMemType,void*,PetscMemType,const void*,void*,MPI_Op);
7572502a1fSJunchao Zhang PETSC_INTERN PetscErrorCode PetscSFCreateEmbeddedRootSF_Basic(PetscSF,PetscInt,const PetscInt*,PetscSF*);
7640e23c03SJunchao Zhang PETSC_INTERN PetscErrorCode PetscSFGetLeafRanks_Basic(PetscSF,PetscInt*,const PetscMPIInt**,const PetscInt**,const PetscInt**);
77*71438e86SJunchao Zhang 
78*71438e86SJunchao Zhang #if defined(PETSC_HAVE_NVSHMEM)
79*71438e86SJunchao Zhang PETSC_INTERN PetscErrorCode PetscSFReset_Basic_NVSHMEM(PetscSF);
80*71438e86SJunchao Zhang #endif
81*71438e86SJunchao Zhang 
8240e23c03SJunchao Zhang #endif
83