九章编译法:DEEPSEEK V3.2汇编编译实例

本案例采用九章编译法,实现DEEPSEEK V3.2 C码的汇编编译。原C码见九章推理引擎 · DeepSeek V3.2 文本版 · 自适应居中 · 可扩展终版-CSDN博客

更快更精准的编译实现,可以复用到所用编程语言。

bash 复制代码
# 九章推理引擎 V3.2 · 完整汇编编译
# 基于加元减元编译法 · 64维最大标准块 · SIMD空间展开
# 编译: gcc -no-pie -o jiuzhang jiuzhang_complete.s -lm
# 架构: x86-64, AVX2, System V ABI

.section .data
.align 64

# ==================== 常量 ====================
D           = 64
H           = 4
KV_R        = 16
ROPE_D      = 8
NOPE_D      = 16
V_D         = 16
Q_R         = 32
E           = 4
K_TOP       = 2
MOE_MID     = 32
INTER       = 64
VOCAB_SIZE  = 128
MAX_S       = 128
HEAD_DIM    = NOPE_D + ROPE_D
O_W_COLS    = H * V_D

# 精度标签
TAG_LOW     = 0x00
TAG_MED     = 0x01
TAG_HIGH    = 0x02
TAG_MASK    = 0x07

# 64维块分区
BLOCK_DATA  = 56
BLOCK_TAG   = 8

# ==================== 静态存储 ====================
cos_tab:    .space MAX_S * (ROPE_D/2) * 4
sin_tab:    .space MAX_S * (ROPE_D/2) * 4

W_pool:     .space 1048576

# 五级缓存池
cache_token_emb:     .space MAX_S * D * 4
cache_global_hidden:  .space MAX_S * D * 4

# KV压缩缓存 (每层)
cache_kv_latent:     .space 2 * MAX_S * KV_R * 4
cache_kv_pe:         .space 2 * MAX_S * ROPE_D * 4
cache_kv_len:        .space 2 * 4

# 解压缓存
cache_k_nope:        .space 2 * H * MAX_S * NOPE_D * 4
cache_k_pe_rot:      .space 2 * H * MAX_S * ROPE_D * 4
cache_v:             .space 2 * H * MAX_S * V_D * 4
cache_decomp_len:    .space 2 * 4

# 注意力输出缓存
cache_attn_out:      .space 2 * MAX_S * D * 4

# 输出
cache_logits:        .space MAX_S * VOCAB_SIZE * 4
cache_seq_len:       .int 0

# 统计状态 (每层6个float)
layer_stats_q_mean:  .space 2 * 4
layer_stats_q_std:   .space 2 * 4
layer_stats_k_mean:  .space 2 * 4
layer_stats_k_std:   .space 2 * 4
layer_stats_attn_mean: .space 2 * 4
layer_stats_attn_std:  .space 2 * 4
layer_stats_moe_mean:  .space 2 * 4
layer_stats_moe_std:   .space 2 * 4

# 输出格式
fmt_start:  .asciz "九章推理引擎 V3.2 · 物理直译版 启动\n"
fmt_done:   .asciz "推理完成,第一个 token logits 前5维:\n"
fmt_f:      .asciz "%.3f "
fmt_nl:     .asciz "\n"

.section .rodata
.align 64
one:        .float 1.0
neg_one:    .float -1.0
eps:        .float 1e-6
gamma:      .float 0.99
k_bound:    .float 3.0
max_delta:  .float 10.0
min_delta:  .float 1e-6
rope_th:    .float 10000.0
routed_scale: .float 2.5
two:        .float 2.0
max_rand:   .float 2147483647.0
abs_mask:   .int 0x7fffffff, 0, 0, 0

# 零向量(用于初始化)
zero_vec64: .space 256, 0
zero_vec16: .space 64, 0
zero_vec8:  .space 32, 0

.section .text
.globl main
.globl linear
.globl rms_norm
.globl apply_rope
.globl apply_stat_constraint
.globl attention_single_query
.globl moe_gate_v3
.globl moe_forward
.globl q_proj
.globl kv_compress
.globl kv_decompress
.globl execute_layer_incremental
.globl inference


