diff --git a/npu/pack_import.h b/npu/pack_import.h index 5fc37dc35..8977766f2 100644 --- a/npu/pack_import.h +++ b/npu/pack_import.h @@ -98,8 +98,10 @@ std::string qk_norm_refusal(bool declared, bool found); // How many rows a head read from the .fconst tail occupies in the container. The pack stores the head in whole 64-row // tiles, so a vocabulary that is not a multiple of 64 is carried with the pack's own padding rows (Hunyuan: 120,818 -> -// 120,832) while `vocab_size` and the plan's tensor shape stay the vocabulary. A head that is a graph initializer does -// not go through this (its own padding, to the 32-row tile quantum, is engine#1992's). This is the number a container's lm_head tile count follows from. +// 120,832) while `vocab_size` and the plan's tensor shape stay the vocabulary. A head that is a graph initializer is +// stored as it is: on main nothing pads it, and one whose row count is not a multiple of 32 is refused by the tile +// writer ("q4_1 tiles need N % 32 == 0"). If graph-head padding lands (engine#1992 was closed unmerged), its quantum +// belongs here. This is the number a container's lm_head tile count follows from. int64_t head_stored_rows(int64_t vocab, bool from_fconst_tail); // Why a pack's two layout witnesses cannot be reconciled, or "" when they can (engine#1985).