在本文档中,我们总结了审核规范变更时需遵循的准则。目前,这些更改通常涉及检查多个来源中的多项内容,因此本文档对其进行了总结,以简化审核过程:
- 检查 status.md 中的“规范”列是否显示“yes”(是),如果要添加新操作,则需要添加一行。
- 检查部分标题是否与 ODS 中操作的助记符匹配。
- 检查“语义”部分是否与 XLA 的操作语义匹配。
- 检查“Inputs”(输入)和“Outputs”(输出)部分是否满足以下条件:
- 列出与 ODS 相同的项。
- 列出与 HloInstruction::CreateFromProto 相同的项。
- 排序与 ODS 完全相同。
- 如果存在任何不匹配,请检查是否存在相应的工单。
- 检查“限制条件”部分是否:
- 匹配 XLA 的 shape_inference.cc。
- 匹配 XLA 的 hlo_verifier.cc。
- 与 ODS 匹配。
- 与 StablehloOps.cpp 匹配。
- 如果存在任何不匹配,请检查是否存在相应的工单。在尽可能具体的位置在规范中关联所有这些工单(例如,如果工单与尚未实现的约束条件有关,请直接在该限制条件中关联工单)。
- 如果 ODS 和 StablehloOps.cpp 的相应部分与规范匹配,请检查 status.md 中的“Verification”和“类型推断”列是否显示“yes”。
- 检查“示例”部分是否:
- 只有一个样本。(将来,我们会提供指向 StableHLO 解释器测试套件中的更多示例的链接。)
- 通过对代码示例运行
stablehlo-opt
,使用有效的 MLIR 语法。 - 使用通用 MLIR 语法,该语法可通过运行
stablehlo-opt -mlir-print-op-generic
获取(我们坚持在规范中使用通用语法,以免必须更改有关 美观打印机更改的规范)。
- 检查操作的 ODS 中的
description
:- 包含规范的第一句。
- 然后链接到规范的相应部分。
- 然后使用与规范相同的示例,但使用漂亮的语法,该语法可通过运行
stablehlo-opt
获取。
- 检查与实现验证和类型推断约束相关的文件是否遵循下述准则:
- 遵循 StablehloOps.td 的准则 1。
- 遵循 TypeInference.cpp 和 StablehloOps.cpp 的指南第 2。
- 遵循 ops_stablehlo.mlir 的准则 #5。
- 遵循 infer_stablehlo.mlir 指南 #6。
- 评估相应操作的附带效应和推测性。
- 如果操作没有任何副作用并且始终可推测,请为其提供
Pure
trait。这种情况很少见,因为大多数操作都支持动态形状,这可能会导致在运行时期间形状不匹配,这是一种未定义的行为。一些操作在其他情况下也可能出现未定义的行为。绝大多数操作都没有副作用(它们应该具有NoMemoryEffect
trait)。 - 大多数 op 都属于某个
HLO_SpeculatableIf*
特征。如果操作不适合其中任何操作,请为操作提供ConditionallySpeculatable
trait 并实现接口方法。向stablehlo/tests/ops_speculatability.mlir
添加测试以涵盖推测性逻辑。
- 如果操作没有任何副作用并且始终可推测,请为其提供