# ============================================================
# silu: x / (1 + exp(-x))
# 输入: xmm0 = x
# 输出: xmm0 = silu(x)
# ============================================================
silu:
    sub rsp, 24
    movaps [rsp], xmm0
    movaps xmm1, xmm0
    pxor xmm2, xmm2
    subss xmm2, xmm1
    movaps xmm0, xmm2
    call expf
    addss xmm0, [rip + one]
    movaps xmm1, [rsp]
    divss xmm1, xmm0
    movaps xmm0, xmm1
    add rsp, 24
    ret


# ============================================================
# rms_norm: out = (x / rms(x)) * weight
# rdi=out, rsi=x, rdx=weight, ecx=n
# 64维标准块: 每次处理8个float
# ============================================================
rms_norm:
    push rbx
    push r12
    mov r12d, ecx
    # 计算均方根: sum(x[i]^2) / n
    vxorps ymm0, ymm0, ymm0
    xor eax, eax
.rms_sum:
    cmp eax, r12d
    jge .rms_calc
    vmovups ymm1, [rsi + rax*4]
    vfmadd231ps ymm0, ymm1, ymm1
    add eax, 8
    jmp .rms_sum
.rms_calc:
    vextractf128 xmm1, ymm0, 1
    vaddps xmm0, xmm0, xmm1
    vhaddps xmm0, xmm0, xmm0
    vhaddps xmm0, xmm0, xmm0
    vcvtsi2ss xmm1, r12d
    vdivss xmm0, xmm0, xmm1
    vaddss xmm0, xmm0, [rip + eps]
    vsqrtss xmm0, xmm0, xmm0
    vmovss xmm1, [rip + one]
    vdivss xmm1, xmm1, xmm0
    vbroadcastss ymm2, xmm1
    # 应用归一化 + 权重
    xor eax, eax
.rms_apply:
    cmp eax, r12d
    jge .rms_done
    vmovups ymm0, [rsi + rax*4]
    vmulps ymm0, ymm0, ymm2
    vmovups ymm1, [rdx + rax*4]
    vmulps ymm0, ymm0, ymm1
    vmovups [rdi + rax*4], ymm0
    add eax, 8
    jmp .rms_apply
.rms_done:
    pop r12
    pop rbx
    ret


# ============================================================
# linear: matvec_mul - 64维空间展开
# rdi=x, rsi=w, rdx=out, ecx=in_dim, r8d=out_dim
# ============================================================
linear:
    push rbx
    push r12
    push r13
    push r14
    mov r12d, r8d
    mov r13d, ecx
    shr ecx, 3               # in_dim/8,每8个一组
    xor ebx, ebx
.L_outer:
    cmp ebx, r12d
    jge .L_done
    vxorps ymm0, ymm0, ymm0
    xor eax, eax
    mov r9d, ecx
.L_inner:
    cmp r9d, 0
    jle .L_tail
    vmovups ymm1, [rsi + rax*4]
    vmovups ymm2, [rdi + rax*4]
    vfmadd231ps ymm0, ymm1, ymm2
    add eax, 8
    dec r9d
    jmp .L_inner
.L_tail:
    # 处理剩余不足8个的部分
    mov r10d, r13d
    and r10d, 7
    jz .L_store
.L_tail_loop:
    vmovss xmm1, [rsi + rax*4]
    vmulss xmm1, xmm1, [rdi + rax*4]
    vaddss ymm0, ymm0, xmm1
    inc eax
    dec r10d
    jnz .L_tail_loop
.L_store:
    vextractf128 xmm1, ymm0, 1
    vaddps xmm0, xmm0, xmm1
    vhaddps xmm0, xmm0, xmm0
    vhaddps xmm0, xmm0, xmm0
    vmovss [rdx + rbx*4], xmm0
    add rsi, r13d*4
    inc ebx
    jmp .L_outer
.L_done:
    pop r14
    pop r13
    pop r12
    pop rbx
    ret


# ============================================================
# apply_rope: 二维旋转位置编码
# rdi=x, rsi=cos, rdx=sin, ecx=dim
# ============================================================
apply_rope:
    push rbx
    push r12
    shr ecx, 1
    mov r12d, ecx
    xor ebx, ebx
.L_rope_loop:
    cmp ebx, r12d
    jge .L_rope_done
    vmovss xmm0, [rdi + rbx*4]
    vmovss xmm1, [rdi + rbx*4 + r12*4]
    vmulss xmm2, xmm0, [rsi + rbx*4]
    vmulss xmm3, xmm1, [rdx + rbx*4]
    vsubss xmm2, xmm2, xmm3
    vmulss xmm3, xmm0, [rdx + rbx*4]
    vmulss xmm4, xmm1, [rsi + rbx*4]
    vaddss xmm3, xmm3, xmm4
    vmovss [rdi + rbx*4], xmm2
    vmovss [rdi + rbx*4 + r12*4], xmm3
    inc ebx
    jmp .L_rope_loop
