|
Neko 1.99.9
A portable framework for high-order spectral element flow simulations
|
#include <dudxyz_kernel.h>
Static Public Member Functions | |
| static __device__ void | run (T *__restrict__, const T *__restrict__, const T *__restrict__, const T *__restrict__, const T *__restrict__, const T *__restrict__, const T *__restrict__, const T *__restrict__, const T *__restrict__) |
Device kernel for the derivative on the fp64 tensor cores, with the element staged by the TMA engine
Same three contractions and the same cube layout as dudxyz_dmma_elem(), and at lx == DMMA_P the padding is empty and the cube offset is the flat point index, so the arithmetic is identical – only how the six cubes get in and out of shared memory differs.
u arrives as one bulk copy on its own mbarrier and the four factors dr, ds, dt and jacinv as four more on a second, waited on only at the pointwise step, so they are in flight underneath the three contractions. That is 80% of the read traffic moved out from between two barriers, the same share the axhelm variant moves. Five copies issued together is a smaller batch than that kernel's eight but the same shape – every one of the element's reads in one issue – which is what separates the scalar axhelm variant that won from the component-at-a-time vector one that did not.
The result is formed in the staged input, dead once the contractions are done, and leaves as a single bulk store. Nothing is contracted back, so the block is 33.8 kB against the axhelm variant's 45.5 – six resident blocks per SM rather than five.
See dmma_tma_kernel.h for the primitives, the sm_90 and toolkit guards and the lx == DMMA_P bound.
Definition at line 586 of file dudxyz_kernel.h.
|
inlinestatic |
Definition at line 587 of file dudxyz_kernel.h.