# SIMDID(x86-64)64-bit 规范(按你给定的固定布局补全) 本文按你指定的 **64-bit SIMDID** 位布局进行补全,重点给出 **AVX512 Feature 区段([31..16])** 的设计,使其既能覆盖 AVX-512 混乱的子集,又能保持分支逻辑尽量精简。 > 约定:bit0 为最低位(LSB)。本文只定义 x86-64 解释器下的语义;Header 的 Root ISA 允许扩展到其他架构。 --- ## 1) ASCII 位布局(最终) ``` SIMDID (64 bits) [63 ........................................................ 0] +--------------------------+-----------+----------------+----------------+----------------+----------------+ | [63..40] uArch/Policy | [39..32] | [31..16] | [15..8] | [7..4] | [3..0] | | (24 bits, optional) | AMX Future| AVX512 Feature | MainLevel | Manufacture | Root ISA | +--------------------------+-----------+----------------+----------------+----------------+----------------+ ``` - **[3..0] Root ISA**:根指令集类型(用于选择解释器) - **[7..4] Manufacture**:制造商信息(对 x86 来说 Intel/AMD 等) - **[15..8] MainLevel**:主 ISA 等级(递增、共享比特语义) - **[31..16] AVX512 Feature**:AVX-512 特征/子集/实现形态(重点) - **[39..32] AMX Future**:AMX 特征(目前可只放少量位) - **[63..40] uArch/Policy**:可选策略/微架构提示(默认 0,不影响功能) --- ## 2) Root ISA([3..0]) 建议编码(你列出的架构较多,这里给一个可用的最小集合;不够可继续扩): | 值 | Root ISA | |---:|----------| | 0 | Unknown | | 1 | x86-64 | | 2 | AArch64 | | 3 | PPC64LE | | 4 | Apple Silicon(如果你想把它当“制造商+ARM”以外的 note,也可放在 Manufacture;但你要求 Root ISA 里有它,那就给它一个值) | | 5 | RISC-V | | 6 | LoongArch | | 7..15 | Reserved | > 注:从体系结构角度 Apple Silicon 属于 AArch64;但你既然希望在 Root ISA 层面区分,那就这样定义即可(解释器由你决定)。 --- ## 3) Manufacture([7..4]) 在 **x86-64** 下建议: | 值 | Manufacture | |---:|-------------| | 0 | Unknown/Other | | 1 | Intel | | 2 | AMD | | 3 | VIA/Zhaoxin | | 4..15 | Reserved | 在其它 Root ISA 下,该 nibble 由各自解释器自行定义(例如 ARM 下可放 Apple/Qualcomm/MediaTek 等)。 --- ## 4) MainLevel([15..8],递增) 你要求“共用比特且递增”,也就是说数值越大能力越强(或至少在你的库调度中越靠后)。建议定为: | 值 | MainLevel | |---:|-----------| | 0 | NONE | | 1 | SSE(完整 SSE 家族:SSE1..SSE4.2) | | 2 | AVX2 | | 3 | AVX2_FMA | | 4 | AVX2_FMA_F16C(从该级开始可处理 16-bit 类型) | | 5 | AVX512(需要查询 [31..16]) | | 6 | AMX | | 7 | AVX10 | | 8..255 | Reserved | > 建议调度:`MainLevel` 是主 switch;只有当 `MainLevel>=AVX512` 才解析 `AVX512 Feature`;当 `MainLevel>=AMX` 才解析 `AMX Future`。 --- ## 5) AVX512 Feature([31..16])设计目标(精简版) 目标改为: 1) **基础 AVX512 一次性判定**:用 1 bit 表示“F+CD+VL+DQ+BW”这一捆绑基础包,避免多次子集判断。 2) **胶水 vs 原生**:用实现字段直接区分 `AVX512-DUAL`(胶水/降频风险)与 `AVX512-NATIVE`(完整 512 位 ALU)。 3) **小众/AI 扩展单独留位**:VNNI、BF16/FP16 等稀疏出现的扩展单独占位,基础路径不受干扰。 --- ## 6) AVX512 Feature 位布局([31..16] = 16 bits,精简) AVX512 Feature (bits 31..16) | **bit** | 31 | 30 | 29 | 28 | 27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 | 19 | 18 | 17 | 16 | |-----------|-----|-----|------|------|------|-------|------|------|-------|-------|----|------|----|----|----|----| | **Usage** | R | R | FP16 | BF16 | VNNI | VBMI2 | VBMI | R/AI | Impl1 | Impl0 | R | BASE | R | R | R | R | 说明: - **BASE(bit 20)**:基础 AVX512 一揽子,表示同时具备 `F + CD + VL + DQ + BW`。这是 AVX512 最低可用门槛,探测端若设为 1,应保证上述子集都成立。 - **AVX512_IMPL([23..22],2-bit)**:实现形态(宽度策略)。 | 值 | 含义 | |---:|------| | 0 | Unknown(需结合 Manufacture/uArch 决定策略) | | 1 | AVX512-DUAL(胶水/降频风险,建议默认 256 宽路径) | | 2 | AVX512-NATIVE(完整 512 位 ALU,可走 512 宽路径) | | 3 | Reserved | - **VBMI/VBMI2/VNNI/BF16/FP16([29..26])**:稀疏但常用的小类型/AI 扩展,按需设置。 - **R/AI(bit 24)**:预留给未来 AI 或其他非密码学的自选扩展。 - **[31..30]、[21]、[19..16]**:Reserved,按需再分配。 --- ## 7) “AVX512BASE” 判定(一次性检查) - **规则**:`BASE=1` 即视为具备 `F+CD+VL+DQ+BW`,无需逐项再查。探测端必须保持一致性,若无法保证全部子集齐备则应置 0。 - **运行时分支**: - 若 `MainLevel < AVX512`:直接降级到 AVX2/FMA 路径。 - 否则: - 检查 `BASE`;若为 0 则降级到 AVX2/FMA(或视为探测错误)。 - 查看 `AVX512_IMPL`:`DUAL` 走 256 宽/降频安全路径,`NATIVE` 走 512 宽路径。 - 需要小类型/AI 能力时,按位查看 `VNNI/BF16/FP16/VBMI/VBMI2`。 --- ## 8) AMX Future([39..32],8 bits) 你已经留了 1 个字节,建议先只定义 3 个最常见位,其余保留: | bit(相对 [39..32]) | 名称 | 说明 | |---:|------|------| | 0 | AMX_TILE | tile 基础 | | 1 | AMX_INT8 | INT8 tile | | 2 | AMX_BF16 | BF16 tile | | 3..7 | Reserved | | 当 `MainLevel < AMX` 时,这个字节可全为 0。 --- ## 9) uArch/Policy([63..40],24 bits) 用途:**你不想浪费比特,但又需要解决“Intel 早期/AMD 胶水”这类非 CPUID 纯子集能解决的问题**。 把它留作可选策略字段,默认 0;你需要时再启用。 建议最小化用法: - `0`:未使用 - `1`:ForceDual(即使 impl unknown 也当 AVX512-DUAL) - `2`:ForceNative(即使 impl unknown 也当 AVX512-NATIVE) - `3..`:你自己维护的 uArch 枚举(例如 SKX/ICL/SPR/ZEN4/ZEN5…) > 由于你是单人维护,最现实的策略是: > - AMD:探测端直接把 `AVX512_IMPL=DUAL`(无需 uArch) > - Intel:仅对你关心的少数型号做 uArch 枚举,否则 unknown 走默认策略 --- ## 10) 建议的最简探测端填充规则(x86-64) 1) 先填 `RootISA=x86-64`、`Manufacture=Intel/AMD` 2) 计算 `MainLevel`(按你递增规则) 3) 若 `MainLevel >= AVX512`: - 若探测到 `F+CD+VL+DQ+BW` 全部成立,则置 `BASE=1`,否则 `BASE=0` - 填 `AVX512_IMPL`: - AMD:DUAL(按你的定义) - Intel:可按 family/model 或 policy 表决定 DUAL/NATIVE;不确定就 Unknown - 需要 VNNI/BF16/FP16/VBMI/VBMI2 时,按位填写对应扩展 4) 若 `MainLevel >= AMX`:填 AMX byte --- ## 11) 你需要做的一个选择(高位保留位如何分配) 目前 `[31..24]` 留作扩展/AI:示例定义为 FP16/BF16/VNNI/VBMI2/VBMI + 1 个预留位。 如果你更需要 IFMA 或其他非密码学扩展,请替换 bit26~29 的定义;`BASE` 与 `Impl` 保持不变即可。