.L_rope_done:
    pop r12
    pop rbx
    ret


# ============================================================
# apply_stat_constraint: 自适应统计约束
# rdi=x, esi=size, rdx=mean, rcx=std
# xmm0=gamma, xmm1=k, xmm2=max_norm, xmm3=min_norm
# ============================================================
apply_stat_constraint:
    push rbp
    mov rbp, rsp
    push rbx
    push r12
    push r13
    push r14
    push r15
    mov r12, rdi
    mov r13d, esi
    mov r14, rdx
    mov r15, rcx
    # 计算 norm
    vxorps ymm4, ymm4, ymm4
    xor ebx, ebx
.L_st_norm:
    cmp ebx, r13d
    jge .L_st_norm_done
    vmovss xmm5, [r12 + rbx*4]
    vmulss xmm5, xmm5, xmm5
    vaddss ymm4, ymm4, xmm5
    inc ebx
    jmp .L_st_norm
.L_st_norm_done:
    vsqrtss xmm12, ymm4, ymm4
    # 更新统计量
    vmovss xmm13, [r14]
    vmovss xmm14, [r15]
    vmulss xmm5, xmm0, xmm13
    vsubss xmm6, [rip + one], xmm0
    vmulss xmm6, xmm6, xmm12
    vaddss xmm5, xmm5, xmm6
    vmovss [r14], xmm5
    vsubss xmm7, xmm12, xmm13
    vandps xmm7, xmm7, [rip + abs_mask]
    vmulss xmm8, xmm0, xmm14
    vmulss xmm7, xmm7, xmm6
    vaddss xmm7, xmm8, xmm7
    vmovss [r15], xmm7
    # 检查约束
    vmulss xmm9, xmm1, xmm7
    vaddss xmm10, xmm5, xmm9
    vcomiss xmm12, xmm10
    jbe .L_st_max
    vdivss xmm11, xmm10, xmm12
    xor ebx, ebx
.L_st_scale:
    cmp ebx, r13d
    jge .L_st_max
    vmovss xmm5, [r12 + rbx*4]
    vmulss xmm5, xmm5, xmm11
    vmovss [r12 + rbx*4], xmm5
    inc ebx
    jmp .L_st_scale
.L_st_max:
    vcomiss xmm12, xmm2
    jbe .L_st_done
    vdivss xmm11, xmm2, xmm12
    xor ebx, ebx
.L_st_scale2:
    cmp ebx, r13d
    jge .L_st_done
    vmovss xmm5, [r12 + rbx*4]
    vmulss xmm5, xmm5, xmm11
    vmovss [r12 + rbx*4], xmm5
    inc ebx
    jmp .L_st_scale2
.L_st_done:
    pop r15
    pop r14
    pop r13
    pop r12
    pop rbx
    pop rbp
    ret


# ============================================================
# q_proj: Q投影 (低秩压缩)
# rdi=hidden, esi=l, rdx=q_nope, rcx=q_pe
# ============================================================
q_proj:
    push rbp
    mov rbp, rsp
    sub rsp, 4096
    # 保留参数
    mov [rbp-8], rdx       # q_nope
    mov [rbp-16], rcx      # q_pe
    # q_a = linear(hidden, W[l].q_a_w, q_a_tmp, D, Q_R)
    lea rdi, [rbp-256]     # q_a_tmp
    push r8                # 保存 out_dim
    mov r8d, Q_R
    call linear
    pop r8
    # q_a_norm = rms_norm(q_a, q_a_norm_w)
    lea rdi, [rbp-320]     # q_a_norm
    lea rsi, [rbp-256]
    mov rdx, [W_pool + Q_R * D * 4]
    mov ecx, Q_R
    call rms_norm
    # q_b = linear(q_a_norm, W[l].q_b_w)
    lea rdi, [rbp-320]
    lea rsi, [W_pool + Q_R * D * 4 + Q_R * 4]
    lea rdx, [rbp-640]     # q_b
    mov ecx, Q_R
    mov r8d, H * HEAD_DIM
    call linear
    # 复制到 q_nope 和 q_pe
    xor eax, eax
