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

182 lines
7.1 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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` 保持不变即可。