swin_tok.h passes the weights as the first WMMA operand and the activations as the second, so each GEMM's encoded result is already the next one's operand and stays in registers (swin_block.h transposes every result through LDS). One wave owns one 4x4 window for the whole block: norms, attention and the MLP need no LDS and no barriers; only the patch expand and the patch merge go through an e4m3 image in LDS. Outputs are bit-identical to swin_block.h (swapped WMMA operand roles, verified on an RX 9070 XT and on recorded launches). mix2 rounds in place (accumulator is addend and destination, no copy per pair). -DSWIN_NO_TOKEN_LANES builds these layers from swin_block.h again; enc2 and dec2 are unchanged. RX 9070 XT accuracy set, 2560x1440 render: whole evaluation 8.56 -> 7.18 ms.
23 lines
820 B
Plaintext
23 lines
820 B
Plaintext
// fast numerics: intermediate activations f16 (no FP8 re-quantisation), f32 accumulation through GEMM chains
|
|
#define SWIN_NO_Q8
|
|
#define SWIN_F32ACC
|
|
#ifndef SWIN_MAX_VGPR
|
|
#define SWIN_MAX_VGPR 192
|
|
#endif
|
|
#ifndef SWIN_MLP_R
|
|
#define SWIN_MLP_R(NW) 2
|
|
#endif
|
|
// NGX can recycle a weights address for another tube block after feature
|
|
// recreation. Address-only caching then serves stale packed weights. Prepare
|
|
// each launch; the default single image is sufficient on the launch stream.
|
|
#define SWIN_PREP_KEY_AT 0
|
|
// RDNA4 native FP8 builds use the token-lane block (swin_tok.h); -DSWIN_NO_TOKEN_LANES keeps swin_block.h
|
|
#ifndef SWIN_NO_TOKEN_LANES
|
|
#define SWIN_TOKEN_LANES
|
|
#endif
|
|
#include "swin_block.h"
|
|
#ifndef SWIN_NW
|
|
#define SWIN_NW 8
|
|
#endif
|
|
SWIN_MODULE_W(rrlite_enc3_tube_4x4, 128, 4, SWIN_NW, 0, true, TubeParams, 0)
|