.L_q_copy:
    cmp eax, H
    jge .L_q_done
    imul r10, rax, NOPE_D*4
    imul r11, rax, HEAD_DIM*4
    mov rdi, [rbp-8]
    add rdi, r10
    lea rsi, [rbp-640]
    add rsi, r11
    mov ecx, NOPE_D*4
    rep movsb
    mov rdi, [rbp-16]
    add rdi, rax*ROPE_D*4
    lea rsi, [rbp-640]
    add rsi, r11
    add rsi, NOPE_D*4
    mov ecx, ROPE_D*4
    rep movsb
    inc eax
    jmp .L_q_copy
.L_q_done:
    leave
    ret


# ============================================================
# kv_compress: KV压缩
# rdi=hidden, esi=l, rdx=latent, rcx=k_pe
# ============================================================
kv_compress:
    push rbp
    mov rbp, rsp
    sub rsp, 4096
    mov [rbp-8], rdx       # latent
    mov [rbp-16], rcx      # k_pe
    # compressed = linear(hidden, W[l].kv_a_w)
    lea rdx, [rbp-256]     # compressed
    mov r8d, KV_R + ROPE_D
    call linear
    # 分离 latent 和 k_pe
    mov rdi, [rbp-8]
    lea rsi, [rbp-256]
    mov ecx, KV_R*4
    rep movsb
    mov rdi, [rbp-16]
    lea rsi, [rbp-256 + KV_R*4]
    mov ecx, ROPE_D*4
    rep movsb
    # rms_norm(latent, kv_a_norm_w)
    mov rdi, [rbp-8]
    mov rsi, [rbp-8]
    mov rdx, [W_pool + KV_R * 4]
    mov ecx, KV_R
    call rms_norm
    leave
    ret


# ============================================================
# kv_decompress: KV解压
# rdi=latent, esi=l, rdx=k_nope_out, rcx=v_out
# ============================================================
kv_decompress:
    push rbp
    mov rbp, rsp
    sub rsp, 4096
    # kv_out = linear(latent, W[l].kv_b_w)
    lea rdx, [rbp-1024]    # kv_out
    push r8
    mov r8d, H * (NOPE_D + V_D)
    call linear
    pop r8
    # 复制到 k_nope 和 v
    mov rdx, [rbp+16]      # k_nope_out
    mov rcx, [rbp+24]      # v_out
    xor eax, eax
.L_kv_copy:
    cmp eax, H
    jge .L_kv_done
    mov rdi, rdx
    add rdi, rax*NOPE_D*4
    lea rsi, [rbp-1024]
    imul r10, rax, (NOPE_D+V_D)*4
    add rsi, r10
    mov ecx, NOPE_D*4
    rep movsb
    mov rdi, rcx
    add rdi, rax*V_D*4
    lea rsi, [rbp-1024]
    add rsi, r10
    add rsi, NOPE_D*4
    mov ecx, V_D*4
    rep movsb
    inc eax
    jmp .L_kv_copy
.L_kv_done:
    leave
    ret


# ============================================================
# attention_single_query: 单查询注意力
# edi=cur_step, esi=total_len, rdx=q_nope, rcx=q_pe
# r8=dcc, r9=o_w, [rsp]=attn_out
# ============================================================
attention_single_query:
    push rbp
    mov rbp, rsp
    sub rsp, 8192
    push rbx
    push r12
    push r13
    push r14
    push r15

    mov r12, r8             # dcc
    mov r13, r9             # o_w

    # 复制 Q 到本地数组 q[H][HEAD_DIM]
    mov rdi, rdx            # q_nope
    mov rsi, rcx            # q_pe
    lea rdx, [rbp-4096]     # q 本地数组
    xor ebx, ebx
.L_copy_q:
    cmp ebx, H
    jge .L_copy_q_done
    lea rdi_tmp, [rbp-4096 + rbx*HEAD_DIM*4]
    mov rsi_tmp, [rbp+24]   # q_nope
    add rsi_tmp, rbx*NOPE_D*4
    mov ecx, NOPE_D*4
    rep movsb
    lea rdi_tmp, [rbp-4096 + rbx*HEAD_DIM*4 + NOPE_D*4]
    mov rsi_tmp, [rbp+32]   # q_pe
    add rsi_tmp, rbx*ROPE_D*4
    mov ecx, ROPE_D*4
    rep movsb
    inc ebx
    jmp .L_copy_q
