Qwen2.5 学习 Wiki
NOTES

模块 003:HLS/PL 算子

HLS 目录保存多个独立 C/C++ kernel。每个 kernel 以 HLS pragma 声明若干 `m_axi` DDR 端口与 `s_axilite` 控制端口;testbench 或未来 PS scheduler 负责准备缓冲区并启动 kernel。

Qwen2.5/modules/003_hls_pl_kernels.md 2026-07-13 约 10 分钟阅读

模块边界

HLS 目录保存多个独立 C/C++ kernel。每个 kernel 以 HLS pragma 声明若干 m_axi DDR 端口与 s_axilite 控制端口;testbench 或未来 PS scheduler 负责准备缓冲区并启动 kernel。

flowchart LR
    Fixture[fixture / DDR buffers] -->|m_axi| K[独立 HLS kernel]
    Ctrl[AXI-Lite control] --> K
    K -->|m_axi| Out[输出 buffers]
    K -->|done/status| Ctrl
流程或关系图。

已有 kernel

目录 / 顶层函数输入控制参数输出算法行为
layer0_q6k_down_projection/layer0_q6k_down_projection4 行以内 Q6_K payload、4864 个 F32 输入行数、行字节数每行一个 F32解码每个 256-lane Q6_K block,计算 ffn_down 选定行 dot。
smollm2_attention_core/smollm2_attention_coremasked scores、Vseq_len,最大 8probs、context、checksum对每个 query 做稳定 softmax,再与 V 相乘。
smollm2_qkv_rope_projection/smollm2_qkv_rope_projectionhidden、norm 权重、Q/K/V quant rowsposition、qtype、row bytes、epsilon、RoPE baseQ/K RoPE、VRMSNorm 后执行 Q5_0(Q/K) 和 Q5_1(V) 投影,旋转 Q/K。
smollm2_mlp_full_layer/smollm2_mlp_full_layerresidual、norm、gate/up Q5_0 rows、down Q5_K rows输出行数、量化类型、stride、epsilonresidual outputRMSNorm -> gate/up dot -> SiLU(gate)*up -> down dot -> residual add
smollm2_lm_head_streaming_topk/smollm2_lm_head_streaming_topk576 F32 hidden、Q8_0 lm_head rowsrow limit、stride、tile、requested Ktop token、row、score16 行一批扫描词表并维护 top-5。
q25rt_i8_matvec_tile/q25rt_i8_matvec_tileint8 weights、int8 activationrows、in_dim、input/output strideint32 dots最多 16 行的 int8 点积 tile。
q25rt_i8_lm_head_paged/q25rt_i8_lm_head_pagedint8 page weights、int8 activation、page token basepage count、weight/output stride每行 dot、top-4、status最多 16 页,每页 16 行的 int8 lm_head 扫描。
smollm2_quant_matvec_common_h0_q25_hls_066/smollm2_quant_matvec_common_h0_rowblockweight/activation 保留参数qtype、block/row 描述status、partial output提供 Q8_0/Q5_0/Q5_1/Q5_K/Q4_K 的共用 ABI、block 尺寸查询和 fixture 输出。

HLS 端口约定

端口类型谁提供数据
m_axi 输入testbench 或 PStensor 行、F32/int8 activation、norm 权重、页索引。
m_axi 输出kernel 写入F32 向量、int32 dot、top-k 数组、状态字。
s_axilite 标量testbench 或 PS行数、维度、stride、位置、qtype、epsilon、top-k 长度。
s_axilite returnkernel启动、完成和空闲控制。

HLS 目录覆盖表

ZCU106/hls/ 中的目录按以下功能族组织。一个功能族内可能有 selected-row、full、CSim、cosim 或不同量化格式的独立实现;它们都以 fixture 和 HLS 参数为输入。

功能族目录模块功能
embedding 与 token bridgetoken_embd_f32_lookuptoken_embd_q8_0_lookuptoken_step_q8_0_top1token_step_rmsnorm_q8_0_top1smollm2_embedding_rmsnorm_full_vector从选定 embedding 行读取/解码 hidden,或接 RMSNorm 与候选行 top1。
QKV 与 RoPElayer0_q5_projectionsmollm2_qkv_rope_projectionsmollm2_qkv_rope_projection_reduced_20260629m1i_exact_q5_q8_vecdot_csimm1i_exact_qkv_selected_rows_csimm1i_exact_qkv_selected_rows_csim_fix解码 Q5 投影行,计算 Q/K/V,或针对选定行验证 RoPE 之前/之后的数值。
attentionsmollm2_attention_coresmollm2_attention_core_headwise_cosim_20260629smollm2_attention_integrated_20260629smollm2_attention_output_projection_residualm1i_attention_output_projection_residual_small_corem1i_ref004b_attn_context_selected_chain_corem1i_ref004b_f16qk_score_corem1i_ref004b_f16qk_score_selected_corem1i_ref004b_f16qk_score_qtile_fullkey_corem1i_ref004b_value_mix_selected_corem1i_ref004b_value_mix_qtile_fullkey_corem1i_ref004b_vpost_value_mix_selected_corem1i_ref004b_vpost_value_mix_qtile_fullkey_core计算 score、softmax、value mix、attention output projection 与 residual 的不同粒度。
MLP 与 down projectionlayer0_q5k_down_projectionlayer0_q6k_down_projectionlayer0_q6k_down_projection_fulllayer2_q4k_down_projectionlayer2_q4k_down_projection_fullsmollm2_mlp_full_layer处理 Q5_K/Q6_K/Q4_K down projection,或完成一层 MLP 的 norm、gate、up、SiLU、down、residual。
通用量化 matvecsmollm2_quant_matvec_common_h0_q25_hls_066定义并扩展 Q8_0/Q5_0/Q5_1/Q5_K/Q4_K row-block 入口和 fixture。
int8 runtime tileq25rt_i8_matvec_tileq25rt_i8_matvec_batch_tile计算 int8 activation 与 int8 权重的单 tile 或 batch tile。
lm_head 与 top-klm_head_int4_top1smollm2_lm_head_streaming_topksmollm2_lm_head_tiled_topksmollm2_lm_head_axi_vip_probe_20260629q25rt_i8_lm_head_pagedq25_hls_065_20260630对量化词表行打分,计算 top1/top-k,或验证 paged lm_head 的内存访问。
cache 与 W8A8smollm2_kv_cache_handoff_20260629m1i_w8a8_rmsnorm_csimm1i_w8a8_rmsnorm_opt_candidate交接 KV cache buffer,或计算/试验 W8A8 RMSNorm。
AXI memory harnesshls_cosim_m_axi_reproducer复现和测试多端口/stride/ap_memory 的 AXI 访问配置。

算子之间的关系

这些 kernel 反映 transformer token step 的计算片段,但当前各自独立:

flowchart LR
    E[embedding / RMSNorm] --> Q[QKV + RoPE]
    Q --> A[attention core]
    A --> O[output projection / residual]
    O --> M[MLP full layer]
    M --> N[final norm]
    N --> L[lm_head / top-k]
    R[row-block matvec] -.可供 QKV、MLP、lm_head 复用.-> Q
    R -.-> M
    R -.-> L
流程或关系图。

上述箭头表示模型计算顺序或可复用关系;当前仓库没有一个 PS 程序把这些 kernel 在一次 UART 请求内全部串起来。