Skip to content

BCS Scalar0/Scalar1 ISA

此页面上的每个操作类名称、原序数、管道绑定和 LLO 操作码字节都是从 libtpu-0.0.40-cp314 轮中的 libtpu.so(构建 ID 89edbbe81c5b328a958fe628a9f2207d)中读取的 - 来自 asic_sw::deepsea::pxc::pfc::isa::BarnaCoreSequencerScalar{0,1}_<Op> vtable/typeinfo 集(原型) TcParseTableBase oneof-aux 数组、FindFreeScalarSlot<Scalar0_X,Scalar1_X> 模板实例化和 LloInstruction::CreateBarnaCore* 构造函数操作码常量。其他版本有所不同。

摘要

BarnaCore 是 Google 的传统嵌入加速器(v2-v4:Jellyfish、Dragonfish、Pufferfish),是 SparseCore 所取代的前身。 Pufferfish 一代的计算核心是 BCS(BarnaCore Sequencer):一个 2 宽双标量 VLIW,其捆绑包 (BarnaCoreSequencerBundle) 恰好携带两个标量槽:scalar_0scalar_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_0scalar_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 辅助数组中的顺序是*操作码顺序。

名册是可恢复的,因为原型运行时为每个操作发出一整套方法(ClearByteSizeLong_InternalSerializeMergeImpl、ctor/dtor)和每个操作 _table_ 解析表。重新定位父 oneof 的辅助指针数组(条目为 R_X86_64_RELATIVE;文件保存零,来自 readelf -r 的加数)生成每个成员的子 _table_ 符号,c++filt 将其映射回操作类名称。这是 SCS侧 上的 SCS Matches() 谓词扫描的原始模拟:操作码是 cmp 立即数;这里它是一个字段编号。

c
// 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` | intfloat 转换 |
| 28 | `ScalarConvertFloatToInt` | floatint 转换 |
| 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` | intfloat 转换 |
| 26 | `ScalarConvertFloatToInt` | floatint 转换 |
| 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`。

---

## 2013 嵌入操作降低

高级嵌入表面是一组 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, ...) = 0x1bbCreateBarnaCoreLocalGather 通过 449 = 0x1c1; CreateBarnaCoreSparseReduce 通过 451 = 0x1c3

高级运算Bc* 生成器Create* ctorLLO操作码
kBarnaCoreDmaBcDma(19-arg)CreateBarnaCoreDma (New(443,…))0x1bb
kBarnaCoreRemoteScalarWriteBcRemoteScalarWrite / BcPf…CreateBarnaCoreRemoteScalarWrite / Pf0x1bc / 0x1bd
kBarnaCoreGlobalScatterIdsBcGlobalScatterIds / BcPf…(7 个参数)CreateBarnaCoreGlobalScatterIds / Pf0x1bf / 0x1c0
kBarnaCoreLocalGatherBcLocalGather(6 个参数)/BcPf…(10 个参数)CreateBarnaCoreLocalGather (New(449,…)) / Pf0x1c1 / 0x1c2
kBarnaCoreSparseReduceBcSparseReduce(4 个参数)/BcPf…(7 个参数)CreateBarnaCoreSparseReduce (New(451,…)) / Pf0x1c3 / 0x1c4
kBarnaCoreGlobalScatterGradientsBcGlobalScatterGradients(8 个参数)/ BcPf…CreateBarnaCoreGlobalScatterGradients / Pf0x1c6 / 0x1c5
kBarnaCoreLocalScatterGradientsBcLocalScatterGradients / BcPf…CreateBarnaCoreLocalScatterGradients / Pf0x1c7 / 0x1c8
kBarnaCoreIssueFsmBcIssueFsm(发出 IssueFsm)0x1b9
kBarnaCoreScalarFenceBcSfence(发出 ScalarFence)0x1ba
kBarnaCoreScalarWaitInfeedBcSwaitInfeedSV(发出 Sync* 等待)0x1ae
kBarnaCoreMoveScalarRegEmitBarnaCoreMoveScalarReg (@0x140c9400)0x1cb

20 操作计数是在传统 + Pf 臂上计数的 F 路由块(收集/分散/减少/FSM/远程缓冲区操作);上述七个核心操作(DmaRemoteScalarWriteGlobalScatterIdsLocalGatherSparseReduceGlobalScatterGradientsLocalScatterGradients)加上它们的Pf变体和IssueFsm/Fence/WaitInfeed/MoveScalarReg 附件构成表面。

第 3 层:BcsLloEmitter 扩展到 13 个基元

platforms_deepsea::jellyfish::barna_core::BcsLloEmitter(@0xf9d7700..0xf9d87a0,反汇编字节精确)是嵌入数据路径。每个高级操作都扩展为标量地址数学 + DMA + 同步。描述符获取通过 BcsMetadataAccessor (LoadBmemWordAddressFromMetadata @0xf9d9140LoadPassHeaderMetadata @0xf9d8d40LoadPayloadLocationMetadata @0xf9d8da0LoadPartitionColumn @0xf9d92e0LoadBarnaCoreLocationLoadRemoteBufferOffsetGetBarnaCoreAbsoluteHbmAddressLoadFsmTransferSizeMemUnit) — BarnaCore 相当于 SparseCore TAC 描述符表。