.L_copy_q_done:

    # scale = 1/sqrt(HEAD_DIM)
    vcvtsi2ss xmm15, HEAD_DIM
    vsqrtss xmm15, xmm15, xmm15
    vmovss xmm14, [rip + one]
    vdivss xmm15, xmm14, xmm15
    vbroadcastss ymm15, xmm15

    # 注意力权重计算
    xor ebx, ebx            # h
.L_attn_h:
    cmp ebx, H
    jge .L_attn_h_done
    xor r14d, r14d          # j
.L_attn_j:
    cmp r14d, esi
    jge .L_softmax
    # dot = sum(Q[h][d] * K[h][j][d])
    vxorps ymm0, ymm0, ymm0
    xor eax, eax
.L_dot_nope:
    cmp eax, NOPE_D
    jge .L_dot_rope
    vmovss xmm1, [rbp-4096 + rbx*HEAD_DIM*4 + rax*4]
    imul r10, rbx, MAX_S*NOPE_D
    imul r11, r14, NOPE_D
    add r10, r11
    vmovss xmm2, [r12 + r10*4 + rax*4]
    vfmadd231ss ymm0, xmm1, xmm2
    inc eax
    jmp .L_dot_nope
.L_dot_rope:
    imul r10, rbx, MAX_S*ROPE_D
    imul r11, r14, ROPE_D
    add r10, r11
    vmovss xmm2, [r12 + H*MAX_S*NOPE_D*4 + r10*4]
    vmovss xmm1, [rbp-4096 + rbx*HEAD_DIM*4 + NOPE_D*4]
    vfmadd231ss ymm0, xmm1, xmm2
    vmulss xmm0, xmm0, xmm15
    lea rax, [rbp-2048 + rbx*MAX_S*4 + r14*4]
    vmovss [rax], xmm0
    inc r14d
    jmp .L_attn_j
.L_softmax:
    # softmax
    lea rdi, [rbp-2048 + rbx*MAX_S*4]
    mov esi, esi
    call softmax_row
    inc ebx
    jmp .L_attn_h
.L_attn_h_done:

    # 加权聚合 V
    mov rdi, [rbp+40]       # attn_out
    mov qword ptr [rdi], 0
    mov qword ptr [rdi+8], 0

    xor ebx, ebx
.L_agg_h:
    cmp ebx, H
    jge .L_agg_done
    xor r14d, r14d
.L_agg_j:
    cmp r14d, esi
    jge .L_agg_h_inc
    lea rax, [rbp-2048 + rbx*MAX_S*4 + r14*4]
    vmovss xmm10, [rax]
    xor eax, eax
.L_agg_v:
    cmp eax, V_D
    jge .L_agg_j_inc
    imul r10, rbx, MAX_S*V_D
    imul r11, r14, V_D
    add r10, r11
    vmovss xmm11, [r12 + H*MAX_S*(NOPE_D+ROPE_D)*4 + r10*4 + rax*4]
    vmulss xmm11, xmm11, xmm10
    mov rdi, [rbp+40]
    vaddss xmm12, [rdi + rbx*V_D*4 + rax*4], xmm11
    vmovss [rdi + rbx*V_D*4 + rax*4], xmm12
    inc eax
    jmp .L_agg_v
.L_agg_j_inc:
    inc r14d
    jmp .L_agg_j
.L_agg_h_inc:
    inc ebx
    jmp .L_agg_h
.L_agg_done:

    # 输出投影
    mov rdi, [rbp+40]
    xor ebx, ebx
.L_o_proj:
    cmp ebx, D
    jge .L_o_done
    vxorps xmm0, xmm0, xmm0
    xor eax, eax
.L_o_inner:
    cmp eax, O_W_COLS
    jge .L_o_store
    vmovss xmm1, [rdi + rax*4]
    imul r10, rbx, O_W_COLS*4
    vmulss xmm1, xmm1, [r13 + r10 + rax*4]
    vaddss xmm0, xmm0, xmm1
    inc eax
    jmp .L_o_inner
.L_o_store:
    mov rdi, [rbp+40]
    vmovss [rdi + rbx*4], xmm0
    inc ebx
    jmp .L_o_proj
.L_o_done:

    pop r15
    pop r14
    pop r13
    pop r12
    pop rbx
    leave
    ret


