1a4963045SJacob Faibussowitsch #pragma once 240e23c03SJunchao Zhang 3cd620004SJunchao Zhang #include <petsc/private/sfimpl.h> /*I "petscsf.h" I*/ 4cd620004SJunchao Zhang 540e23c03SJunchao Zhang #define SFBASICHEADER \ 640e23c03SJunchao Zhang PetscMPIInt niranks; /* Number of incoming ranks (ranks accessing my roots) */ \ 740e23c03SJunchao Zhang PetscMPIInt ndiranks; /* Number of incoming ranks (ranks accessing my roots) in distinguished set */ \ 840e23c03SJunchao Zhang PetscMPIInt *iranks; /* Array of ranks that reference my roots */ \ 940e23c03SJunchao Zhang PetscInt itotal; /* Total number of graph edges referencing my roots */ \ 1040e23c03SJunchao Zhang PetscInt *ioffset; /* Array of length niranks+1 holding offset in irootloc[] for each rank */ \ 1140e23c03SJunchao Zhang PetscInt *irootloc; /* Incoming roots referenced by ranks starting at ioffset[rank] */ \ 12cd620004SJunchao Zhang PetscInt *irootloc_d[2]; /* A copy of irootloc[local/remote] in device memory if needed */ \ 13cd620004SJunchao Zhang PetscInt rootbuflen[2]; /* Length (in unit) of root buffers, in layout of [PETSCSF_LOCAL/REMOTE] */ \ 14cd620004SJunchao Zhang PetscBool rootcontig[2]; /* True means the local/remote segments of indices in irootloc[] are contiguous ... */ \ 15cd620004SJunchao Zhang PetscInt rootstart[2]; /* ... and start from rootstart[0] and rootstart[1] respectively */ \ 16cd620004SJunchao Zhang PetscSFPackOpt rootpackopt[2]; /* Pack optimization plans based on patterns in irootloc[]. NULL for no optimizations */ \ 17fcc7397dSJunchao Zhang PetscSFPackOpt rootpackopt_d[2]; /* Copy of rootpackopt[] on device if needed */ \ 18cd620004SJunchao Zhang PetscBool rootdups[2]; /* Indices of roots in irootloc[local/remote] have dups. Used for data-race test */ \ 19*6497c311SBarry Smith PetscMPIInt nrootreqs; /* Number of MPI requests */ \ 20cd620004SJunchao Zhang PetscSFLink avail; /* One or more entries per MPI Datatype, lazily constructed */ \ 21cd620004SJunchao Zhang PetscSFLink inuse /* Buffers being used for transactions that have not yet completed */ 2240e23c03SJunchao Zhang 2340e23c03SJunchao Zhang typedef struct { 2440e23c03SJunchao Zhang SFBASICHEADER; 2571438e86SJunchao Zhang #if defined(PETSC_HAVE_NVSHMEM) 2671438e86SJunchao Zhang PetscInt rootbuflen_rmax; /* max rootbuflen[REMOTE] over comm */ 27*6497c311SBarry Smith PetscMPIInt nRemoteLeafRanks; /* niranks - ndiranks */ 28*6497c311SBarry Smith PetscMPIInt nRemoteLeafRanksMax; /* max nRemoteLeafRanks over comm */ 2971438e86SJunchao Zhang 3071438e86SJunchao 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 */ 3171438e86SJunchao Zhang PetscInt *leafsigdisp; /* [nRemoteLeafRanks]. For my i-th remote leaf rank, I am its leafsigdisp[i]-th root rank */ 3271438e86SJunchao Zhang 3371438e86SJunchao Zhang PetscInt *leafbufdisp_d; 3471438e86SJunchao Zhang PetscInt *leafsigdisp_d; /* Copy of leafsigdisp[] on device */ 3571438e86SJunchao Zhang PetscMPIInt *iranks_d; /* Copy of the remote part of (leaf) iranks[] on device */ 3671438e86SJunchao Zhang PetscInt *ioffset_d; /* Copy of the remote part of ioffset[] on device */ 3771438e86SJunchao Zhang #endif 3840e23c03SJunchao Zhang } PetscSF_Basic; 3940e23c03SJunchao Zhang 40*6497c311SBarry Smith static inline PetscErrorCode PetscSFGetRootInfo_Basic(PetscSF sf, PetscMPIInt *nrootranks, PetscMPIInt *ndrootranks, const PetscMPIInt **rootranks, const PetscInt **rootoffset, const PetscInt **rootloc) 41d71ae5a4SJacob Faibussowitsch { 4240e23c03SJunchao Zhang PetscSF_Basic *bas = (PetscSF_Basic *)sf->data; 4340e23c03SJunchao Zhang 4440e23c03SJunchao Zhang PetscFunctionBegin; 4540e23c03SJunchao Zhang if (nrootranks) *nrootranks = bas->niranks; 4640e23c03SJunchao Zhang if (ndrootranks) *ndrootranks = bas->ndiranks; 4740e23c03SJunchao Zhang if (rootranks) *rootranks = bas->iranks; 4840e23c03SJunchao Zhang if (rootoffset) *rootoffset = bas->ioffset; 4940e23c03SJunchao Zhang if (rootloc) *rootloc = bas->irootloc; 503ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 5140e23c03SJunchao Zhang } 5240e23c03SJunchao Zhang 53*6497c311SBarry Smith static inline PetscErrorCode PetscSFGetLeafInfo_Basic(PetscSF sf, PetscMPIInt *nleafranks, PetscMPIInt *ndleafranks, const PetscMPIInt **leafranks, const PetscInt **leafoffset, const PetscInt **leafloc, const PetscInt **leafrremote) 54d71ae5a4SJacob Faibussowitsch { 5540e23c03SJunchao Zhang PetscFunctionBegin; 5640e23c03SJunchao Zhang if (nleafranks) *nleafranks = sf->nranks; 5740e23c03SJunchao Zhang if (ndleafranks) *ndleafranks = sf->ndranks; 5840e23c03SJunchao Zhang if (leafranks) *leafranks = sf->ranks; 5940e23c03SJunchao Zhang if (leafoffset) *leafoffset = sf->roffset; 6040e23c03SJunchao Zhang if (leafloc) *leafloc = sf->rmine; 6140e23c03SJunchao Zhang if (leafrremote) *leafrremote = sf->rremote; 623ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 6340e23c03SJunchao Zhang } 6440e23c03SJunchao Zhang 6540e23c03SJunchao Zhang PETSC_INTERN PetscErrorCode PetscSFSetUp_Basic(PetscSF); 6640e23c03SJunchao Zhang PETSC_INTERN PetscErrorCode PetscSFView_Basic(PetscSF, PetscViewer); 6740e23c03SJunchao Zhang PETSC_INTERN PetscErrorCode PetscSFReset_Basic(PetscSF); 6840e23c03SJunchao Zhang PETSC_INTERN PetscErrorCode PetscSFDestroy_Basic(PetscSF); 69f5d27ee7SJunchao Zhang PETSC_INTERN PetscErrorCode PetscSFBcastBegin_Basic(PetscSF, MPI_Datatype, PetscMemType, const void *, PetscMemType, void *, MPI_Op); 70ad227feaSJunchao Zhang PETSC_INTERN PetscErrorCode PetscSFBcastEnd_Basic(PetscSF, MPI_Datatype, const void *, void *, MPI_Op); 71f5d27ee7SJunchao Zhang PETSC_INTERN PetscErrorCode PetscSFReduceBegin_Basic(PetscSF, MPI_Datatype, PetscMemType, const void *, PetscMemType, void *, MPI_Op); 7200816365SJunchao Zhang PETSC_INTERN PetscErrorCode PetscSFReduceEnd_Basic(PetscSF, MPI_Datatype, const void *, void *, MPI_Op); 73eb02082bSJunchao Zhang PETSC_INTERN PetscErrorCode PetscSFFetchAndOpBegin_Basic(PetscSF, MPI_Datatype, PetscMemType, void *, PetscMemType, const void *, void *, MPI_Op); 74f5d27ee7SJunchao Zhang PETSC_INTERN PetscErrorCode PetscSFFetchAndOpEnd_Basic(PetscSF, MPI_Datatype, void *, const void *, void *, MPI_Op); 7572502a1fSJunchao Zhang PETSC_INTERN PetscErrorCode PetscSFCreateEmbeddedRootSF_Basic(PetscSF, PetscInt, const PetscInt *, PetscSF *); 76*6497c311SBarry Smith PETSC_INTERN PetscErrorCode PetscSFGetLeafRanks_Basic(PetscSF, PetscMPIInt *, const PetscMPIInt **, const PetscInt **, const PetscInt **); 7771438e86SJunchao Zhang 7871438e86SJunchao Zhang #if defined(PETSC_HAVE_NVSHMEM) 7971438e86SJunchao Zhang PETSC_INTERN PetscErrorCode PetscSFReset_Basic_NVSHMEM(PetscSF); 8071438e86SJunchao Zhang #endif 81