Per-layer staged-image engine for the eleven translated denoiser Swin layers: descriptors (verified offsets per phase), cut recipes that splice an isolated native phase into NVIDIA's PTX, wave templates, epilogue notes and GPU probes. The isolated phase-8 splice produces a byte-identical final 4K frame but is slower than the translated body (14.90 vs 6.59 ms) - a correctness experiment, not a shipping improvement; docs/rr-engine.md records the design and the next direct-converter win (B operands built from transposed accumulators).
47 KiB
cuda_dldn_engine_swin_enc4_kernel — the epilogues of phases 1…62
Companion to kernels/rr/rr_layer_spec.py enc4. Everything below was read out of
~/.cache/d4r-rr-corpus/0017-PREPASS_ENTRYPOINT_NAME.ptx, entry
cuda_dldn_engine_swin_enc4_kernel.
0. Conventions
sNNNNis a statement index in the linearisationrr_layer_spec.pydocuments (statements of the entry body; a wrapped{ … }block and a 4-linemma.synccount as one statement, numbered at its first line).LNNNNNis the physical line of the same instruction in the corpus file, so every claim can be checked withsed -n 'LNNNNN,LNNNNN p' …ptx.- An epilogue is the run of statements between one phase's last
mmaand the next phase's firstmma. Wdenotes the prepared weight image:ld.param.u64 %rd2, [cuda_dldn_engine_swin_enc4_kernel_param_0+40](s9), globalised ascvta.to.global.u64 %rd3, %rd2(s10). Everyld.weak.global.ca.v4.u32in an epilogue readsW + 16*laneid + imm. (s20229 re-reads the same parameter; the pointer is not cached.)Sdenotes the plane arena:param_0+48, reached asld.param.u64 %rd808, [%rd1+-32]with%rd1 = param_0+80(add.s64 %rd1, %rd9, 80, s4) thencvta.to.global.u64 %rd5, %rd808(s19817–s19818).- The C/D register layout and the weight-addressing formula are fixed (see the
settled notes):
C/D reg0 = (row g, cols 2t,2t+1),reg1 = (row g+8, same cols),g = laneid>>2,t = laneid&3. rr_layer_spec.py's printedM/N/Kcome fromgeom()(distinct A/B fragment counts and accumulator-chain length). ThePhaseobject's ownw_min..w_max/n_tiles/k_slotsfields use a different (512-byte-block) convention and disagree withgeom()on the stem phases; §2 usesgeom()and checks the arithmetic explicitly.- Anything I could not pin down from the PTX is in §6 under uncharacterised.
1. Shared vocabulary
1.1 Addresses and parameters an epilogue touches
| symbol | how it is obtained | statements |
|---|---|---|
W (weight image, 533844 bytes) |
ld.param.u64 %rd2, [param_0+40] |
s9 (re-read s20229, s21313) |
S (plane arena, param+48) |
ld.param.u64 %rd808, [%rd1+-32] → cvta.to.global.u64 %rd5, %rd808 |
s19817–s19818 |
output buffer (param+56) |
ld.param.u64 %rd849, [%rd945+-24] with %rd945 = param_0+80 |
s21037–s21038 |
input plane (param+8) |
ld.param.u64 %rd11, [%rd1+-72] → cvta.to.global.u64 %rd4, %rd11 |
s22–s23 |
extents (ex, ey) |
ld.param.v2.u32 {%r575, %r576}, [param_0+0]; re-read as ld.param.v2.u32 {%r29719, %r29720}, [%rd940+-80] |
s15; s20222 |
block origin (x0, y0) |
%r570 = ctaid.x<<3, %r1 = %r570 - %rs124; %r574 = ctaid.y<<3, %r3 = %r574 - %rs125; %r2 = %r1 - 1, %r6 = %r3 - 1; %rs124/%rs125 from ld.param.v2.u16 [param_0+80] |
s2, s3, s7, s12, s13, s14, s16, s5 |
%rd9 = param_0 |
mov.b64 %rd9, cuda_dldn_engine_swin_enc4_kernel_param_0 |
s1 |
shared base %r11752 |
mov.u32 %r11752, _ZZ33cuda_dldn_engine_swin_enc4_kernel33DldnEngineSwinEncParamsStructBaseE4smem |
s7511 |
%r31615 (second copy) |
same mov.u32 in E62 |
s21312 |
| per-lane weight address | mul.wide.u32 %rd, %laneid, 16 + add.s64 %rd, %rd2, %rd |
e.g. s11983–s11984, s12267–s12268 |
| per-lane table address | shl.b32 %r, %laneid, 2 → cvt.u64.u32 → and.b64 %rd, %r, 12 → add.s64 %rd, %rd74/…, %rd = W + ((laneid<<2)&12) |
e.g. s13552–s13555 |
As in enc0/enc3, a ld.global.v2.u16 or ld.global.u32 with that addressing reads
the same 16-byte record from the four lanes with equal laneid&3, so those
tables are indexed by column, not by row.
The %tid.z guard setp.gt.u32 %p8, %r9, 3; @%p8 bra at s20–s21 bounds %tid.z
to 0…3 for the whole mma region; the eight phases that stage through shared memory
(E12→P13…P20) add (tid.z << 11) (s11969) resp. (tid.z << 9) (s12028) to the
arena base.
1.2 Constants that survive between epilogues
| register | first definition | literal | meaning |
|---|---|---|---|
%f476 |
s8077 mov.f32 %f476, 0f3C8CCB50 |
0.017186790704727173 | f16 0x2466 = 0.017181396484375 (softmax input scale) |
%fd383 |
s8081 mov.f64 %fd383, 0dBFE1CC0000000000 |
−0.55615234375 | f16 clamp lower bound |
%fd385 |
s8086 mov.f64 %fd385, 0d3FE1CC0000000000 |
+0.55615234375 | f16 clamp upper bound |
%f478 |
s8092 mov.f32 %f478, 0f3F6D6000 |
0.92724609375 | cubic coefficient |
%f480 |
s8097 mov.f32 %f480, 0f3FB00000 |
1.375 | cubic constant term |
%fd1 |
s5976 mov.f64 %fd1, 0d3F20000000000000 |
2⁻¹³ | norm epsilon |
%f1117 |
s13641 mov.f32 %f1117, 0f3ED306EB |
0.4121621549129486 | activation coefficient |
%f1118 |
s13644 mov.f32 %f1118, 0f3DA60DD6 |
0.0810810774564743 | activation coefficient |
%f1119 |
s13647 mov.f32 %f1119, 0f3F000000 |
0.5 | activation offset |
%f1120 |
s13650 mov.f32 %f1120, 0f40000000 |
2.0 | activation clamp |
%f1152 |
s21429 mov.f32 %f1152, 0f3F800000 |
1.0 | softmax dividend |
%f1148 |
s21606 mov.f32 %f1148, 0f3E800000 |
0.25 | final output scale |
%f1117…%f1120 are defined inside E21 (phase 21's epilogue) and re-materialised
inside every odd phase's epilogue (E23, E25, … E59, e.g. s14094–s14100 cvt.rn.f16.f32 low, %f1117 … %f1120), exactly as in enc3.
Live across the whole mma region (defined in the prologue, read by every warp reduction):
| register | statement | value | used as |
|---|---|---|---|
%r10789 |
s7548 | 1 | shfl.sync.bfly b operand, bit 0 |
%r10798 |
s7549 | 2 | shfl.sync.bfly b operand, bit 1 |
%r10800 |
s10280 | −1 | shfl.sync.bfly membermask |
The c (clamp/segment) operand of every butterfly is built as
%r = (WARP_SZ << 8) - 8192 then or.b32 %r, %r, 31 (e.g. s10279), i.e. 31 for a
32-lane warp. The shfl.sync.down cascade in E62 uses %r31545 = 1 (s21424),
%r31553 = 8 (s21417) and membermask %r31555 = -1 (s21510).
The long-lived residual vector: 48 mov.b32 {%rsA, %rsB}, %r317xx
statements (e.g. s5443, s5446 …) split registers produced by
cvt.rn.f16x2.e4m3x2 %r31707, %rs128 (s5439) into f16 halves. %rs128 comes from
a prologue ld.global.v2.u16 off the input plane (param_0+8, s22–s23). These
halves are the second addend of the E12 column-table add (§3/E12).
1.3 Quantisation helpers
cvt.rn.satfinite.e4m3x2.f16x2— the requantisation used everywhere (f16x2_to_e4m3x2_satfinite_bitsinptx/lib/zluda_ptx_impl.cpp).cvt.rn.f16x2.e4m3x2— its inverse, used only in the prologue (s5439 ff.).rcp.approx.ftz.f32,rsqrt.approx.ftz.f32,ex2.approx.ftz.f32,div.approx.ftz.f32— always wrapped ascvt.f32.f16 → op → cvt.rn.f16.f32(each step rounded through f16).
1.4 The shared arena
_ZZ…E4smem is declared 16384 bytes. The mma A operands of phases 1…10 come
from 30 ld.shared.v4.u32 at %r11753 = %r11752 + 16*laneid plus
512*k, k = 0…29 (s7513–s7542, lines 11835–11864); phases 13…20 come from 8
such loads at %r11752 + (tid.z<<9) + 16*laneid + {0,2048,…,14336} (s12033,
s12265, s12312, …, s12547); phase 61 comes from 80 ld.shared.u32
(s20242–s21030). The arena is written by the prologue (s7494–s7504), by E12
(s11986–s12025) and by E60 (s20051–s20215). See §6/U3.
2. Phase table summary
Reproduced from rr_layer_spec.py enc4 with M, N, K from geom() and
check = (M/16)·(N/8)·(K/32):
| # | stmt range | lines | M | N | K | nA | nB | chains | klens | mma | check | =? | weight bytes | C bias bytes | epi |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 1 | s7554–s7577 | L11883–12044 | 96 | 32 | 32 | 6 | 4 | 24 | 1 | 24 | 24 | Y | 320..844 | – | 7 |
| 2 | s7585–s7608 | L12064–12225 | 96 | 32 | 32 | 6 | 4 | 24 | 1 | 24 | 24 | Y | 5440..5964 | – | 7 |
| 3 | s7616–s7639 | L12245–12406 | 96 | 32 | 32 | 6 | 4 | 24 | 1 | 24 | 24 | Y | 1344..1868 | – | 7 |
| 4 | s7647–s7670 | L12426–12587 | 96 | 32 | 32 | 6 | 4 | 24 | 1 | 24 | 24 | Y | 6464..6988 | – | 7 |
| 5 | s7678–s7701 | L12607–12768 | 96 | 32 | 32 | 6 | 4 | 24 | 1 | 24 | 24 | Y | 2368..2892 | – | 7 |
| 6 | s7709–s7732 | L12788–12949 | 96 | 32 | 32 | 6 | 4 | 24 | 1 | 24 | 24 | Y | 7488..8012 | – | 7 |
| 7 | s7740–s7763 | L12969–13130 | 96 | 32 | 32 | 6 | 4 | 24 | 1 | 24 | 24 | Y | 3392..3916 | – | 7 |
| 8 | s7771–s7794 | L13150–13311 | 96 | 32 | 32 | 6 | 4 | 24 | 1 | 24 | 24 | Y | 8512..9036 | – | 7 |
| 9 | s7802–s7825 | L13331–13492 | 96 | 32 | 32 | 6 | 4 | 24 | 1 | 24 | 24 | Y | 4416..4940 | – | 7 |
| 10 | s7833–s7856 | L13512–13673 | 96 | 32 | 32 | 6 | 4 | 24 | 1 | 24 | 24 | Y | 9536..10060 | – | 171 |
| 11 | s8028–s8075 | L14061–14390 | 64 | 96 | 32 | 4 | 12 | 48 | 1 | 48 | 48 | Y | – | 10560..22348 | 3844 |
| 12 | s11920–s11967 | L24541–24870 | 192 | 96 | 96 | 12 | 12 | 16 | 3 | 48 | 432 | N | – | – | 274 |
| 13 | s12242–s12261 | L25484–25617 | 16 | 160 | 32 | 1 | 20 | 20 | 1 | 20 | 20 | Y | 22848..27468 | – | 27 |
| 14 | s12289–s12308 | L25675–25808 | 16 | 160 | 32 | 1 | 20 | 20 | 1 | 20 | 20 | Y | 50496..55116 | – | 27 |
| 15 | s12336–s12355 | L25866–25999 | 16 | 160 | 32 | 1 | 20 | 20 | 1 | 20 | 20 | Y | 78144..82764 | – | 27 |
| 16 | s12383–s12402 | L26057–26190 | 16 | 160 | 32 | 1 | 20 | 20 | 1 | 20 | 20 | Y | 105792..110412 | – | 27 |
| 17 | s12430–s12449 | L26248–26381 | 16 | 160 | 32 | 1 | 20 | 20 | 1 | 20 | 20 | Y | 133440..138060 | – | 27 |
| 18 | s12477–s12496 | L26439–26572 | 16 | 160 | 32 | 1 | 20 | 20 | 1 | 20 | 20 | Y | 161088..165708 | – | 27 |
| 19 | s12524–s12543 | L26630–26763 | 16 | 160 | 32 | 1 | 20 | 20 | 1 | 20 | 20 | Y | 188736..193356 | – | 27 |
| 20 | s12571–s12590 | L26821–26954 | 16 | 160 | 32 | 1 | 20 | 20 | 1 | 20 | 20 | Y | 216384..221004 | – | 1029 |
| 21 | s13620–s13639 | L29419–29552 | 80 | 160 | 160 | 5 | 20 | 4 | 5 | 20 | 500 | N | 222144..226764 | 227264..227312 | 321 |
| 22 | s13961–s13980 | L30506–30639 | 16 | 160 | 32 | 1 | 20 | 20 | 1 | 20 | 20 | Y | 227328..231948 | – | 92 |
| 23 | s14073–s14092 | L30842–30975 | 80 | 160 | 160 | 5 | 20 | 4 | 5 | 20 | 500 | N | 232768..237388 | 237888..237936 | 172 |
| 24 | s14265–s14284 | L31538–31671 | 16 | 160 | 32 | 1 | 20 | 20 | 1 | 20 | 20 | Y | 237952..242572 | – | 92 |
| 25 | s14377–s14396 | L31874–32007 | 80 | 160 | 160 | 5 | 20 | 4 | 5 | 20 | 500 | N | 243072..247692 | 248192..248240 | 172 |
| 26 | s14569–s14588 | L32570–32703 | 16 | 160 | 32 | 1 | 20 | 20 | 1 | 20 | 20 | Y | 248256..252876 | – | 92 |
| 27 | s14681–s14700 | L32906–33039 | 80 | 160 | 160 | 5 | 20 | 4 | 5 | 20 | 500 | N | 253376..257996 | 258496..258544 | 172 |
| 28 | s14873–s14892 | L33602–33735 | 16 | 160 | 32 | 1 | 20 | 20 | 1 | 20 | 20 | Y | 258560..263180 | – | 92 |
| 29 | s14985–s15004 | L33938–34071 | 80 | 160 | 160 | 5 | 20 | 4 | 5 | 20 | 500 | N | 263680..268300 | 268800..268848 | 172 |
| 30 | s15177–s15196 | L34634–34767 | 16 | 160 | 32 | 1 | 20 | 20 | 1 | 20 | 20 | Y | 268864..273484 | – | 92 |
| 31 | s15289–s15308 | L34970–35103 | 80 | 160 | 160 | 5 | 20 | 4 | 5 | 20 | 500 | N | 273984..278604 | 279104..279152 | 172 |
| 32 | s15481–s15500 | L35666–35799 | 16 | 160 | 32 | 1 | 20 | 20 | 1 | 20 | 20 | Y | 279168..283788 | – | 92 |
| 33 | s15593–s15612 | L36002–36135 | 80 | 160 | 160 | 5 | 20 | 4 | 5 | 20 | 500 | N | 284288..288908 | 289408..289456 | 172 |
| 34 | s15785–s15804 | L36698–36831 | 16 | 160 | 32 | 1 | 20 | 20 | 1 | 20 | 20 | Y | 289472..294092 | – | 92 |
| 35 | s15897–s15916 | L37034–37167 | 80 | 160 | 160 | 5 | 20 | 4 | 5 | 20 | 500 | N | 294592..299212 | 299712..299760 | 172 |
| 36 | s16089–s16108 | L37730–37863 | 16 | 160 | 32 | 1 | 20 | 20 | 1 | 20 | 20 | Y | 299776..304396 | – | 92 |
| 37 | s16201–s16220 | L38066–38199 | 80 | 160 | 160 | 5 | 20 | 4 | 5 | 20 | 500 | N | 304896..309516 | 310016..310064 | 172 |
| 38 | s16393–s16412 | L38762–38895 | 16 | 160 | 32 | 1 | 20 | 20 | 1 | 20 | 20 | Y | 310080..314700 | – | 92 |
| 39 | s16505–s16524 | L39098–39231 | 80 | 160 | 160 | 5 | 20 | 4 | 5 | 20 | 500 | N | 315200..319820 | 320320..320368 | 172 |
| 40 | s16697–s16716 | L39794–39927 | 16 | 160 | 32 | 1 | 20 | 20 | 1 | 20 | 20 | Y | 320384..325004 | – | 92 |
| 41 | s16809–s16828 | L40130–40263 | 80 | 160 | 160 | 5 | 20 | 4 | 5 | 20 | 500 | N | 325504..330124 | 330624..330672 | 172 |
| 42 | s17001–s17020 | L40826–40959 | 16 | 160 | 32 | 1 | 20 | 20 | 1 | 20 | 20 | Y | 330688..335308 | – | 92 |
| 43 | s17113–s17132 | L41162–41295 | 80 | 160 | 160 | 5 | 20 | 4 | 5 | 20 | 500 | N | 335808..340428 | 340928..340976 | 172 |
| 44 | s17305–s17324 | L41858–41991 | 16 | 160 | 32 | 1 | 20 | 20 | 1 | 20 | 20 | Y | 340992..345612 | – | 92 |
| 45 | s17417–s17436 | L42194–42327 | 80 | 160 | 160 | 5 | 20 | 4 | 5 | 20 | 500 | N | 346112..350732 | 351232..351280 | 172 |
| 46 | s17609–s17628 | L42890–43023 | 16 | 160 | 32 | 1 | 20 | 20 | 1 | 20 | 20 | Y | 351296..355916 | – | 92 |
| 47 | s17721–s17740 | L43226–43359 | 80 | 160 | 160 | 5 | 20 | 4 | 5 | 20 | 500 | N | 356416..361036 | 361536..361584 | 172 |
| 48 | s17913–s17932 | L43922–44055 | 16 | 160 | 32 | 1 | 20 | 20 | 1 | 20 | 20 | Y | 361600..366220 | – | 92 |
| 49 | s18025–s18044 | L44258–44391 | 80 | 160 | 160 | 5 | 20 | 4 | 5 | 20 | 500 | N | 366720..371340 | 371840..371888 | 172 |
| 50 | s18217–s18236 | L44954–45087 | 16 | 160 | 32 | 1 | 20 | 20 | 1 | 20 | 20 | Y | 371904..376524 | – | 92 |
| 51 | s18329–s18348 | L45290–45423 | 80 | 160 | 160 | 5 | 20 | 4 | 5 | 20 | 500 | N | 377024..381644 | 382144..382192 | 172 |
| 52 | s18521–s18540 | L45986–46119 | 16 | 160 | 32 | 1 | 20 | 20 | 1 | 20 | 20 | Y | 382208..386828 | – | 92 |
| 53 | s18633–s18652 | L46322–46455 | 80 | 160 | 160 | 5 | 20 | 4 | 5 | 20 | 500 | N | 387328..391948 | 392448..392496 | 172 |
| 54 | s18825–s18844 | L47018–47151 | 16 | 160 | 32 | 1 | 20 | 20 | 1 | 20 | 20 | Y | 392512..397132 | – | 92 |
| 55 | s18937–s18956 | L47354–47487 | 80 | 160 | 160 | 5 | 20 | 4 | 5 | 20 | 500 | N | 397632..402252 | 402752..402800 | 172 |
| 56 | s19129–s19148 | L48050–48183 | 16 | 160 | 32 | 1 | 20 | 20 | 1 | 20 | 20 | Y | 402816..407436 | – | 92 |
| 57 | s19241–s19260 | L48386–48519 | 80 | 160 | 160 | 5 | 20 | 4 | 5 | 20 | 500 | N | 407936..412556 | 413056..413104 | 172 |
| 58 | s19433–s19452 | L49082–49215 | 16 | 160 | 32 | 1 | 20 | 20 | 1 | 20 | 20 | Y | 413120..417740 | – | 92 |
| 59 | s19545–s19564 | L49418–49551 | 80 | 160 | 160 | 5 | 20 | 4 | 5 | 20 | 500 | N | 418240..422860 | 423360..423408 | 172 |
| 60 | s19737–s19756 | L50114–50247 | 16 | 160 | 32 | 1 | 20 | 20 | 1 | 20 | 20 | Y | 423424..428044 | – | 1381 |
| 61 | s21138–s21217 | L51887–52440 | 320 | 640 | 640 | 20 | 80 | 4 | 20 | 80 | 32000 | N | 428544..448524 | 530944..530992 | 117 |
| 62 | s21335–s21344 | L52605–52668 | 80 | 80 | 160 | 5 | 10 | 2 | 5 | 10 | 250 | N | 531264..533324 | 533824..533840 | 323 |
Arithmetic check. Rows 1–11, 13–16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36,
38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58 and 60 satisfy
M/16 · N/8 · K/32 == mma: every A×B tile of the grid is evaluated once and the
printed M/N/K is the true GEMM shape.
Rows 12, 21, 23, 25, 27, 29, 31, 33, 35, 37, 39, 41, 43, 45, 47, 49, 51, 53, 55,
57, 59, 61 and 62 do not and are banded: only a diagonal band of the M×N
grid is evaluated, so the printed M/N are the extents spanned by the fragment
operands. The chain structure pins the real shape down:
- P12 (
48 mma, 16 chains of 3): chainc = 4·(c>>2) + (c&3)is(A_{3·(c>>2)+k}, B_{2·(c&3)+k}),k = 0,1,2— 4 row tiles × 4 column-pair groups, 3 k-steps. Real shape 64×32×96, all 16 output tiles evaluated. (Same as enc0's P6 and enc3's P10.) - P21/23/…/59 (
20 mma, 4 chains of 5): chain 0 is(A0,B0) (A1,B2) (A2,B4) (A3,B6) (A4,B8), chain 1(A_j, B_{2j+1}), chains 2/3 the same withB10…B19. Real shape 80×80×160 with only the 5×2 = 10 diagonal output tiles of a 5×10 grid evaluated. - P61 (
80 mma, 4 chains of 20): chain 0 is(A_j, B_{2j}), chain 1(A_j, B_{2j+1}), chains 2/3 withB_{40+2j},B_{40+2j+1},j = 0…19. Real shape 320×320×640 over 4 output tiles. - P62 (
10 mma, 2 chains of 5):(A_j, B_{2j})/(A_j, B_{2j+1}),j = 0…4. Real shape 80×80×160 over 2 tiles.
Phases that read no weight-image B operand: P11 (Bo = [None, None] on all
48 mma; its B is a register pack of P9's D, §3/E10) and P12 (its B is
packed from the movmatrix of P10's D, §3/E11). Every other phase loads its B
from W.
Weight-image extent. The largest byte offset used anywhere is 533840 (P62's
second C seed, ld.global.u32 [%rd900+533840]); with the 4-byte read the image is
533844 bytes, 2522 distinct weight-image byte offsets (weight_image_size). The single largest
interior gap is 448524…530944 (the 82 KiB between P61's B block and P61's bias).
3. The epilogues
Phases 1…10 (the stem), 13…59 (the norm + 20 MLP branch pairs) and 60…62 (the merge) are highly repetitive; each distinct body is written out once and the repeats are tabulated.
E1…E9 — s7578–s7584, s7609–s7615, s7640–s7646, s7671–s7677, s7702–s7708, s7733–s7739, s7764–s7770, s7795–s7801, s7826–s7832: next-B loads
Nine identical 7-statement epilogues. Each issues the two v4.u32 fragments of
the next phase's B operand (W + 16*laneid + {base, base+512}):
| epilogue | range | loads (statement / line) | offsets | next phase's W block |
|---|---|---|---|---|
| E1 | s7578–s7584 | s7582 / L12057, s7584 / L12061 | 5440, 5952 | P2 5440..5964 |
| E2 | s7609–s7615 | s7613 / L12238, s7615 / L12242 | 1344, 1856 | P3 1344..1868 |
| E3 | s7640–s7646 | s7644 / L12419, s7646 / L12423 | 6464, 6976 | P4 6464..6988 |
| E4 | s7671–s7677 | s7675 / L12600, s7677 / L12604 | 2368, 2880 | P5 2368..2892 |
| E5 | s7702–s7708 | s7706 / L12781, s7708 / L12785 | 7488, 8000 | P6 7488..8012 |
| E6 | s7733–s7739 | s7737 / L12962, s7739 / L12966 | 3392, 3904 | P7 3392..3916 |
| E7 | s7764–s7770 | s7768 / L13143, s7770 / L13147 | 8512, 9024 | P8 8512..9036 |
| E8 | s7795–s7801 | s7799 / L13324, s7801 / L13328 | 4416, 4928 | P9 4416..4940 |
| E9 | s7826–s7832 | s7830 / L13505, s7832 / L13509 | 9536, 10048 | P10 9536..10060 |
Outputs: the 8 registers of the next phase's B. Nothing else.
E10 — s7857–s8027: the score-phase bias tiles and the phase-11 operands
171 statements: 24 ld.weak.global.ca.v4.u32 (s7861/L13686 … s7907/L13778), 80
cvt.rn.satfinite.e4m3x2.f16x2 (s7908/L13781 … s8026/L14057), 40 mov.b32
(s7910/L13786 … s8027/L14059), 25 add.s64, plus the per-lane address pair.
- Score-bias C seeds (s7860–s7907): 24
v4.u32atW + 16*laneid + 10560 + 512*i,i = 0…23→ the 96Coperands of phase 11 (byte block[10560, 22348], 11792 bytes of f16). Phase 11's own mma confirm the4*(n>>1)+mtile index: for the first A-tile the C offsets run10560, 10568(s8028, s8029),12608, 12616(s8030, s8031),14656, 14664,16704, 16712,18752, 18760,20800, 20808(s8038, s8039) — i.e.10560 + 2048*(n>>1) + 8*(n&1)— and the second A-tile starts at11072(s8040) =10560 + 512. Structurally identical to enc0's[8384, 20672)and enc3's[8448, 20236). - B packs (s7910–s7979, sources from s7908): the first 24
mov.b32destinations = phase 11's twelve B fragments (24 b32), each acvt.rn.satfinite.e4m3x2.f16x2pair of two registers written by phase 9's mma (e.g.s7909: cvt %rs2341, %r7325,s7915: cvt %rs2345, %r7335,s7910: mov.b32 %r8357, {%rs2341, %rs2345}= B fragment 0). - A packs (s7982–s8027): the remaining 16
mov.b32destinations (%r8103…%r8106,%r8223…%r8226,%r8343…%r8346,%r8463…%r8466) = phase 11's four A fragments (16 b32), also from phase 9's D (s8017: cvt %rs2413, %r7445,s8021: mov.b32 %r8463, {%rs2413, %rs2414}).
As in enc3, fragment 0 of phase 11's A and of its B are bit-identical (both packs read the same two source registers).
Inputs: phase 9's 48 D registers. Outputs: phase 11's 16 A + 24 B registers and its 96 C seeds. Memory: 24 weight loads only.
E11 — s8076–s11919: the 64×96 score softmax
3844 statements, zero memory access; byte-for-byte the same code as enc3's E9
(and enc0's E5) with shifted registers. Histogram: 1048 mov.b32, 672
cvt.rn.f16.f32, 384 cvt.rn.f16.f64, 192 each fma.rn.f16x2 /
cvt.f32.f16 / rcp.approx.ftz.f32 / mul.f16, 96 each max.f16x2/min.f16x2/
neg.f16x2/mul.f16x2/and.b32, 48 movmatrix, 16 shfl.sync.bfly, 144 packs.
| range | statements | what |
|---|---|---|
| s8076–s10193 | 2118 | 96 per-element exponent groups |
| s10194–s10273 | 80 | in-lane partial-sum trees (add.f16x2) |
| s10274–s10408 | 135 | 16 shfl.sync.bfly.b32 (s10281/L21268 … s10402/L21572) → 8 row sums |
| s10411–s11172 | 769 | 192 rcp.approx.ftz.f32 → 96 reciprocals |
| s11178–s11654 | 477 | 192 mul.f16 → 96 probabilities |
| s11656–s11703 | 48 | movmatrix.sync.trans.aligned.m8n8.b16 of phase 10's 48 D registers |
| s11704–s11918 | 216 | 144 packs |
(a) per-element exponent, s8076–s10193. Per f16 half x of each of phase
11's 96 D f16x2 registers:
m = clamp(f16(x * 0.017181396484375), -0.55615234375, +0.55615234375)
u = f16(1.375 + m*(0.92724609375 - m^2))
E = (u_bits << 5) & 0x7FE07FE0 // first: s8102 shl.b32, s8103 and.b32
identical to enc0's E5(a): not exp, and the two fma.rn.f16x2 at
s8096/L14453 and s8097 are the cubic, neg.f16x2 at s8091/L14439 the −m.
(b) row sums, s10194–s10408. In-lane add.f16x2 tree, then shfl.sync.bfly
over lane bits 0 and 1 (%r10789 = 1, %r10798 = 2, membermask %r10800 = −1),
then add.f16x of the halves and broadcast.
There is no row maximum in this epilogue. Every max.f16x2 (96, s8091 …
s10183) and min.f16x2 belongs to the clamp of (a); the only shuffles are the 16
butterflies above.
(c) reciprocity and probability, s10411–s11654. 192 rcp.approx.ftz.f32
wrapped as cvt.f32.f16 → rcp → cvt.rn.f16.f32, then 192 mul.f16.
(d) V transpose, s11656–s11703. Exactly 48 movmatrix…m8n8.b16 on phase
10's 48 D registers (s11656 L23893 … s11703 L24034).
(e) packs, s11704–s11918. 144 packs: the first 24 mov.b32 → phase 12's 12
B fragments (the transposed V), the rest → phase 12's 12 A fragments.
Inputs: phase 11's 96 D, phase 10's 48 D, %r10789/%r10798/%r10800.
Outputs: phase 12's 48 A / 24 B registers plus the %f476, %fd383,
%fd385, %f478, %f480 constants. Memory: none.
E12 — s11968–s12241: P·V epilogue — pack, shared staging, residual table, next B/C
274 statements. Histogram: mov.b32×96, add.f16×80,
cvt.rn.satfinite.e4m3x2.f16x2×32, ld.global.v2.u16×20, add.s64×12,
ld.weak.global.ca.v4.u32×10, shl.b32×5, add.s32×4, mov.u32×4,
st.shared.v4.u32×4, bar.sync×2, bra×1, ld.shared.v4.u32×1,
mul.wide.u32×1, cvt.u64.u32×1, and.b64×1.
(a) require and shared staging, s11969–s12025.
s11969 L24877: shl.b32 %r12002, %r9, 11 // tid.z << 11
s11970 L24878: add.s32 %r12003, %r11752, %r12002
s11973 L24883: add.s32 %r12005, %r12003, %r12004 // + 16*laneid
s11986 L24912: st.shared.v4.u32 [%r12005], {%r12009, %r12008, %r12007, %r12006}
32 packs of phase 12's D → 16 b32 (96 mov.b32 in the whole epilogue; the other
80 pair the table adds) stored one v4.u32 each at +0, +512, +1024, +1536
(s11986, s11999, s12012, s12025).
(b) bar.sync 0 (s12026) and skip guard. s12027 L25001: @%p8 bra $L__BB1_422 with %p8 = (tid.z > 3) (s20–s21) — phases 13…20 are only run for
tid.z ≤ 3.
(c) staging read-back, s12028–s12033. %r29518 = %r11752 + (tid.z<<9) + (laneid<<4) (s12028–s12032), ld.shared.v4.u32 [%r29518] → %r29519 … %r29522 =
phase 13's A operand (one 16-byte fragment, nA = 1).
(d) next B, s12034–s12056. 10 v4.u32 at W + 16*laneid + 22848 + 512*j,
j = 0..9 → phase 13's 20 B fragments (block [22848, 27468)).
(e) residual column table, s12062–s12081. 20 ld.global.v2.u16 at
W + ((laneid<<2)&12) + {221504 + 16*i}, i = 0…19 → 40 f16 covering the 160
columns of phase 13's output.
(f) residual add, s12082–s12241. 80 add.f16 — two per f16x2 — each
table[column] + <half of the long-lived prologue residual>:
s12084 L25089: add.f16 %rs3965,%rs6450,%rs3967 // %rs6450 = W+221504, %rs3967 = residual
s12083 L25085: add.f16 %rs3968,%rs6451,%rs3970
s12085 L25092: mov.b32 %r12073, {%rs3965, %rs3968}
The 40 results %r12073 … are phase 13's C operands. The residual halves are
%r31707, %r31706, … split at s5443 ff. (§1.2).
Inputs: phase 12's D, the shared staging, W. Outputs: phase 13's A
(4 regs), B (40 regs) and C (40 regs).
E13…E19 — s12262–s12288, s12309–s12335, s12356–s12382, s12403–s12429, s12450–s12476, s12497–s12523, s12544–s12570: next-A from shared, next-B from W
Seven identical 27-statement epilogues (add.s64×11, 10 v4.u32, mov.u32×2,
shl.b32, add.s32, 1 ld.shared.v4.u32, mul.wide.u32):
s12264 L25627: add.s32 %r29525, %r29516, %r29524 // %r29516 = %r11752 + (tid.z<<9)
s12265 L25628: ld.shared.v4.u32 {…}, [%r29525+2048]
s12267 L25632: mul.wide.u32 %rd648, %r12266, 16
s12268 L25633: add.s64 %rd649, %rd2, %rd648
| epilogue | range | shared read offset | becomes | B offsets (10 loads) | next phase's W block |
|---|---|---|---|---|---|
| E13 | s12262–s12288 | s12265, +2048 |
P14 A | 50496 … 55104 | P14 50496..55116 |
| E14 | s12309–s12335 | s12312, +4096 |
P15 A | 78144 … 82752 | P15 78144..82764 |
| E15 | s12356–s12382 | s12359, +6144 |
P16 A | 105792 … 110400 | P16 105792..110412 |
| E16 | s12403–s12429 | s12406, +8192 |
P17 A | 133440 … 138048 | P17 133440..138060 |
| E17 | s12450–s12476 | s12453, +10240 |
P18 A | 161088 … 165696 | P18 161088..165708 |
| E18 | s12497–s12523 | s12500, +12288 |
P19 A | 188736 … 193344 | P19 188736..193356 |
| E19 | s12544–s12570 | s12547, +14336 |
P20 A | 216384 … 220992 | P20 216384..221004 |
E20 — s12591–s13619: the RMS norm before the MLP
1029 statements: 302 mov.b32, 240 mul.f16, 82 add.f16, 80 cvt.f32.f16,
80 rsqrt.approx.ftz.f32, 80 cvt.rn.f16.f32, 42 add.f16x2, 4
shfl.sync.bfly, 40 packs, 20 ld.global.v2.u16, 10 weight v4.u32, 4
ld.global.u32.
| range | what |
|---|---|
| s12594–s12751 | 80 mul.f16 — squares of phase 20's 40 D f16x2 |
| s12753–s12817 | 42 add.f16x2 — in-lane reduction, with the 4 shfl.sync.bfly over lane bits 0,1 at s12795/L27521, s12801, s12810, s12816/L27575 |
| s12819–s12940 | 82 add.f16 — + 2⁻¹³ (%fd1, s5976) broadcast into the f16x2 pairs |
| s12946–s13259 | 80 rsqrt.approx.ftz.f32 (s12946/L27961 … s13259/L28469) |
| s13268–s13287 | 20 ld.global.v2.u16 gain at W + ((laneid<<2)&12) + {221824 + 16*i} (s13289 mul.f16 %rs4692,%rs4693,%rs6490 with %rs6490 = W+221824) |
| s13289–s13407 | 80 mul.f16 — inv · gain |
| s13408–s13526 | 80 mul.f16 — x · (inv·gain) (s13408 mul.f16 %rs4935,%rs5217,%rs4695) |
| s13532–s13550 | 10 weight v4.u32 = phase 21's B (222144 + 512*j) |
| s13556–s13559 | 4 ld.global.u32 at W + ((laneid<<2)&12) + {227264,227280,227296,227312} = phase 21's C bias |
| s13560–s13618 | 40 packs of the normalised values → phase 21's A |
What it computes. The same per-row RMS reduction as enc3's E14, over the
160 columns of a M=16/N=160 tile: the lane's 20 one-per-n-tile partials for
each of its two rows are tree-summed in-lane, the four t = laneid&3 lanes are
folded with two butterfly steps, the f16x2 halves are added, then
inv = f16(rsqrt.approx(f32(f16(sumsq + 2^-13))))
out[row,c] = x[row,c] · inv · gain[c]
There is no mean subtraction and no 1/N. The 80 rsqrt results are the two row
sums re-emitted once per (row, n-tile) pair, not 80 distinct sums (the half-copies
that feed them are duplicates, e.g. s12818-range add.f16 … , %rs…, %rs… with
identical addends). gain[c] is per column.
Outputs: phase 21's B (40 regs) and C (4 regs), 20 packed A registers, and the normalised f16x2 registers that E21/E22 re-read.
E21 — s13640–s13960: clamped cubic activation + column bias + pack
321 statements: add.f16×80, mov.b32×76, cvt.rn.f16.f32×32, mul.f16x2×24,
20 ld.global.v2.u16, 10 weight v4.u32, 8 each neg/max/min/abs/sub/add.f16x2,
8 packs, mov.f32×4.
(a) constants and activation, s13641–s13780. Eight groups; each materialises
the activation constants (s13641 L29561: mov.f32 %f1117, 0f3ED306EB, s13644 %f1118, 0f3DA60DD6, s13647 %f1119, 0f3F000000, s13650 %f1120, 0f40000000)
and then, on phase 21's D,
y = clamp(x, -2, +2) // s13653 neg, s13654 max, s13655 min
g = 0.5 + y*(0.412109375 - 0.0810546875*|y|) // abs, mul, sub, mul, add
out = x * g // s13661 mul.f16x2
The same cubic ramp as enc0's E13 / enc3's E15 — not a sigmoid, GELU or SiLU.
(b) column bias, s13809–s13948. 20 ld.global.v2.u16 at
W + ((laneid<<2)&12) + {232464 + 16*i} then 80 add.f16, e.g.
s13932 L30428: add.f16 %rs5416,%rs6524,%rs5418 — the second addend is a half of
phase 20's D (a residual). The 40 results %r14926 … %r14956 are phase
22's C operand.
(c) pack, s13949–s13959. 8 packs of the activation outputs
(s13949 L30478: cvt.rn.satfinite.e4m3x2.f16x2 %rs5453, %r14617) → phase 22's A
fragment.
(d) next B, s13785–s13803. 10 v4.u32 at 227328 + 512*j → phase 22's B.
No stores and no ld.global beyond the two tables.
E22 / E24 / … / E58 — s13981–s14072 and its 19 repeats: next B/C loads + pack
92 statements, identical shape, for every even phase 22…58:
s13984 L30650: add.s64 %rd263, %rd676, 232768
s13985 L30652: ld.weak.global.ca.v4.u32 { %r14958,…},[%rd263] // 232768 + 512*j, 10 loads
s14009 L30697: ld.global.u32 %r…, [%rd…+237888] // C bias, 4 words at +16*i
s14013 L30702: cvt.rn.satfinite.e4m3x2.f16x2 %rs…, %r… // 40 packs
s14015 L30707: mov.b32 %r…, {%rs…, %rs…} // 20 b32 = 5 A fragments
The 40 pack sources (%r28751 %r28752 %r28753 …, s14013 L30702: cvt %rs5461, %r28752) are the normalised values E20 produced with the second of its
multi-sets, i.e. phase 23's A operand is the same normed tile phase 21's A was
built from — phases 21 and 23 are two parallel GEMMs off one normed tile, each
with its own weight block and bias. The 4 C words are
W + ((laneid<<2)&12) + {bias_base + 16*i} (s13556 L29274: ld.global.u32 %r14283, [%rd669+227264], s13557/s13558/s13559) and each is
used in both halves of the next odd phase's mma C operand: for the P23 bias
loaded by E22, s14073 C={%r15048,%r15048} with [%r15048=W+237888],
s14074 C={%r15058,%r15058} with W+237904.
| epilogue | range | next-B block | next-C bytes |
|---|---|---|---|
| E22 | s13981–s14072 | 232768..237388 | 237888..237936 |
| E24 | s14285–s14376 | 243072..247692 | 248192..248240 |
| E26 | s14589–s14680 | 253376..257996 | 258496..258544 |
| E28 | s14893–s14984 | 263680..268300 | 268800..268848 |
| E30 | s15197–s15288 | 273984..278604 | 279104..279152 |
| E32 | s15501–s15592 | 284288..288908 | 289408..289456 |
| E34 | s15805–s15896 | 294592..299212 | 299712..299760 |
| E36 | s16109–s16200 | 304896..309516 | 310016..310064 |
| E38 | s16413–s16504 | 315200..319820 | 320320..320368 |
| E40 | s16717–s16808 | 325504..330124 | 330624..330672 |
| E42 | s17021–s17112 | 335808..340428 | 340928..340976 |
| E44 | s17325–s17416 | 346112..350732 | 351232..351280 |
| E46 | s17629–s17720 | 356416..361036 | 361536..361584 |
| E48 | s17933–s18024 | 366720..371340 | 371840..371888 |
| E50 | s18237–s18328 | 377024..381644 | 382144..382192 |
| E52 | s18541–s18632 | 387328..391948 | 392448..392496 |
| E54 | s18845–s18936 | 397632..402252 | 402752..402800 |
| E56 | s19149–s19240 | 407936..412556 | 413056..413104 |
| E58 | s19453–s19544 | 418240..422860 | 423360..423408 |
E23 / E25 / … / E59 — s14093–s14264 and its 18 repeats: clamped cubic activation + pack
172 statements; identical op mix to E21 minus the table loads and the mov.f32
block (36 mov.b32, 32 cvt.rn.f16.f32, 24 mul.f16x2, 8 each
neg/max/min/abs/sub/add.f16x2, 10 weight v4.u32, 8 packs):
s14094 L30986: cvt.rn.f16.f32 low, %f1117
s14102 L31009: neg.f16x2 %r15244,%r15243
s14109 L31037: add.f16x2 %r15250,%r15243,%r15249
s14234 L31471: ld.weak.global.ca.v4.u32 { …},[%rd…] // next B, 10 loads
s14253 L31510: cvt.rn.satfinite.e4m3x2.f16x2 … // 8 packs of activation outputs
Same function as E21(a) on the odd phase's D, 8 packs of the activation outputs
→ the next even phase's A, and 10 weight loads → its B. No column bias, no
ld.global. The 18 repeats are at s14093, s14377, s14681, s14985, s15289,
s15593, s15897, s16201, s16505, s16809, s17113, s17417, s17721, s18025, s18329,
s18637, s18937, s19241, s19545 (phases 23…59 odd).
Shape of the attention + MLP region, E12–E60
P11 A = pack(P9.D) B = pack(P9.D) C = bias@10560+512i → scores 64×96
E11: cubic-exponent softmax (no row max), 48 movmatrix(P10.D) + packs
P12 A = pack(scores) B = pack(transpose(P10.D)) C = 0 → 64×32
E12: pack → shared slot, read back as P13 A; table@221504 + residual → P13 C
P13 A = shared, B = W@22848, C = table+residual → D13
E13: shared slot +2048 → P14 A; load P14 B
P14…P19 the same for the shared slots +4096 …, +14336
P20 A = shared, B = W@216384, C = D19 → D20 (16×160)
E20: row-RMS norm over 160 columns (+2^-13, rsqrt, gain@221824), pack → P21 A
P21 A = normed tile, B = W@222144, C = bias@227264 → D21 (banded 80×80×160)
E21: cubic activation(D21); table@232464 + D20 → P22 C; pack → P22 A
P22 A = pack(activation), B = W@232768, C = D20+table → D22
E22: pack of the *normed* tile → P23 A; load P23 B and C
P23 A = normed tile, B = W@237952, C = bias@237888 → D23
… the P21/P22 pair then repeats 19 more times (P23/P24 … P59/P60).
P60 A = pack(activation P59), B = W@423424, C = D58 → D60 (16×160)
E60: arena scatter, shared staging, next B/C
P61 A = 20 shared slots, B = W@428544, C = bias@530944 → 4×20 k-steps
E61: pack + scatter to param+56, next B/C
P62 A = pack(E61), B = W@531264, C = bias@533824 → D62
E62: the final epilogue
E60 — s19757–s21137: pack → plane-arena scatter → shared staging → next B/C
1381 statements. Histogram: add.s32×218, or.b32×129, shl.b32×99,
and.b32×80, ld.shared.u32×80, mul.wide.u16×69, add.s64×66, shr.u32×51,
setp.lt.s32×44, bra×41, $label×41, cvt.rn.satfinite.e4m3x2.f16x2×40,
selp.b32×40, ld.weak.global.ca.v4.u32×40, mov.b32×20, st.shared.u32×20,
st.global.u32×20, bar.sync×2, ld.global.u32×4.
(a) packs, s19757–s19816. 40 cvt.rn.satfinite.e4m3x2.f16x2 + 20 mov.b32
→ %r371 … %r390 = phase 60's 16×160 output as 20 b32 = 40 e4m3 per lane.
(b) plane-arena scatter, s19817–s20029. %rd5 = cvta(ld.param.u64 [%rd1+-32])
(s19817–s19818; %rd1 = param_0+80 ⇒ param_0+48), lane decomposition
s20035 shr %r424, laneid, 2 (g), s20036 and %r425, laneid, 3 (t), and 20
guarded st.global.u32 (s19843 L50422: st.global.u32 [%rd810], %r371 …
s20029 L50646: … %r390), each preceded by a
setp.lt.s32 %p, idx, 0 + bra guard. The index is built from
(%r1 + ((g+8j)&7)), ((tid.z<<1) + ((g+8j)>>3)) and (%r425 | 4) in the same
way as enc3's E46(b) (§6/U4).
(c) shared staging, s20033–s20215. bar.sync 0, then 20 st.shared.u32 at
%r29635 = %r11752 + (idx<<2) with
idx = t | ((laneid&28) | (y<<5)), y = (tid.z<<1) + (laneid>>5)
(s20051 L50672: st.shared.u32 [%r29635], %r371), then the +512*j variants.
(d) staging read-back, s20222–s21030. bar.sync 0 (s20220), then 80
ld.shared.u32 at %r11752 + (idx2<<2) with
idx2 = ((laneid<<1)&24) | ((laneid<<2)&0xFFFFFFC0) | (laneid&3)
(s20234–s20241) plus byte offsets {0, 1024, …, 7168} and the +16 variants
(s20242 L50905: ld.shared.u32 …). These 80 values are phase 61's 20 A
fragments. ld.param.v2.u32 [%rd940+-80] at s20222 re-reads param_0+0.
(e) next B/C, s21039–s21137. Inside the loop $L__BB1_406 (s21041),
s21039 add.s64 %rd7, %rd947, 428544, s21042: mul.lo.s32 %r31250, %r31708, 640
then 40 v4.u32 at W + 16*laneid + 428544 + 640*%r31708 + 512*j, j = 0…39
(s21048–s21126) = phase 61's 80 B fragments, and 4 ld.global.u32 at
W + ((laneid<<2)&12) + {530944, 530960, 530976, 530992} (s21134–s21137) =
phase 61's C bias.
Outputs: %r371…%r390 (read again by (c)), phase 61's A/B/C.
The shared arena is re-used four times in this epilogue — %r11752 appears as the
base of the E60 stores and of the P61 read-back.
E61 — s21218–s21334: pack → surface scatter → next B/C
117 statements: 8 packs + 2 mov.b32 (s21218–s21227), 4 guarded stores to
param_0+56 (s21257 st.global.v2.u16, s21267 st.global.u32,
s21298 st.global.u32, s21306 st.global.v2.u16), 5 bra, then 5 weight
v4.u32 (s21319–s21327) and 2 ld.global.u32 (s21333–s21334).
s21253 L52499: setp.lt.s32 %p381, %r545, 0
s21254 L52500: @%p381 bra $L__BB1_408
s21255 L52502: mul.wide.s32 %rd898, %r545, 4
s21257 L52504: st.global.v2.u16 [%rd899], {%rs6698, %rs6699}
The destination is param+56 (%rd6 = cvta(%rd849), %rd849 = ld.param.u64 [%rd945+-24], s21037–s21038), not the plane arena; the extents are
param_0+0, halved (s20223 shr %r451, %r29720, 1 = ey>>1, s20224 shr %r452, %r29719, 1 = ex>>1, s20225 shl %r453, %r452, 3 = the row stride). The index
bases use %r536 = %r1>>1 (s21036) and %r535 = %r3>>1 (s21033).
Then phase 62's B (5 v4.u32 at 531264 + 512*j) and C (2 ld.global.u32 at
533824, 533840).
E62 — s21345–s21667: the final epilogue
323 statements: 4 st.shared.u32 (s21357–s21374), 2 bar.sync, 5 ld.shared.u32
(s21414–s21422), mul.ftz.f32/ex2.approx/add.ftz.f32/div.approx×12,
12 fma.rn.f16x2, 4 shfl.sync.down.b32, 9 tex.base.2d.v4.f16.s32
(s21526–s21585), 3 sust.b.2d.v4.b16.zero (s21649, s21650, s21665).
(a) shared staging, s21345–s21374.
s21348 L52679: and.b32 %r557, %r31392, 3 // t
s21350 L52681: shl.b32 %r558, %r31608, 4 // %r31608 = tid.z
s21351 L52682: add.s32 %r31395, %r556, %r558 // g + (tid.z<<4)
s21354 L52685: mad.lo.s32 %r31398, %r31397, 6, %r557
s21357 L52688: st.shared.u32 [%r559], %r31372
Phase 62's D (%r31372/%r31382 and %r31392-group counterparts) is written to
%r31615 + 4*(6*index + t) with a %r560 > 5 guard on the second word.
(b) row max and softmax, s21387–s21613. After bar.sync 0 (s21387),
%r31565 = smem + 4*(6*%r562 + 48*%r563) (s21410–s21413) and
s21414–s21422 read a 6-element row (ld.shared.u32 [%r31565] … [+20]); then
max.f16x2 / max.f16 over the row // row maximum
sub.f16x2 x - rowmax // e.g. s21502-region
mul.ftz.f32 by log2(e), ex2.approx.ftz.f32 // 2^((x-max)*log2e)
div.approx.ftz.f32 1.0(rowsum) with %f1152 = 0f3F800000 (s21429)
mul.f16x2 p = e / rowsum
This epilogue has a real row maximum (unlike E11), and a true 2^u ex2
rather than the cubic mantissa trick.
(c) texture gather, s21421–s21590. One texture (load.param.u64 [%rd943+8] at
s21524, copied into %rd916 … %rd932, s21525–s21572) with 9
tex.base.2d.v4.f16.s32 reads forming a 3×3 stencil; the 8 neighbour coordinates
are clamped by selp chains with 1 as the out-of-range sentinel (the same
pattern as enc3's E48(c)). Each texel is weighted by one of the five softmax
values with fma.rn.f16x2 (s21530 L52979, s21547 L53007, …,
s21580 L53074) and one extra texel is folded in with fma.rn.f16.
(d) second sigmoid, difference, cross-lane sum, s21591–s21648. Three
mul.f16 + sub.f16 products and differences, %f1148 = 0.25 (s21606), then the
shfl.sync.down cascade: delta 1 (%r31545, s21424) and 8 (%r31553,
s21417), membermask %r31555 = -1 (s21510), clamp operand (WARP_SZ<<8)-8192 | 31
(s21619, s21625, s21632, s21641), each followed by add.f16x2 / add.f16.
(e) surface stores, s21646–s21667.
s21646 L53255: ld.param.u64 %rd936, [%rd943+40]
s21647 L53256: ld.param.u64 %rd938, [%rd943+48]
s21649 L53259: sust.b.2d.v4.b16.zero [%rd934, {%r31559,%r565}], {%rs6803,%rs6806,%rs6809,%rs6840}
s21650 L53262: sust.b.2d.v4.b16.zero [%rd936, {%r31559,%r565}], {%rs6794,%rs6797,%rs6800,%rs6841}
s21665 L53280: sust.b.2d.v4.b16.zero [%rd938, {%r31587,%r31588}], {%rs6842,%rs6843,%rs6827,%rs6845}
Three 4-channel b16 surface writes. The handles are param_0+32 (%rd934, read
at s21421), +40 and +48; the texel source is the texture at param_0+8
(s21524). The third store is guarded (s21655 … bra) and stores 0 in its
fourth channel as in enc3.
Inputs: phase 62's D, the shared staging of (a), param+0/+8/+32/+40/+48.
Outputs: none (the kernel rets at s21667 / L53284).
4. The plane-arena and surface writes
param_0+48 is reached once (s19817 ld.param.u64 %rd808, [%rd1+-32] with
%rd1 = param_0+80 at s4) and is never the base of an ld.* in this entry. The
complete set of global writes in the 21667-statement entry:
- E60, 20 ×
st.global.u32 [%rd5 + 4*idx], v— s19843, s19852, s19885, s19893, s19902, s19910, s19919, s19927, s19936, s19944, s19953, s19961, s19970, s19978, s19987, s19995, s20004, s20012, s20021, s20029 (§3/E60(b)). Value: phase 60's requantised 16×160 output, 20 b32 per lane. - E61, 4 stores to
param_0+56— s21257 (v2.u16), s21267 (u32), s21298 (u32), s21306 (v2.u16). - E62, 3
sust.b.2d.v4.b16.zero— s21649, s21650, s21665.
Nothing else writes to global memory.
5. Uncharacterised
U1. The identity of the 11792-byte score bias (P11's C operand). Phase 11
adds the f16 table [10560, 22348] indexed as
byte = 10560 + 512*(4*(n>>1) + m) + 16*laneid + 8*(n&1). Whether it is a
relative position bias, a learned score bias or a per-lane constant cannot be
decided from the PTX. Missing: the weight image's layout description (the
_prep permutation).
U2. The identity of the per-column tables. W+221504 (E12's C seed add),
W+221824 (E20's norm gain), W+232464 (E21's post-activation add) and
W+227264/227264+65536… (the odd phases' GEMM bias) all use the
W + ((laneid<<2)&12) + off pattern. Their role is computable (§3) but their
model names are not.
U3. The shared-arena layout. The arena (16384 bytes) is written by the
prologue (s7494–s7504), E12 (s11986–s12025) and E60 (s20051–s20215), and read by
P1–P10 (s7513–s7542, at %r11752 + 16*laneid + 512*k with no tid.z term),
P13–P20 (s12033, s12265, …, s12547, at %r11752 + (tid.z<<9) + 16*laneid + 2048*j)
and P61 (s20242–s21030). The prologue's store side and the E60 store side add
tid.z terms that the P1–P10 read side does not, so the mapping cannot be
reconstructed from the PTX alone. Missing: the launch's %tid.z/ctaid
ranges, or a memory dump.
U4. E60's / E61's index algebra. E60(b)'s arena stores, E60(c)'s shared
stores and E61's param+56 stores each form index bases from
(laneid&28) | (y<<5) and ((g+8)<<2)&28 | (y2<<5) plus +512*j, with
y = (tid.z<<1) + (laneid>>5) and y2 = (tid.z<<1) + ((g+8)>>3), while E60(d)'s
read side uses 16*g + t and 16*g + t + 128. I could not prove the
store↔load permutation, nor whether the %r31708 loop (s21041, +128 at s21308)
runs once or twice per tid.z (the guard %r31708 > 159 at s20227/s21046 is
checked before the first body, exactly as in enc3). Missing: a plane-arena dump.
U5. The MLP block's shape. §3 establishes, from the pack sources and each
phase's C operand, that the MLP region is: one normed tile feeding every odd
phase (P21, P23, …, P59) as its A, each odd phase's activation feeding its
paired even phase as A, and the even phases' C chaining
(D22 = … + D20 + table@232464, D24 = … + D22, …, verified from each even
phase's C operands tracing to the previous even phase's mma). Only the first
even phase adds the column table @232464 to the residual
(s13932 add.f16 %rs5416,%rs6524,%rs5418); every later even phase's C is the
previous even phase's D alone. Whether the 20 pairs are one wide MLP, a stack
of residual blocks, or something else is a model-level question the PTX cannot
answer. Missing: the model source.
U6. The stem's shift structure. Phases 1…10 read the same 30 shared A
fragments in five shift groups (P1/P2 at +0/512/…, P3/P4 at +512/…, P5/P6 at
+1024/…, P7/P8 at +1536/…, P9/P10 at +2048/…, s7513–s7542) and accumulate
in two chains (P1→P3→P5→P7→P9 and P2→P4→P6→P8→P10; each phase's C operands name
the previous one's D, e.g. s7616 C={%r5574,%r5575} = P1's D). Whether that is a
2×2 / 5-tap stencil is a property of the high-level model. Missing: the model
source. (enc3 has four shift groups and eight phases, so the tap count is a
per-stage constant.)
U7. The meaning of the prologue residual vector. §1.2 tracks the f16 halves
%rs… back through cvt.rn.f16x2.e4m3x2 %r31707, %rs128 (s5439) to the input
plane at param_0+8 (s22–s23). What that plane holds is not determinable from
the PTX.
U8. The logical meaning of E62's final expression. The tail computes
out = (acc − sigmoid(acc)) * 0.25 on three channels gathered by texture from a
3×3 stencil. The arithmetic is exact in §3/E62(d); what model term it corresponds
to is not derivable. (Same gap as enc0 §6/U6.)
U9. The 82 KiB hole in the weight image. Between P61's B block
(428544..448524) and P61's bias (530944) there are 82420 bytes that no phase
in this entry reads. Whether that region is padding, is unused by this stage, or
belongs to another kernel's parameters cannot be told from this entry.
Missing: the _prep code that builds the image.
6. Quick acceptance index
| requirement | where |
|---|---|
| every phase's M/N/K with the arithmetic checked | §2 (rows flagged N are banded; the real shapes are derived there) |
| weight image extent | §2 (533844 bytes, max offset 533840) |
| phases that read no weight operand | §2 (P11, P12) |
| score epilogue: row max? | none — §3/E11 (16 shfl.sync.bfly, no maximum) |
| score bias operand | §3/E10 (24 v4.u32 at W+10560+512*i, indexed 4*(n>>1)+m) |
| attention Q/K/V | §3/E10 (P11 A and B both from P9's D), §3/E11(d) (P10's D transposed) |
| the norm | §3/E20 (row RMS over 160 columns, +2^-13, rsqrt.approx, gain) |
| the activations | §3/E21, §3/E23 (clamped cubic ramp, 8 groups per phase) |
| patch merge | §3/E60 (arena + shared staging), §3/E61 (param+56), §3/E62 (textures + surfaces) |
| per-launch plane-arena writes | §4 |