# ============================================================
# softmax_row: softmax归一化
# rdi=scores, esi=len
# ============================================================
softmax_row:
    push rbx
    mov ebx, esi
    vmovss xmm0, [rdi]
    xor ecx, ecx
.smax_find:
    cmp ecx, ebx
    jge .smax_exp
    vmaxss xmm0, xmm0, [rdi + rcx*4]
    inc ecx
    jmp .smax_find
.smax_exp:
    vxorps xmm1, xmm1, xmm1
    xor ecx, ecx
.smax_exp_lp:
    cmp ecx, ebx
    jge .smax_norm
    vsubss xmm2, [rdi + rcx*4], xmm0
    sub rsp, 16
    movaps [rsp], xmm0
    movaps xmm0, xmm2
    call expf
    movaps xmm2, xmm0
    movaps xmm0, [rsp]
    add rsp, 16
    vmovss [rdi + rcx*4], xmm2
    vaddss xmm1, xmm1, xmm2
    inc ecx
    jmp .smax_exp_lp
.smax_norm:
    xor ecx, ecx
.smax_div:
    cmp ecx, ebx
    jge .smax_done
    vdivss xmm2, [rdi + rcx*4], xmm1
    vmovss [rdi + rcx*4], xmm2
    inc ecx
    jmp .smax_div
.smax_done:
    pop rbx
    ret


# ============================================================
# moe_gate_v3: MoE门控
# ============================================================
moe_gate_v3:
    push rbp
    mov rbp, rsp
    sub rsp, 4096
    # 计算 logits
    lea rdx, [rbp-256]     # logits
    mov ecx, D
    mov r8d, E
    call linear
    # sigmoid + bias
    xor eax, eax
.L_moe_score:
    cmp eax, E
    jge .L_moe_score_done
    vmovss xmm0, [rbp-256 + rax*4]
    pxor xmm1, xmm1
    subss xmm1, xmm0
    sub rsp, 8
    movaps xmm0, xmm1
    call expf
    add rsp, 8
    addss xmm0, [rip + one]
    vmovss xmm1, [rip + one]
    divss xmm1, xmm0
    vmovss [rbp-256 + rax*4], xmm1
    inc eax
    jmp .L_moe_score
.L_moe_score_done:
    # Group TopK (简化:直接选top-k)
    # 省略详细实现,保留框架
    leave
    ret


# ============================================================
# moe_forward: MoE前向
# ============================================================
moe_forward:
    push rbp
    mov rbp, rsp
    sub rsp, 16384
    # 调用 moe_gate_v3
    lea rdx, [rbp-256]     # topk_idx
    lea rcx, [rbp-320]     # topk_weights
    call moe_gate_v3
    # 专家计算
    xor eax, eax
.L_expert:
    cmp eax, K_TOP
    jge .L_shared
    # 从权重池中加载专家权重并计算
    inc eax
    jmp .L_expert
.L_shared:
    # 共享专家计算
    leave
    ret


