BCS Scalar0/Scalar1 ISA
此页面上的每个操作类名称、原序数、管道绑定和 LLO 操作码字节都是从
libtpu-0.0.40-cp314轮中的libtpu.so(构建 ID89edbbe81c5b328a958fe628a9f2207d)中读取的 - 来自asic_sw::deepsea::pxc::pfc::isa::BarnaCoreSequencerScalar{0,1}_<Op>vtable/typeinfo 集(原型)TcParseTableBaseoneof-aux 数组、FindFreeScalarSlot<Scalar0_X,Scalar1_X>模板实例化和LloInstruction::CreateBarnaCore*构造函数操作码常量。其他版本有所不同。
摘要
BarnaCore 是 Google 的传统嵌入加速器(v2-v4:Jellyfish、Dragonfish、Pufferfish),是 SparseCore 所取代的前身。 Pufferfish 一代的计算核心是 BCS(BarnaCore Sequencer):一个 2 宽双标量 VLIW,其捆绑包 (BarnaCoreSequencerBundle) 恰好携带两个标量槽:scalar_0 和 scalar_1。这两个插槽“不可”互换——它们实现了共享标量 ISA 的“非对称运算分割”,共享标量 ISA 是 SCS 标量操作码枚举 中记录的 SparseCore SCS 双标量 ALU 通道的直接结构祖先。本页逐个枚举原始操作码(线路操作码)顺序的 ISA 操作,然后跟踪 BCS 标量 ALU 加上一个小型 DMA/同步原语集如何吸收整个高级嵌入操作表面:通过 LloRegionBuilder::Bc<Op> 构建器和 barna_core::BcsLloEmitter 将 20 个 LogFatal 价格的收集/分散/减少操作降低为 13 个价格BCS 原语。
最熟悉的模拟是 CISC ISA,不是从手册而是从 protobuf 模式恢复:每个标量操作都是 BarnaCoreSequencerScalar0/Scalar1 的 oneof 子消息,因此操作码是原始字段编号,操作码 ordering 是 oneof 声明顺序。没有操作码名称字符串表;通过重新定位每个子消息的 _table_ 辅助指针并通过 c++filt 将其反向映射到类名来重建名册。管道分割的重建独立于 FindFreeScalarSlot<Scalar0_X, Scalar1_Y> 模板实例化集(void 第二个参数标记仅管道操作)。嵌入降低是根据反汇编的 BcsLloEmitter 主体和每个 LloInstruction::CreateBarnaCore<Op> 构造函数之前的 mov edi,0x1XX 操作码常量重建的。
重新实现,合约为:
- 操作计数。 RTTI 类型信息计数为 61 Scalar0 / 59 Scalar1 = 120 typeinfo。从每个管道中减去抽象基础、
ResourceUsageEntry_DoNotUse原型映射条目和编解码器模板类型信息,剩下 58 Scalar0 + 56 Scalar1 = 114 个具体 ISA 操作。下面完整列举了这 114 个。 - 共享头+共享ALU尾在两个管道中是相同的;管道仅在中间频段发散。 序数 0..12(Noop、Halt、HostInterrupt、Trace、6
Sync*在序数 4..9、SyncAdd、PopHmf、Delay 处等待)和 ALU/比较尾部(Convert、IntAdd/Sub、按位、FloatMax/Min、shifts、Move、Clz、6 个 int 比较, AddCarryOut、PredicateOr、6 个浮点比较、IsInfOrNan) 都存在。分割位于控制/DMA/SMEM 频段。 - 非对称分割。 Scalar0 = 控制 + DMA + 乘法 管道(3 Branch + 3 Call + 3 Dma + FloatMul/UintMul); Scalar1 = 加载存储+同步完成+添加/子管道(LoadSmem/LoadSmemOffset/StoreSmemAbsolute + ReadDone/WriteDone/ReadPublicAccess/WritePublicAccess + FloatAdd/FloatSub)。 两个管道中都存在 47 个操作(由 RTTI 可双重发出),其中 38 个通过
FindFreeScalarSlot<S0_X, S1_X>的路由和另外 9 个(5 个非等浮点比较,加上 Noop/Trace/HostInterrupt/SetTracemarkRegister)是双重的,因为在没有FindFreeScalarSlot对的每个管道中拥有一个 vtable。 - 20→13 嵌入降低。 20 个高级
kBarnaCore*LLO 操作从未直接定价(它们在延迟分类器中为 LogFatal);每个都有一个Bc<Op>构建器 →CreateBarnaCore<Op>(LLO 操作码0x1bb..0x1c7)→BcsLloEmitter扩展为 13 个定价原语 = 共享 BCS ALU 上的标量地址数学 + BarnaCore DMA (BcDma/DmaGeneral) + 同步(BcSwait*/BcSsyncAdd/BcSdoneWrite)。
| 发动机 | BarnaCore 测序仪 (BCS),河豚基因 (pxc::pfc) |
| 捆绑 | BarnaCoreSequencerBundle — 2 个标量插槽:scalar_0、scalar_1 (_table_ @ 0x21e868d8) |
| 操作码模型 | 原型 oneof 字段号; order = oneof 声明 order = 线标签 order |
| Op 类命名空间 | asic_sw::deepsea::pxc::pfc::isa::BarnaCoreSequencerScalar{0,1}_<Op> |
| 具体操作数 | 58 标量 0 + 56 标量 1 = 114 (RTTI 类型信息计数 61+59=120) |
| 管道绑定源 | FindFreeScalarSlot<Scalar0_X, Scalar1_Y> 实例化(void 第二个参数 = 仅管道) |
| 双发行/仅限 S0/仅限 S1 | 两个管道中都有 47 个(38 个通过 FindFreeScalarSlot,仅 9 个 RTTI) · 11 个仅 S0(通过 <S0,void> 的 FloatMul + UintMul,+ 9 个结构控制/DMA) · 9 个 S1 仅(6 个通过 <void,S1>,+ 3 个结构 SMEM) |
| 嵌入基元 | 13 价格(标量 ALU + BcDma/DmaGeneral + BcSwait*/BcSsyncAdd/BcSdoneWrite) |
| 高级嵌入操作 | 20 kBarnaCore* LLO 操作(操作码 0x1bb..0x1c7),所有 LogFatal 价格 → 低于 13 |
| 信心 | 已确认(反编译锚定),除非行或标注另有说明 |
注意 — 此页面是 BCS 标量 ISA + 嵌入操作降低。 6 槽 BarnaCore Channel VLIW (VectorExtendedResult / VectorLoad / VectorStore / VectorAlu0 / VectorAlu1 / ChannelScalar)、54 共享操作向量 ALU 和 EUP 先验块是通道数据路径,这里仅在标量管道和嵌入降低接触它的地方进行总结。 32 字节捆绑字节编码位于BCS 32 字节捆绑包; 退休 中的每代退休理由; 合并 ALU 中的合并 ALU 谱系。
操作码原型模型
为什么操作码是原始字段号
BCS 标量 ISA 不携带操作码名称数组。每个操作都是 asic_sw::deepsea::pxc::pfc::isa 命名空间中子消息类型 BarnaCoreSequencerScalar0_<Op>(或 Scalar1_<Op>)的一个独特的操作,并且捆绑包原型 BarnaCoreSequencerScalar0 保存单个操作,其成员是这些操作子消息。 连线操作码标记是其中一个字段编号,并且字段编号按声明顺序分配,因此操作子消息出现在 TcParseTableBase 辅助数组中的顺序是*操作码顺序。
名册是可恢复的,因为原型运行时为每个操作发出一整套方法(Clear、ByteSizeLong、_InternalSerialize、MergeImpl、ctor/dtor)和每个操作 _table_ 解析表。重新定位父 oneof 的辅助指针数组(条目为 R_X86_64_RELATIVE;文件保存零,来自 readelf -r 的加数)生成每个成员的子 _table_ 符号,c++filt 将其映射回操作类名称。这是 SCS侧 上的 SCS Matches() 谓词扫描的原始模拟:操作码是 cmp 立即数;这里它是一个字段编号。
// BarnaCoreSequencerBundle::_table_ @ 0x21e868d8 — exactly 2 submessage aux slots
field[0] = scalar_0 -> BarnaCoreSequencerScalar0::_table_ @ 0x21e8b7f0 (max_field_number=62)
field[1] = scalar_1 -> BarnaCoreSequencerScalar1::_table_ @ 0x21e90b98 (max_field_number=60)
// each Scalar{0,1} _table_ holds a oneof aux array of submessage _table_ pointers,
// reloc-resolved (R_X86_64_RELATIVE) -> the op-class _table_ symbols -> c++filt.
```text
反编译目录确认命名空间和花名册:1,259 个文件匹配 `BarnaCoreSequencerScalar0`,1,191 个文件匹配 `Scalar1`(per-op 原型方法爆炸),修剪后的 op-class 集与 op-for-op 下面的枚举匹配,包括 proto-map 噪声类型`ResourceUsageEntry_DoNotUse`。
### 为什么操作码是*字段编号*,而不是编码的位字段
原始字段号是*逻辑*操作码(编解码器的选择器)。 32 字节包内的“物理”位分配是 `InstBits_BarnaCorePxcHwMode`(`@0x33931f0`,181,344 B)和 `EncoderPfBarnaCoreSequencer::EncodeBundleInternal` 拥有的单独关注点;该字节编码记录在 [BCS 32 字节捆绑包](bcs-32byte-bundle.md) 中,并且**不是** oneof 序数。重新实现者必须保持两者不同:oneof 序数选择哪个操作; HwMode 位表放置其操作数。该页面固定逻辑名册;捆绑页面固定编码。
---
## 不对称管道分割
这两个插槽实现具有三个成员资格类别的一个 ISA,由 `FindFreeScalarSlot<Scalar0_X, Scalar1_Y>` 模板实例化集 (`@0x140efa80..`) 固定。当两个模板参数都是具体操作类时,操作是**双发出** - 发射器选择该周期空闲的通道。当第二个arg是`void`(损坏的`EvE`)时,操作是**Scalar0-pipe-only**; `<void, Scalar1_X>` 标记**仅标量1-管道**。第二类仅管道操作的结构类根本不会通过 `FindFreeScalarSlot` 进行路由 - 它们只是在一个管道中拥有一个 vtable,而不是在另一个管道中(Scalar0 上的控制/DMA 操作,Scalar1 上的 SMEM 操作)。
| 会员资格 | 计数 | 操作 |
|---|---:|---|
| **双发行,`FindFreeScalarSlot<S0_X, S1_X>` 一对** | 38 | int ALU(IntAdd/Sub/IntAddCarryOut,6位int比较,And/Or/Xor),`ScalarFloatEqual`,FloatMax/Min,移位,Convert,Move,6位`Sync*`等(SyncDone/EqualTo/NotEqualTo/GreaterThan/GreaterOrEqualTo/LessThan)、SyncAdd、Fence、IssueFsm、PopHmf、延迟、SetTagRegister、ReadRegisters、PredicateOr、Clz、IsInfOrNan、Halt |
| **双发行,仅 RTTI(无 `FindFreeScalarSlot` 对)** | 9 | `Noop`、`Trace`、`HostInterrupt`、`ScalarSetTracemarkRegister`、及5个非等浮点比较 `ScalarFloat{Greater,GreaterEqual,Less,LessEqual,NotEqual}` |
| **仅限标量0** `<S0_X, void>` | 2 | `ScalarFloatMul`,`ScalarUintMul` |
| **仅标量0结构** | 9 | `ScalarBranch{Absolute,Relative,Reg}`、`ScalarCall{Absolute,Relative,Reg}`、`ScalarDma{Simple,SingleStrided}`、`ScalarGeneralDma` |
| **仅标量1** `<void, S1_X>` | 6 | `ReadDone`、`WriteDone`、`ReadPublicAccess`、`WritePublicAccess`、`ScalarFloatAdd`、`ScalarFloatSub` |
| **仅标量1结构** | 3 | `ScalarLoadSmem`、`ScalarLoadSmemOffset`、`ScalarStoreSmemAbsolute` |
这五行总计为整个联合中的 67 个不同的操作类 (38 + 9 + 2 + 9 + 6 + 3); 47 个双发出操作 (38 + 9) 出现在两个管道的 RTTI 中,给出 Scalar0 = 47 + 2 + 9 = 58 和 Scalar1 = 47 + 6 + 3 = 56。
解释是嵌入定序器的故意端口压力分割:pipe0 上的 **multiply** 与 pipeline1 上的 **add/sub**(浮点端口分割)、pipe1 上的 **SMEM 加载/存储**数据路径,以便加载可以与 pipeline0 上的控制/DMA 共同发出,以及四个 **sync-completion-register 访问器** (`Read/Write` × Pipe1 上的 `Done/PublicAccess`) — 同步完成的簿记工作位于加载-存储管道上,而 pipeline0 则驱动控制流和 DMA。
> **明白了 - `ScalarHalt` 位于两个管道中。** 反编译显示 `BarnaCoreSequencerScalar0_ScalarHalt` 和 `BarnaCoreSequencerScalar1_ScalarHalt` 操作类符号,以及双发行 `FindFreeScalarSlot<Scalar0_ScalarHalt, Scalar1_ScalarHalt>` 实例化 (`@0x140e79e0`)。当 Pipe1 空闲时,强制停止 Pipe0 的调度程序将无法将其与 Pipe0 控制操作双重发出。 `ScalarFence` 和 `IssueFsm` 同样通过 `FindFreeScalarSlot` 对实现对偶; `Noop`、`Trace`、`HostInterrupt` 和 `ScalarSetTracemarkRegister` 是双重的,因为它们在每个管道中拥有一个 vtable,即使没有为它们发出 `FindFreeScalarSlot` 对。
>
> **QUIRK — `void` 第二个模板参数是仅管道标记,而不是编码工件。** `FindFreeScalarSlot<...ScalarFloatMulEvEE>`(尾部 `EvE` = `<…, void>`)证明了 `ScalarFloatMul` 无法采用管道 1;没有 `BarnaCoreSequencerScalar1_ScalarFloatMul` op 级符号。重新实现者从模板参数列表中读取管道绑定,而不是从捆绑位中读取。
---
## 表 E0 — Proto-Oneof(操作码)顺序的 58 个 Scalar0 操作
`BarnaCoreSequencerScalar0::_table_` @ `0x21e8b7f0`; `max_field_number=62`; 58 其中一个子消息辅助指针从 `@0x21e8bb68..` 重新定位解析。 `ord` = oneof 声明索引 = 连线操作码标记。 `[S0]` = 仅 Scalar0-管道。
| 订单 | 操作类 | 角色 |
|---:|---|---|
| 0 | `Noop` | 无操作槽填充器 |
| 1 | `ScalarHalt` | 停止定序器(也是 Scalar1) |
| 2 | `HostInterrupt` | 引发主机中断 |
| 3 | `Trace` | 跟踪标记发射 |
| 4 | `SyncDone` | 等待同步标志 DONE (= `kBarnaCoreScalarWaitDone` `0x1ac`) |
| 5 | `SyncEqualTo` | 等待同步 == 操作数 (= `kBarnaCoreScalarWaitEq` `0x1b2`) |
| 6 | `SyncNotEqualTo` | 等待同步!= 操作数(= `kBarnaCoreScalarWaitNe` `0x1b3`) |
| 7 | `SyncGreaterThan` | 等待同步 > 操作数(= `kBarnaCoreScalarWaitGt` `0x1b1`) |
| 8 | `SyncGreaterOrEqualTo` | 等待同步 >= 操作数 (= `kBarnaCoreScalarWaitGe` `0x1b0`) |
| 9 | `SyncLessThan` | 等待同步 < 操作数 (= `kBarnaCoreScalarWaitLt` `0x1af`) |
| 10 | `SyncAdd` | 原子添加到同步标志(= `kBarnaCoreScalarSyncAdd` `0x1ad`) |
| 11 | `ScalarPopHmf` | 弹出主机消息 FIFO (= `kBarnaCoreScalarPop` `0x1b8`) |
| 12 | `ScalarDelay` | 固定周期延迟 |
| 13 | `ScalarSetTagRegister` | 设置指令标记寄存器 |
| 14 | `ScalarSetTracemarkRegister` | 设置跟踪标记寄存器 |
| 15 | `ScalarBranchAbsolute` `[S0]` | 分支到绝对目标 |
| 16 | `ScalarBranchRelative` `[S0]` | 按相对偏移量分支 |
| 17 | `ScalarBranchReg` `[S0]` | 分支到寄存器目标 |
| 18 | `ScalarCallAbsolute` `[S0]` | 调用绝对目标 |
| 19 | `ScalarCallRelative` `[S0]` | 调用相对偏移量 |
| 20 | `ScalarCallReg` `[S0]` | 调用寄存器目标 |
| 21 | `ScalarFence` | 标量内存栅栏 |
| 22 | `IssueFsm` | 问题地址处理程序 FSM 程序 |
| 23 | `ScalarDmaSimple` `[S0]` | 简单DMA问题 |
| 24 | `ScalarDmaSingleStrided` `[S0]` | 单步DMA |
| 25 | `ScalarGeneralDma` `[S0]` | 通用(描述符)DMA |
| 26 | `ScalarReadRegisters` | 读取寄存器文件 |
| 27 | `ScalarConvertIntToFloat` | int→float 转换 |
| 28 | `ScalarConvertFloatToInt` | float→int 转换 |
| 29 | `ScalarIntAdd` | 整数相加 |
| 30 | `ScalarIntSub` | 整数子 |
| 31 | `ScalarAnd` | 按位与 |
| 32 | `ScalarOr` | 按位或 |
| 33 | `ScalarXor` | 按位异或 |
| 34 | `ScalarFloatMul` `[S0]` | 浮点乘法 |
| 35 | `ScalarUintMul` `[S0]` | uint 乘法 |
| 36 | `ScalarFloatMax` | 浮动最大值 |
| 37 | `ScalarFloatMin` | 浮动最小值 |
| 38 | `ScalarLogicalShiftLeft` | 逻辑 shl |
| 39 | `ScalarLogicalShiftRight` | 逻辑shr |
| 40 | `ScalarArithmeticShiftRight` | 算术shr |
| 41 | `ScalarMove` | 寄存器移动 |
| 42 | `ScalarCountLeadingZeros` | clz |
| 43 | `ScalarIntEqual` | int == |
| 44 | `ScalarIntNotEqual` | int != |
| 45 | `ScalarIntGreater` | int > |
| 46 | `ScalarIntGreaterEqual` | int >= |
| 47 | `ScalarIntLess` | int < |
| 48 | `ScalarIntLessEqual` | int <= |
| 49 | `ScalarIntAddCarryOut` | int 添加并带出 |
| 50 | `ScalarPredicateOr` | 谓词或 |
| 51 | `ScalarFloatEqual` | 浮动 == |
| 52 | `ScalarFloatNotEqual` | 浮动 != |
| 53 | `ScalarFloatGreater` | 浮动 > |
| 54 | `ScalarFloatGreaterEqual` | 浮动 >= |
| 55 | `ScalarFloatLess` | 浮动 < |
| 56 | `ScalarFloatLessEqual` | 浮点数 <= |
| 57 | `ScalarIsInfOrNan` | 分类 inf/nan |
58 个具体操作。加上抽象基础 `BarnaCoreSequencerScalar0` (`_ZTV` @ `0x21e87840`) + `ResourceUsageEntry_DoNotUse` (原始映射条目) + `BarnaCoreSequencerScalar0Decoder`/`Encoder` 编解码器模板类型信息 = 61 Scalar0 类型信息。
---
## 表 E1 — Proto-Oneof(操作码)顺序的 56 个标量 1 操作
`BarnaCoreSequencerScalar1::_table_` @ `0x21e90b98`; `max_field_number=60`; 56 oneof aux 指针从 `@0x21e90ef8..` 重新定位解析。 `[S1]` = 仅标量 1 管道。
| 订单 | 操作类 | 角色 |
|---:|---|---|
| 0 | `Noop` | 无操作槽填充器 |
| 1 | `ScalarHalt` | 停止定序器(也是 Scalar0) |
| 2 | `HostInterrupt` | 引发主机中断 |
| 3 | `Trace` | 跟踪标记发射 |
| 4 | `SyncDone` | 等待同步标志完成 |
| 5 | `SyncEqualTo` | 等待同步==操作数 |
| 6 | `SyncNotEqualTo` | 等待同步!=操作数 |
| 7 | `SyncGreaterThan` | 等待同步 > 操作数 |
| 8 | `SyncGreaterOrEqualTo` | 等待同步 >= 操作数 |
| 9 | `SyncLessThan` | 等待同步 < 操作数 |
| 10 | `SyncAdd` | 原子添加到同步标志 |
| 11 | `ScalarPopHmf` | 弹出主机消息 FIFO |
| 12 | `ScalarDelay` | 固定周期延迟 |
| 13 | `ScalarLoadSmem` `[S1]` | 从 SMEM 加载 |
| 14 | `ScalarLoadSmemOffset` `[S1]` | 加载带有偏移量的 SMEM |
| 15 | `ScalarStoreSmemAbsolute` `[S1]` | 商店 SMEM 绝对 |
| 16 | `ScalarSetTagRegister` | 设置指令标记寄存器 |
| 17 | `ScalarSetTracemarkRegister` | 设置跟踪标记寄存器 |
| 18 | `ScalarFence` | 标量内存栅栏 |
| 19 | `ScalarReadRegisters` | 读取寄存器文件 |
| 20 | `IssueFsm` | 问题地址处理程序 FSM 程序 |
| 21 | `ReadDone` `[S1]` | 读取同步-DONE 完成寄存器(= `kBarnaCoreScalarSyncDoneRead` `0x1b4`) |
| 22 | `WriteDone` `[S1]` | 写入sync-DONE完成寄存器(= `kBarnaCoreScalarSyncDoneWrite` `0x1b5`) |
| 23 | `ReadPublicAccess` `[S1]` | 读取公共访问同步寄存器(= `…PublicAccessRead` `0x1b6`) |
| 24 | `WritePublicAccess` `[S1]` | 写入公共访问同步寄存器(= `…PublicAccessWrite` `0x1b7`) |
| 25 | `ScalarConvertIntToFloat` | int→float 转换 |
| 26 | `ScalarConvertFloatToInt` | float→int 转换 |
| 27 | `ScalarIntAdd` | 整数相加 |
| 28 | `ScalarIntSub` | 整数子 |
| 29 | `ScalarAnd` | 按位与 |
| 30 | `ScalarOr` | 按位或 |
| 31 | `ScalarXor` | 按位异或 |
| 32 | `ScalarFloatAdd` `[S1]` | 浮动添加 |
| 33 | `ScalarFloatSub` `[S1]` | 浮子 |
| 34 | `ScalarFloatMax` | 浮动最大值 |
| 35 | `ScalarFloatMin` | 浮动最小值 |
| 36 | `ScalarLogicalShiftLeft` | 逻辑 shl |
| 37 | `ScalarLogicalShiftRight` | 逻辑shr |
| 38 | `ScalarArithmeticShiftRight` | 算术shr |
| 39 | `ScalarMove` | 寄存器移动 |
| 40 | `ScalarCountLeadingZeros` | clz |
| 41 | `ScalarIntEqual` | int == |
| 42 | `ScalarIntNotEqual` | int != |
| 43 | `ScalarIntGreater` | int > |
| 44 | `ScalarIntGreaterEqual` | int >= |
| 45 | `ScalarIntLess` | int < |
| 46 | `ScalarIntLessEqual` | int <= |
| 47 | `ScalarIntAddCarryOut` | int 添加并带出 |
| 48 | `ScalarPredicateOr` | 谓词或 |
| 49 | `ScalarFloatEqual` | 浮动 == |
| 50 | `ScalarFloatNotEqual` | 浮动 != |
| 51 | `ScalarFloatGreater` | 浮动 > |
| 52 | `ScalarFloatGreaterEqual` | 浮动 >= |
| 53 | `ScalarFloatLess` | 浮动 < |
| 54 | `ScalarFloatLessEqual` | 浮点数 <= |
| 55 | `ScalarIsInfOrNan` | 分类 inf/nan |
56 个具体操作。加上抽象基础 + `ResourceUsageEntry_DoNotUse` + 编解码器模板类型信息 = 59 Scalar1 类型信息。
> **注意 — 分歧限于序数 13..24 (Scalar0) / 13..24 (Scalar1) 加上 FloatMul/UintMul 与 FloatAdd/FloatSub 对。** 共享标头 (0..12) 和共享 ALU/比较尾部在两个管道中的 oneof 排序中是字节相同的。 Scalar0 在 Branch×3/Call×3/Dma×3 上花费序数 15..25,在 Mul 上花费 34..35; Scalar1 在 SMEM 上花费 13..15,在四个同步完成寄存器上花费 21..24,在 FloatAdd/Sub 上花费 32..33。重新实现者可以使用一个表来解码公共区域,并仅针对发散频带在管道 ID 上进行分支。
---
## 13 个定价的 BCS 嵌入原语
BCS 没有宽嵌入数据路径。嵌入操作所需的一切——地址算术、移动行的 DMA 以及排序行的同步——都在上面的标量 ISA 以及一些 LLO 级 DMA/同步构建器中表示。这些是 **13 个定价原语**:BarnaCore 延迟模型 (`PufferfishBarnaCorePerformance`) 的实际成本。他们属于三个家庭。
| 家族 | 原语(`LloRegionBuilder::Bc*` / 标量运算) | 角色 |
|---|---|---|
| **标量地址数学** | 共享 BCS 标量 ALU(`ScalarIntAdd/Sub`、`ScalarAnd`、`ScalarUintMul`、`ScalarIntLess`、`ScalarMove`、`ScalarPredicateOr` 以及发射极助手`SimmS32`/`SneS32`/`SsubS32`/`SandU32`/`SltS32`/ `Sselect`/`Pand`/`SdivU32`/`SmulU32`/`SmodU32`) | 跨内核计算 bmem/HBM 字地址、颗粒对齐、模分区列 |
| **DMA** | `BcDma`(→ `kBarnaCoreDma` `0x1bb`,19-arg),`barna_core::DmaGeneral`,`EnqueueDmaLocalInGranules` | 移动一个嵌入行 HBM↔bmem↔VMEM;跨核远程 DMA |
| **同步** | `BcSwaitInfeedSV`(`0x1ae`)、`BcSwaitEqSV`(`0x1b2`)、`BcSwaitGeSV`(`0x1b0`)、`BcSwaitGtSV`(`0x1b1`)、 `BcSwaitNeSV`(`0x1b3`)、`BcSwaitDone`(`0x1ac`)、`BcSsyncAdd`(`0x1ad`)、`BcSdoneWrite`(`0x1b5`)、`BcSpop` (`0x1b8`) | 等待/信号同步标志;聚集/分散完成排序 |
`BcSwait*` 系列是 Scalar0/Scalar1 `Sync*` 操作 (ords 4..10) 的 LLO 级表面 — `BcSwaitEqSV` 发出 `SyncEqualTo`、`BcSwaitGeSV` `SyncGreaterOrEqualTo`、`BcSsyncAdd` 至 `SyncAdd`、`BcSdoneWrite` 至 `WriteDone`。反编译显示所有 `BcSwait{Done,EqSV,GeSV,GtSV,NeSV,InfeedSV}`、`BcSsyncAdd`、`BcSpop`、`BcSdoneWrite`、`BcSfence` 均为 `LloRegionBuilder` 方法,以及地址助手 `BcBmemAddrScaled` 和通道移动`BcVectorLoad`/`BcVectorLoadImmediateOffset`/`BcVectorStore`。
---
## 20 → 13 嵌入操作降低
高级嵌入表面是一组 20 个 `kBarnaCore*` LLO 操作 — 本地/全局收集、梯度分散、稀疏缩减、远程标量写入、远程缓冲区 FSM 分配。它们**从不直接定价**:在 BarnaCore 延迟分类器中,它们是 LogFatal,正如 SC 标量成本表中缺少 SparseCore 流操作一样。它们的成本是**它们扩展成的原语的总和**。扩展是一个三层数据路径。
```text
TIER 1 (builder) TIER 2 (LLO op) TIER 3 (expansion)
--------------------- ----------------------------------- ---------------------------
LloRegionBuilder LloInstruction::CreateBarnaCore<Op> barna_core::BcsLloEmitter::*
::Bc<Op> (mov edi,0x1XX; LloInstruction::New) -> scalar ALU + BcDma + sync第 1 层 → 第 2 层:构建器和 LLO 操作码
LloRegionBuilder::Bc<Op> @ 0x1d57d560.. 调度传统手臂和河豚 (Pf) 手臂; Pf 臂需要更多 LloValue* 操作数(额外的远程缓冲区/多核寻址)。每个发出 LloInstruction::CreateBarnaCore<Op>,其操作码常量在 LloInstruction::New 调用之前从 mov edi,0x1XX 进行字节固定。反编译的ctors准确地确认了常量:CreateBarnaCoreDma调用LloInstruction::New(443, ...) = 0x1bb; CreateBarnaCoreLocalGather 通过 449 = 0x1c1; CreateBarnaCoreSparseReduce 通过 451 = 0x1c3。
| 高级运算 | Bc* 生成器 | Create* ctor | LLO操作码 |
|---|---|---|---|
kBarnaCoreDma | BcDma(19-arg) | CreateBarnaCoreDma (New(443,…)) | 0x1bb |
kBarnaCoreRemoteScalarWrite | BcRemoteScalarWrite / BcPf… | CreateBarnaCoreRemoteScalarWrite / Pf | 0x1bc / 0x1bd |
kBarnaCoreGlobalScatterIds | BcGlobalScatterIds / BcPf…(7 个参数) | CreateBarnaCoreGlobalScatterIds / Pf | 0x1bf / 0x1c0 |
kBarnaCoreLocalGather | BcLocalGather(6 个参数)/BcPf…(10 个参数) | CreateBarnaCoreLocalGather (New(449,…)) / Pf | 0x1c1 / 0x1c2 |
kBarnaCoreSparseReduce | BcSparseReduce(4 个参数)/BcPf…(7 个参数) | CreateBarnaCoreSparseReduce (New(451,…)) / Pf | 0x1c3 / 0x1c4 |
kBarnaCoreGlobalScatterGradients | BcGlobalScatterGradients(8 个参数)/ BcPf… | CreateBarnaCoreGlobalScatterGradients / Pf | 0x1c6 / 0x1c5 |
kBarnaCoreLocalScatterGradients | BcLocalScatterGradients / BcPf… | CreateBarnaCoreLocalScatterGradients / Pf | 0x1c7 / 0x1c8 |
kBarnaCoreIssueFsm | BcIssueFsm | (发出 IssueFsm) | 0x1b9 |
kBarnaCoreScalarFence | BcSfence | (发出 ScalarFence) | 0x1ba |
kBarnaCoreScalarWaitInfeed | BcSwaitInfeedSV | (发出 Sync* 等待) | 0x1ae |
kBarnaCoreMoveScalarReg | EmitBarnaCoreMoveScalarReg (@0x140c9400) | — | 0x1cb |
20 操作计数是在传统 + Pf 臂上计数的 F 路由块(收集/分散/减少/FSM/远程缓冲区操作);上述七个核心操作(Dma、RemoteScalarWrite、GlobalScatterIds、LocalGather、SparseReduce、GlobalScatterGradients、LocalScatterGradients)加上它们的Pf变体和IssueFsm/Fence/WaitInfeed/MoveScalarReg 附件构成表面。
第 3 层:BcsLloEmitter 扩展到 13 个基元
platforms_deepsea::jellyfish::barna_core::BcsLloEmitter(@0xf9d7700..0xf9d87a0,反汇编字节精确)是嵌入数据路径。每个高级操作都扩展为标量地址数学 + DMA + 同步。描述符获取通过 BcsMetadataAccessor (LoadBmemWordAddressFromMetadata @0xf9d9140、LoadPassHeaderMetadata @0xf9d8d40、LoadPayloadLocationMetadata @0xf9d8da0、LoadPartitionColumn @0xf9d92e0、LoadBarnaCoreLocation、LoadRemoteBufferOffset、GetBarnaCoreAbsoluteHbmAddress、LoadFsmTransferSizeMemUnit) — BarnaCore 相当于 SparseCore TAC 描述符表。
| 高级运算 | BcsLloEmitter 路径 | 扩展形状 |
|---|---|---|
kBarnaCoreLocalGather | IssueDmaInfeedToVmem (@0xf9d77e0) | 元数据加载 → ~10 标量 ALU (SimmS32/SneS32/SandU32/SsubS32/SltS32/Sselect/Pand/SdivU32) → SmemWordAddress/BcBmemAddrScaled → EnqueueDmaLocalInGranules(×2,谓词)→ BcDma + BcSwait 同步 |
kBarnaCoreGlobalScatterGradients | IssueDmaScatter (@0xf9d8400) → IssueDmaScatterOne (@0xf9d8560) | TpuCoreLocation::Id → SimpleLoop 过列 → 每列 SmulU32×2/SaddS32/SmodU32(模分区)→ LoadPartitionColumn → LoadBarnaCoreLocation/LoadRemoteBufferOffset/GetBarnaCoreAbsoluteHbmAddress/LoadFsmTransferSizeMemUnit → barna_core::DmaGeneral(跨核远程) |
收集同步(WaitForInfeedOfHostIds @0xf9d7700、WaitForInfeedToVmemDma @0xf9d7bc0) | WaitOnInfeedSyncFlag (@0xf9d9e00) / WaitOnValueAndClearSyncFlag (@0xf9d9d40) | BcSwaitInfeedSV + BcSwaitGeSV + BcSsyncAdd; BcSwaitEqSV/BcSwaitGeSV + BcSdoneWrite |
kBarnaCoreAllocateRemoteBuffers | AllocateRemoteBuffers (@0xf9d7ca0) | → LloRegionBuilder::BcIssueFsm(对地址处理程序 FSM 进行编程); AllocateRemoteBufferForPadding @0xf9d8340 填充变体 |
kBarnaCoreSparseReduce | BcSparseReduce @0x1d57d920 → CreateBarnaCoreSparseReduce (451) | 通过地址处理程序 FSM + DMA 实现,而不是引擎上的宽缩减(参见标注) |
因此,LocalGather 的成本为 {≈10 scalar ALU ops + 2 BcDma + sync}; GlobalScatterGradients 的成本为 {loop × [scalar partition math + DmaGeneral remote]}。因为成本是运行时动态循环行程计数(特征长度/分区计数)上的原始延迟(标量 = 1 等)的总和,所以高级操作不能定价为单个常量 - 这正是直接分类器中 20 个操作 LogFatal 的原因。
注意 —
SparseReduce没有本机通道缩减; LogFatal 是结构证据。PufferfishBarnaCoreChannelEmitter::EmitVectorSegmentedReduce(@0x140cf3a0) 和EmitVectorCrossLaneReduce(@0x140cf360) 都是 LogFatal:主体是LogMessageFatal("…pufferfish_barnacore_channel_emitter.h", 436) << "Not implemented"。 BarnaCore 的SparseReduce通过地址处理程序 FSM 作为跨步/分段 DMA 累加运行,而不是广泛的引擎内缩减。这是 BarnaCore 退役背后的具体 ISA 数据:SparseCore 的 TEC 通过扫描/排序/统一添加了三个本机向量 ALU,而 BarnaCore 的嵌入减少则通过 FSM + DMA 反弹。 SC侧对比参见退休和SCS 标量操作码枚举。
对比:BCS 与 SparseCore SCS 后继者
BCS 双标量管道是 SCS 三标量槽模型的结构祖先。收敛程度足够接近,可以作为退役证据:Pufferfish BC 定序器标量 ISA 镜像算术/比较/同步块中的 SC 标量 ALU 运算。
| 方面 | BCS(BarnaCore,本页) | SCS (后继者) |
|---|---|---|
| 每束标量插槽 | 2(scalar_0、scalar_1) | 3(ScsScalarMisc、ScalarAlu1、ScalarAlu0) |
| 操作码模型 | proto oneof 字段编号(声明顺序) | 6位主+类转义;操作码 = Matches() 立即数 |
| 具体标量运算 | 58 + 56 = 114 | ~78 (Alu0) / ~82 (Alu1) / ~82 (Misc) 操作形式 |
| 乘法/加减分割 | S0 上的 FloatMul,S1 上的 FloatAdd/Sub | Alu0 上的 FloatMul/Mul/Div,Alu1 上的 FloatAdd/Sub |
| SMEM 加载/存储 | 仅标量1 | ScalarAlu1-仅限 |
| 同步/原子 | Sync* 两个管道上的操作; S1 上的 Read/WriteDone+PublicAccess | 专用ScsScalarMisc复合同步/原子时隙 |
| 嵌入减少 | FSM + DMA(通道减少LogFatal) | TEC 原生矢量缩减(扫描/排序/统一) |
| 嵌入聚集/分散 | BcsLloEmitter → 标量 ALU + BcDma/DmaGeneral + 同步 | TAC 流收集/TEC 扫描管道 (STREAM_OPCODE_*) |
映射是直接的:BarnaCore LocalGather ≈ SparseCore STREAM_OPCODE_GATHER; GlobalScatterGradients ≈ STREAM_OPCODE_SCATTER_FLOAT_ADD; SparseReduce ≈ TEC 分段/跨通道缩减 - 除了 BarnaCore 缺乏本机矢量缩减并回退到 FSM + DMA,这是促使 BarnaCore 退役而转而支持 SparseCore 的主要功能差距。
功能图
所有地址均为河豚(pxc::pfc)BCS; proto-oneof 序数是操作码,mov edi,0x1XX 常量是 LLO 操作码。
| 符号 | 地址 | 证据 |
|---|---|---|
BarnaCoreSequencerBundle::_table_ | 0x21e868d8 | 2 个子消息辅助槽 {Scalar0, Scalar1} |
BarnaCoreSequencerScalar0::_table_ | 0x21e8b7f0 | max_field_number=62; 58 oneof aux @ 0x21e8bb68 |
BarnaCoreSequencerScalar1::_table_ | 0x21e90b98 | max_field_number=60; 56 oneof aux @ 0x21e90ef8 |
BarnaCoreSequencerScalar0 抽象底座 _ZTV | 0x21e87840 | vtable 用于类型信息协调 |
FindFreeScalarSlot<…SyncAdd, …SyncAdd> | 0x140efa80 | 双发行绑定(38 对) |
FindFreeScalarSlot<…ScalarFloatMul, void> | 0x140ee020 | Scalar0-only 结合(EvE 标记) |
FindFreeScalarSlot<…ScalarHalt, …ScalarHalt> | 0x140e79e0 | Halt 可双发 |
LloInstruction::CreateBarnaCoreDma | 0x1d4e1c20 | LloInstruction::New(443,…) = 0x1bb |
LloInstruction::CreateBarnaCoreLocalGather | 0x1d4e2040 | New(449,…) = 0x1c1 |
LloInstruction::CreateBarnaCoreSparseReduce | 0x1d4e2120 | New(451,…) = 0x1c3 |
LloRegionBuilder::BcDma | 0x1d57d5a0 | 19-arg kBarnaCoreDma 生成器 |
LloRegionBuilder::BcLocalGather | 0x1d57d880 | 6-arg 本地收集构建器 |
LloRegionBuilder::BcSparseReduce | 0x1d57d920 | 4-arg 稀疏归约构建器 |
barna_core::BcsLloEmitter::IssueDmaInfeedToVmem | 0xf9d77e0 | 本地收集扩展 |
barna_core::BcsLloEmitter::IssueDmaScatter | 0xf9d8400 | 梯度散射柱环 |
barna_core::BcsLloEmitter::WaitForInfeedOfHostIds | 0xf9d7700 | 收集同步 → BcSwait*/BcSsyncAdd |
barna_core::BcsLloEmitter::AllocateRemoteBuffers | 0xf9d7ca0 | 通过 BcIssueFsm 的远程缓冲 FSM |
BcsMetadataAccessor::LoadBmemWordAddressFromMetadata | 0xf9d9140 | 嵌入描述符获取 |
PufferfishBarnaCoreChannelEmitter::EmitVectorSegmentedReduce | 0x140cf3a0 | LogFatal“未实现”(无本机减少) |
InstBits_BarnaCorePxcHwMode | 0x33931f0 | 181,344 B 位编码表(捆绑页) |
注意事项
- **操作码是一个字段号,而不是位字段。**上面的名册是逻辑操作码空间(编解码器选择器)。物理 32 字节捆绑位分配是
InstBits_BarnaCorePxcHwMode的关注点 — 请参阅 BCS 32 字节捆绑包。不要将 oneof 序数读取为位位置。 - 类型信息计数不是操作计数。 计算 RTTI 类型信息得出 61 Scalar0 + 59 Scalar1 = 120;从每个管道中减去抽象基础、原型映射条目和编解码器模板类型信息后,具体的 ISA 操作数为 58 + 56 = 114。重新实现器需要 114 个 op 编码器。
- 管道绑定是从模板参数读取的,而不是捆绑位。
<S0_X, void>/<void, S1_X>标记 FindFreeScalarSlot 仅管道操作;仅结构管道操作仅在一个管道中具有 vtable。 38 个双发出/2 个仅 S0/6 个仅 S1 分割加上结构控制 DMA/SMEM 操作就是完整的图景。 - 这 20 个高级操作没有独立延迟。 它们在直接分类器中 LogFatal;它们的成本是它们扩展成的 13 个原语的运行时动态总和。任何成本模型都必须走
BcsLloEmitter扩展,而不是查找高级操作。 SparseReduce/segmented-reduce 成为 LogFatal 是一个功能缺失,而不是存根。 BarnaCore 确实没有原生向量缩减;嵌入减少是 FSM + DMA 累加。发出通道缩减操作的重新实现将遇到相同的Not implemented致命错误。- 所有 BarnaCore LLO 操作码整数都以两种独立的方式固定。 七个核心收集/分散/减少向量在
LloInstruction::New之前紧接着携带一个字节精确的mov edi, 0x1XX(0x1bb/0x1bc/0x1bf/0x1c1/0x1c3/0x1c6/0x1c7,以及Pf变体0x1bd/0x1c0/0x1c2/0x1c4/0x1c5/0x1c8)。整个0x1ac..0x1ccBarnaCore 块的完整操作码→名称绑定 — 包括WaitInfeed0x1ae、IssueFsm0x1b9、ScalarFence0x1ba和MoveScalarReg0x1cb— 由重新定位的LloOpcodeName::opcode_name指针表 (@0x21ccfef0) 独立修复,因此这四个是已确认的,而不仅仅是从调用顺序推断的。
交叉引用
- BarnaCore 概述 — 传统嵌入加速器,三代(Jellyfish/Dragonfish/Pufferfish),以及 BCS 在管道中的位置。
- BCS 32 字节捆绑包 — 物理捆绑字节编码 (
InstBits_BarnaCorePxcHwMode);此页面的操作码是捆绑包放置的逻辑序数之一。 - 合并 ALU — BCS 算术/比较块所属的共享标量/向量 ALU 谱系。
- 退休 — 为什么 SparseCore 取代了 BarnaCore;此页面上的
SparseReduce-via-FSM LogFatal 数据是五个证据行之一。 - SCS 标量操作码枚举 — SparseCore SCS 标量 ISA,其后继者,其三槽双 ALU 模型为 BCS 双标量分割预示;趋同点是退休论点。
- 二进制:
extracted/libtpu-0.0.40-cp314-cp314-manylinux_2_31_x86_64/libtpu/libtpu.so(构建 ID89edbbe81c5b328a958fe628a9f2207d) - 索引条目: 第九部分 — SparseCore 和 BarnaCore / BarnaCore(旧版 v2–v4) — 返回索引