// CU mode: the waves of a window share one L0 cache (1-6% faster here; slower in the wide layers). The WMMA half // exchange goes through ds_bpermute (VALU-bound layer: -1..-3%) // f32 -> f16 pairs converted straight into one register (WM_CVT_ASM: no v_pack copies; -1..-3 %) // accumulator-init vectors: f32 table read with scalar loads + one select per value (PWIN_VEC_SCALAR, -2 %; replaces // PWIN_VEC_FROM_WEIGHTS) // norm / residual / embedding ReLU on packed f16 pairs (PWIN_PK_ELEM with the packed g2/b2 table; same ops, -1 %) // d4r-build-flags: -mcumode -DWM_HALF_BPERMUTE -DPWIN_VEC_SCALAR -DWM_CVT_ASM -DPWIN_PK_ELEM -DPWIN_PACKED_RESIDUAL // RDNA4: no WM_CVT_ASM (its inline asm needs the compiler's real-true16 mode on gfx12; the plain conversion // costs one pack per pair and gfx12 operands need no lane exchange anyway) // d4r-build-flags-gfx12: -mcumode -DWM_HALF_BPERMUTE -DPWIN_VEC_SCALAR -DPWIN_PK_ELEM -DPWIN_PACKED_RESIDUAL #define PWIN_F32ACC #include "pwin_pos.h" POS_ENCODER(dltss_pwin_enc0_layer, 2, 32, 64, 16, 2)