GPU backend of the element-set interface exchange. When every set with interface faces supplies a device trace (SetTraceRef%trace_gpu), the face traces are gathered on the device and copied to the host in one transfer; the host exchange then runs as on the CPU, and the ghost traces are copied back to the device for FillSetInterfaceBoundary_gpu. Without device traces the host path runs unchanged.
| Type | Intent | Optional | Attributes | Name | ||
|---|---|---|---|---|---|---|
| type(c_ptr), | value | :: | extBoundary | |||
| type(c_ptr), | value | :: | ghost | |||
| type(c_ptr), | value | :: | elems | |||
| type(c_ptr), | value | :: | sides | |||
| integer(kind=c_int), | value | :: | f0 | |||
| integer(kind=c_int), | value | :: | nFaces | |||
| integer(kind=c_int), | value | :: | nvar | |||
| integer(kind=c_int), | value | :: | nvarMax | |||
| integer(kind=c_int), | value | :: | N | |||
| integer(kind=c_int), | value | :: | nel |
| Type | Intent | Optional | Attributes | Name | ||
|---|---|---|---|---|---|---|
| type(c_ptr), | value | :: | outbox | |||
| type(c_ptr), | value | :: | trace | |||
| type(c_ptr), | value | :: | elems | |||
| type(c_ptr), | value | :: | sides | |||
| integer(kind=c_int), | value | :: | f0 | |||
| integer(kind=c_int), | value | :: | nFaces | |||
| integer(kind=c_int), | value | :: | nvar | |||
| integer(kind=c_int), | value | :: | nvarMax | |||
| integer(kind=c_int), | value | :: | N | |||
| integer(kind=c_int), | value | :: | nel |
| Type | Visibility | Attributes | Name | Initial | |||
|---|---|---|---|---|---|---|---|
| integer, | public | :: | N | = | 0 | ||
| integer, | public | :: | comm | = | MPI_COMM_NULL | ||
| integer, | public, | allocatable | :: | faceElem(:) | element in set k's sub-mesh |
||
| type(c_ptr), | public | :: | faceElem_gpu | = | c_null_ptr | ||
| integer, | public, | allocatable | :: | faceFlip(:) | mod(sideInfo(4),10) of the receiving side |
||
| integer, | public, | allocatable | :: | facePartnerElem(:) | partner element in set p's sub-mesh; 0 if remote |
||
| integer, | public, | allocatable | :: | facePartnerFace(:) | local face index of the partner; 0 if remote Own and partner traces, (1:Np,1:Np,1:nvarMax,1:nFaces). Pointers so a GPU backend can copy them to and from device memory with c_loc. |
||
| integer, | public, | allocatable | :: | facePartnerRank(:) | rank owning the partner element |
||
| integer, | public, | allocatable | :: | facePartnerSet(:) | partner set p |
||
| integer, | public, | allocatable | :: | facePartnerSide(:) | partner local side 1..6 |
||
| integer, | public, | allocatable | :: | faceSet(:) | receiving set k |
||
| integer, | public, | allocatable | :: | faceSide(:) | local side 1..6 |
||
| integer, | public, | allocatable | :: | faceSideId(:) | |global side id| |
||
| type(c_ptr), | public | :: | faceSide_gpu | = | c_null_ptr | ||
| real(kind=prec), | public, | pointer, contiguous | :: | ghost(:,:,:,:) | => | null() | Neighbour ranks and their faces |
| type(c_ptr), | public | :: | ghost_gpu | = | c_null_ptr | ||
| integer, | public | :: | mpiPrec | ||||
| integer, | public | :: | nFaces | = | 0 | ||
| integer, | public | :: | nNbr | = | 0 | ||
| integer, | public | :: | nSets | = | 0 | ||
| integer, | public, | allocatable | :: | nbrFace(:) | local face index, ordered by neighbour then side id |
||
| integer, | public, | allocatable | :: | nbrFaceStart(:) | (1:nNbr+1) |
||
| integer, | public, | allocatable | :: | nbrRank(:) | |||
| integer, | public | :: | nvarMax | = | 0 | Local interface faces, f = 1..nFaces |
|
| integer, | public, | allocatable | :: | nvarOfSet(:) | |||
| real(kind=prec), | public, | pointer, contiguous | :: | outbox(:,:,:,:) | => | null() | |
| type(c_ptr), | public | :: | outbox_gpu | = | c_null_ptr | ||
| integer, | public | :: | rankId | = | 0 | ||
| real(kind=prec), | public, | allocatable | :: | recvBuf(:) | |||
| integer, | public, | allocatable | :: | recvStart(:) | (1:nNbr+1), offsets into recvBuf |
||
| integer, | public, | allocatable | :: | requests(:) | |||
| real(kind=prec), | public, | allocatable | :: | sendBuf(:) | |||
| integer, | public, | allocatable | :: | sendStart(:) | (1:nNbr+1), offsets into sendBuf |
||
| integer, | public, | allocatable | :: | setFaceStart(:) | (1:nSets+1) |
| procedure, public :: BuildMap => BuildMap_SetInterface3D | |
| procedure, public :: Exchange => Exchange_SetInterface3D | |
| procedure, public :: ExchangeOutbox => ExchangeOutbox_SetInterface3D_t | |
| procedure, public :: Free => Free_SetInterface3D | |
| procedure, public :: GatherOutbox => GatherOutbox_SetInterface3D_t |
Build the map on the host (BuildMap_SetInterface3D_t), then copy the face element and side lists to the device and allocate device outbox and ghost buffers.
| Type | Intent | Optional | Attributes | Name | ||
|---|---|---|---|---|---|---|
| class(SetInterface3D), | intent(inout) | :: | this | |||
| type(Mesh3D), | intent(in) | :: | globalMesh | |||
| integer, | intent(in) | :: | setOfElem(1:) | |||
| integer, | intent(in) | :: | setGlobalId(1:) | |||
| integer, | intent(in) | :: | setOffsetThisRank(1:) | |||
| integer, | intent(in) | :: | nvarOfSet(1:) | |||
| integer, | intent(in) | :: | N |
As Exchange_SetInterface3D_t. If every set with local interface faces has a device trace, the outbox is gathered on the device; either way ghost is copied to the device afterwards, so FillSetInterfaceBoundary_gpu reads the current exchange.
| Type | Intent | Optional | Attributes | Name | ||
|---|---|---|---|---|---|---|
| class(SetInterface3D), | intent(inout) | :: | this | |||
| type(SetTraceRef), | intent(in) | :: | traces(1:) |
Free the device buffers, then the host map. Collective.
| Type | Intent | Optional | Attributes | Name | ||
|---|---|---|---|---|---|---|
| class(SetInterface3D), | intent(inout) | :: | this |