StableHLO 规范核对清单

在本文档中,我们总结了审核规范变更时需遵循的准则。目前,这些更改通常涉及检查多个来源中的多项内容,因此本文档对其进行了总结,以简化审核过程:

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