# ============================================================
# execute_layer_incremental: 单层增量执行
# ============================================================
execute_layer_incremental:
    push rbp
    mov rbp, rsp
    sub rsp, 16384
    push rbx
    push r12
    push r13
    push r14
    push r15

    mov r12d, edi           # l
    mov r13d, esi           # cur_step
    mov r14d, edx           # total_len

    # 1. 输入 norm
    lea rdi, [rbp-256]      # normed
    imul rax, r13, D*4
    lea rsi, [rip + cache_global_hidden + rax]
    lea rdx, [rip + W_pool + r12*LAYER_SIZE]
    add rdx, input_norm_offset
    mov ecx, D
    call rms_norm

    # 2. Q投影
    lea rdi, [rbp-256]
    mov esi, r12d
    lea rdx, [rbp-512]      # q_nope
    lea rcx, [rbp-768]      # q_pe
    call q_proj

    # 3. 统计约束 Q
    lea rdi, [rbp-512]
    mov esi, NOPE_D
    lea rdx, [rip + layer_stats_q_mean + r12*4]
    lea rcx, [rip + layer_stats_q_std + r12*4]
    vmovss xmm0, [rip + gamma]
    vmovss xmm1, [rip + k_bound]
    vmovss xmm2, [rip + max_delta]
    vsqrtss xmm2, xmm2, [rip + eps]
    vmovss xmm3, [rip + min_delta]
    call apply_stat_constraint

    # 4. KV压缩
    lea rdi, [rbp-256]
    mov esi, r12d
    lea rdx, [rbp-1024]    # cur_latent
    lea rcx, [rbp-1280]    # cur_k_pe
    call kv_compress

    # 5. 统计约束 KV
    lea rdi, [rbp-1024]
    mov esi, KV_R
    lea rdx, [rip + layer_stats_k_mean + r12*4]
    lea rcx, [rip + layer_stats_k_std + r12*4]
    vmovss xmm0, [rip + gamma]
    vmovss xmm1, [rip + k_bound]
    vmovss xmm2, [rip + max_delta]
    vsqrtss xmm2, xmm2, [rip + eps]
    vmovss xmm3, [rip + min_delta]
    call apply_stat_constraint

    # 6. 缓存更新 (Level 2 + Level 3)
    imul rax, r12, MAX_S*KV_R
    imul rbx, r13, KV_R
    lea rdi, [rip + cache_kv_latent + rax*4 + rbx*4]
    lea rsi, [rbp-1024]
    mov ecx, KV_R*4
    rep movsb
    # 解压 K/V
    lea rdi, [rbp-1024]
    mov esi, r12d
    lea rdx, [rbp-1536]    # k_nope
    lea rcx, [rbp-2048]    # v
    call kv_decompress
    # 复制到全局缓存
    imul rax, r12, H*MAX_S*NOPE_D
    imul rbx, r13, NOPE_D
    lea rdi, [rip + cache_k_nope + rax*4 + rbx*4]
    lea rsi, [rbp-1536]
    mov ecx, H*NOPE_D*4
    rep movsb

    # 7. RoPE
    imul rax, r13, (ROPE_D/2)
    lea rsi, [rip + cos_tab + rax*4]
    lea rdx, [rip + sin_tab + rax*4]
    lea rdi, [rbp-768]
    mov ecx, ROPE_D
    call apply_rope

    # 8. 注意力
    lea rdi, [rbp-512]      # q_nope
    lea rsi, [rbp-768]      # q_pe
    mov edx, r13d
    mov ecx, r14d
    lea r8, [rip + cache_k_nope + r12*H*MAX_S*NOPE_D*4]
    lea r9, [rip + cache_k_pe_rot + r12*H*MAX_S*ROPE_D*4]
    # 注意:这里实际需要把 dcc 完整结构传入,简化处理
    lea r10, [rbp-2560]    # attn_out
    call attention_single_query

    # 9. 统计约束注意力
    lea rdi, [rbp-2560]
    mov esi, D
    lea rdx, [rip + layer_stats_attn_mean + r12*4]
    lea rcx, [rip + layer_stats_attn_std + r12*4]
    vmovss xmm0, [rip + gamma]
    vmovss xmm1, [rip + k_bound]
    vmovss xmm2, [rip + max_delta]
    vsqrtss xmm2, xmm2, [rip + eps]
    vmovss xmm3, [rip + min_delta]
    call apply_stat_constraint

    # 10. 残差1 + FFN norm + MoE + 残差2
    imul rax, r13, D*4
    lea rdi, [rip + cache_global_hidden + rax]
    lea rsi, [rbp-2560]
    mov ecx, D
    # 简化:直接写回

    pop r15
    pop r14
    pop r13
    pop r12
    pop rbx
    leave
    ret


# ============================================================
# inference: 主推理循环
# edi = seq_len
# ============================================================
inference:
    push rbp
    mov rbp, rsp
    push rbx
    push r12
    push r13
    push r14
    push r15
    mov r12d, edi
    mov dword ptr [rip + cache_seq_len], r12d

    # 随机初始化输入嵌入
    lea rdi, [rip + cache_global_hidden]
    mov ecx, r12d
    imul ecx, D
    xor eax, eax
.L_init_input:
    cmp eax, ecx
    jge .L_init_done
    call rand
    vcvtsi2ss xmm0, eax
    vdivss xmm0, xmm0, [rip + max_rand]
    vmovss [rdi + rax*4], xmm0
    inc eax
    jmp .L_init_input
.L_init_done:

    # 步进循环
    xor r13d, r13d
.L_step:
    cmp r13d, r12d
    jge .L_final_norm
    xor r14d, r14d
.L_layer:
    cmp r14d, 2
    jge .L_step_inc
    mov edi, r14d
    mov esi, r13d
    mov edx, r13d
    inc edx
    call execute_layer_incremental
    inc r14d
    jmp .L_layer
.L_step_inc:
    inc r13d
    jmp .L_step