高级运算BcsLloEmitter 路径扩展形状
kBarnaCoreLocalGatherIssueDmaInfeedToVmem (@0xf9d77e0)元数据加载 → ~10 标量 ALU (SimmS32/SneS32/SandU32/SsubS32/SltS32/Sselect/Pand/SdivU32) → SmemWordAddress/BcBmemAddrScaledEnqueueDmaLocalInGranules(×2,谓词)→ BcDma + BcSwait 同步
kBarnaCoreGlobalScatterGradientsIssueDmaScatter (@0xf9d8400) → IssueDmaScatterOne (@0xf9d8560)TpuCoreLocation::IdSimpleLoop 过列 → 每列 SmulU32×2/SaddS32/SmodU32(模分区)→ LoadPartitionColumnLoadBarnaCoreLocation/LoadRemoteBufferOffset/GetBarnaCoreAbsoluteHbmAddress/LoadFsmTransferSizeMemUnitbarna_core::DmaGeneral(跨核远程)
收集同步(WaitForInfeedOfHostIds @0xf9d7700WaitForInfeedToVmemDma @0xf9d7bc0)WaitOnInfeedSyncFlag (@0xf9d9e00) / WaitOnValueAndClearSyncFlag (@0xf9d9d40)BcSwaitInfeedSV + BcSwaitGeSV + BcSsyncAddBcSwaitEqSV/BcSwaitGeSV + BcSdoneWrite
kBarnaCoreAllocateRemoteBuffersAllocateRemoteBuffers (@0xf9d7ca0)LloRegionBuilder::BcIssueFsm(对地址处理程序 FSM 进行编程); AllocateRemoteBufferForPadding @0xf9d8340 填充变体
kBarnaCoreSparseReduceBcSparseReduce @0x1d57d920CreateBarnaCoreSparseReduce (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_0scalar_1)3(ScsScalarMiscScalarAlu1ScalarAlu0)
操作码模型proto oneof 字段编号(声明顺序)6位主+类转义;操作码 = Matches() 立即数
具体标量运算58 + 56 = 114~78 (Alu0) / ~82 (Alu1) / ~82 (Misc) 操作形式
乘法/加减分割S0 上的 FloatMul,S1 上的 FloatAdd/SubAlu0 上的 FloatMul/Mul/Div,Alu1 上的 FloatAdd/Sub
SMEM 加载/存储仅标量1ScalarAlu1-仅限
同步/原子Sync* 两个管道上的操作; S1 上的 Read/WriteDone+PublicAccess专用ScsScalarMisc复合同步/原子时隙
嵌入减少FSM + DMA(通道减少LogFatal)TEC 原生矢量缩减(扫描/排序/统一)
嵌入聚集/分散BcsLloEmitter → 标量 ALU + BcDma/DmaGeneral + 同步TAC 流收集/TEC 扫描管道 (STREAM_OPCODE_*)

映射是直接的:BarnaCore LocalGather ≈ SparseCore STREAM_OPCODE_GATHERGlobalScatterGradientsSTREAM_OPCODE_SCATTER_FLOAT_ADDSparseReduce ≈ TEC 分段/跨通道缩减 - 除了 BarnaCore 缺乏本机矢量缩减并回退到 FSM + DMA,这是促使 BarnaCore 退役而转而支持 SparseCore 的主要功能差距。


功能图

所有地址均为河豚(pxc::pfc)BCS; proto-oneof 序数是操作码,mov edi,0x1XX 常量是 LLO 操作码。

符号地址证据
BarnaCoreSequencerBundle::_table_0x21e868d82 个子消息辅助槽 {Scalar0, Scalar1}
BarnaCoreSequencerScalar0::_table_0x21e8b7f0max_field_number=62; 58 oneof aux @ 0x21e8bb68
BarnaCoreSequencerScalar1::_table_0x21e90b98max_field_number=60; 56 oneof aux @ 0x21e90ef8
BarnaCoreSequencerScalar0 抽象底座 _ZTV0x21e87840vtable 用于类型信息协调
FindFreeScalarSlot<…SyncAdd, …SyncAdd>0x140efa80双发行绑定(38 对)
FindFreeScalarSlot<…ScalarFloatMul, void>0x140ee020Scalar0-only 结合(EvE 标记)
FindFreeScalarSlot<…ScalarHalt, …ScalarHalt>0x140e79e0Halt 可双发
LloInstruction::CreateBarnaCoreDma0x1d4e1c20LloInstruction::New(443,…) = 0x1bb
LloInstruction::CreateBarnaCoreLocalGather0x1d4e2040New(449,…) = 0x1c1
LloInstruction::CreateBarnaCoreSparseReduce0x1d4e2120New(451,…) = 0x1c3
LloRegionBuilder::BcDma0x1d57d5a019-arg kBarnaCoreDma 生成器
LloRegionBuilder::BcLocalGather0x1d57d8806-arg 本地收集构建器
LloRegionBuilder::BcSparseReduce0x1d57d9204-arg 稀疏归约构建器
barna_core::BcsLloEmitter::IssueDmaInfeedToVmem0xf9d77e0本地收集扩展
barna_core::BcsLloEmitter::IssueDmaScatter0xf9d8400梯度散射柱环
barna_core::BcsLloEmitter::WaitForInfeedOfHostIds0xf9d7700收集同步 → BcSwait*/BcSsyncAdd
barna_core::BcsLloEmitter::AllocateRemoteBuffers0xf9d7ca0通过 BcIssueFsm 的远程缓冲 FSM
BcsMetadataAccessor::LoadBmemWordAddressFromMetadata0xf9d9140嵌入描述符获取
PufferfishBarnaCoreChannelEmitter::EmitVectorSegmentedReduce0x140cf3a0LogFatal“未实现”(无本机减少)
InstBits_BarnaCorePxcHwMode0x33931f0181,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..0x1cc BarnaCore 块的完整操作码→名称绑定 — 包括 WaitInfeed 0x1aeIssueFsm 0x1b9ScalarFence 0x1baMoveScalarReg 0x1cb — 由重新定位的 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(构建 ID 89edbbe81c5b328a958fe628a9f2207d)
  • 索引条目: 第九部分 — SparseCore 和 BarnaCore / BarnaCore(旧版 v2–v4) — 返回索引