Files
stgsharp/StgSharp.Native/SIMDID.x86.md
T
2026-01-04 18:13:50 +08:00

7.1 KiB
Raw Blame History

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 保持不变即可。