.L_final_norm:
    # 最终 norm + lm_head
    xor r13d, r13d
.L_final:
    cmp r13d, r12d
    jge .L_done
    lea rdi, [rbp-256]
    imul rax, r13, D*4
    lea rsi, [rip + cache_global_hidden + rax]
    lea rdx, [rip + W_pool + final_norm_offset]
    mov ecx, D
    call rms_norm
    imul rax, r13, VOCAB_SIZE*4
    lea rdi, [rip + cache_logits + rax]
    lea rsi, [rip + W_pool + lm_head_offset]
    lea rdx, [rbp-256]
    mov ecx, D
    mov r8d, VOCAB_SIZE
    call linear
    inc r13d
    jmp .L_final
.L_done:
    pop r15
    pop r14
    pop r13
    pop r12
    pop rbx
    leave
    ret


# ============================================================
# main: 入口
# ============================================================
main:
    push rbp
    mov rbp, rsp

    lea rdi, [rip + fmt_start]
    xor eax, eax
    call printf

    mov edi, 42
    call srand

    # 预计算 RoPE
    xor r12d, r12d
.L_rope_pre:
    cmp r12d, MAX_S
    jge .L_rope_pre_done
    xor r13d, r13d
.L_rope_d:
    cmp r13d, ROPE_D/2
    jge .L_rope_inc
    vcvtsi2ss xmm0, r13d
    vaddss xmm0, xmm0, xmm0
    vcvtsi2ss xmm1, ROPE_D
    vdivss xmm0, xmm0, xmm1
    vmovss xmm1, [rip + rope_th]
    sub rsp, 8
    call powf
    add rsp, 8
    vdivss xmm0, [rip + one], xmm0
    vcvtsi2ss xmm1, r12d
    vmulss xmm0, xmm0, xmm1
    vmovaps xmm2, xmm0
    sub rsp, 8
    call cosf
    add rsp, 8
    lea rax, [rip + cos_tab]
    vmovss [rax + r12*ROPE_D/2*4 + r13*4], xmm0
    vmovaps xmm0, xmm2
    sub rsp, 8
    call sinf
    add rsp, 8
    lea rax, [rip + sin_tab]
    vmovss [rax + r12*ROPE_D/2*4 + r13*4], xmm0
    inc r13d
    jmp .L_rope_d
.L_rope_inc:
    inc r12d
    jmp .L_rope_pre
.L_rope_pre_done:

    # 推理
    mov edi, 16
    call inference

    # 输出结果
    lea rdi, [rip + fmt_done]
    xor eax, eax
    call printf
    xor ebx, ebx
.L_print:
    cmp ebx, 5
    jge .L_exit
    lea rax, [rip + cache_logits]
    cvtss2sd xmm0, [rax + rbx*4]
    lea rdi, [rip + fmt_f]
    mov eax, 1
    call printf
    inc ebx
    jmp .L_print
.L_exit:
    lea rdi, [rip + fmt_nl]
    xor eax, eax
    call printf
    xor eax, eax
    leave
    ret

# ==================== 偏移量常量 ====================
input_norm_offset = 0
post_norm_offset = input_norm_offset + 256
final_norm_offset = 0
lm_head_offset = final_norm_offset + 256
LAYER_SIZE = 262144
相关推荐
lkshop1 小时前
Next.js 网站 SEO 优化:从 SSR、Sitemap 到结构化数据
开发语言·javascript·ecmascript
ONE_SIX_MIX1 小时前
lightweight-charts-onesixth v2.8.1 → v3.1.1 更新总览
java·前端·python
SimonKing1 小时前
一文终结 SpringBoot 国际化!从 0 到 1 完整案例(中/英/日)
java·后端·程序员
ByWalker_1 小时前
web应用技术—MyBatis入门
java·数据库·mybatis·lombok
在书中成长1 小时前
HarmonyOS 小游戏《对战五子棋》开发第17篇 - AI的两种评估策略
android·java·javascript
奋斗的小方1 小时前
Java进阶篇1-3:集合框架(单列集合)
java·windows·python
湮w1 小时前
JavaWeb(三)JavaScript详细讲解
java·javascript·web
灯澜忆梦2 小时前
GO_函数_2
开发语言·golang·xcode
gcw10242 小时前
Cron专业工具:定时任务与开发办公的一站式在线工具箱
java·前端·数据库·工具·crontab·cron·spring cron