このドキュメントでは、仕様の変更を確認するためのガイドラインについて概説します。現時点では、これらの変更では通常、複数のソースの複数のチェックを行います。そのため、このドキュメントではレビューを簡素化するためにすべてを要約しています。
- status.md の [Specification] 列に「yes」と表示されていることを確認します。新しい演算を追加する場合は行を追加します。
- セクション タイトルが ODS 内の演算のニーモニックと一致しているかどうかを確認します。
- 「セマンティクス」セクションが XLA の Operation Semantics と一致しているかどうかを確認します。
- [Inputs] セクションと [Outputs] セクションが次の条件を満たしているかどうかを確認します。
- ODS と同じ項目を記載します。
- HloInstruction::CreateFromProto と同じアイテムをリストします。
- ODS とまったく同じ順序で並べられる。
- 不一致がある場合は、対応するチケットがあるかどうかを確認します。
- [制約] セクションで次の設定を確認します。
- XLA の shape_inference.cc と一致します。
- XLA の hlo_verifier.cc と一致します。
- ODS と一致します。
- StablehloOps.cpp と一致します。
- 不一致がある場合は、対応するチケットがあるかどうかを確認します。仕様内の、できるだけ具体的な場所にすべてのチケットをリンクします(たとえば、チケットが実装されていない制約に関する場合は、その制約に直接チケットをリンクします)。
- ODS と StablehloOps.cpp の対応する部分が仕様と一致している場合は、status.md の [Verification] 列と [Type Inference] 列に「yes」と表示されていることを確認します。
- [例] セクションで次のことを確認します。
- 例は 1 つだけです。(今後、StableHLO インタープリタ テストスイートの他の例へのリンクも提供する予定です)。
- コードサンプルで
stablehlo-opt
を実行して、有効な MLIR 構文を使用します。 stablehlo-opt -mlir-print-op-generic
を実行することで取得できる汎用の MLIR 構文を使用します(プリティプリンタの変更で仕様を変更しなくても済むように、仕様の汎用構文を使用します)。
- 演算の ODS の
description
が次のことを確認します。- 仕様の最初の文を含めます。
- 仕様の対応するセクションへのリンクを示します。
- 次に、仕様と同じ例を使用しますが、
stablehlo-opt
を実行することで取得できるプリティな構文を使用します。
- 検証と型推論制約の実装に関連するファイルが、以下のガイドラインを遵守していることを確認します。
- StablehloOps.td のガイドライン #1 に従います。
- TypeInference.cpp と StablehloOps.cpp については、ガイドライン #2 に従ってください。
- ops_stablehlo.mlir については、ガイドライン #5 に沿って対応してください。
- infer_stablehlo.mlir については、ガイドライン #6 に従ってください。
- 副作用と投機性に関する演算を評価します。
- その演算に副作用がなく、常に投機的である場合は、
Pure
トレイトを指定します。ほとんどのオペレーションで動的シェイプが許可されているため、実行時にシェイプの不一致が発生する可能性がありますが、未定義の動作であるため、このようなケースはまれです。他の状況でも、一部のオペレーションが未定義の動作になる可能性があります。ほとんどの演算には副作用がありません(NoMemoryEffect
トレイトが必要です)。 - ほとんどのオペレーションは
HLO_SpeculatableIf*
トレイトのいずれかに分類されます。演算がいずれの条件にも当てはまらない場合は、ConditionallySpeculatable
トレイトを指定してインターフェース メソッドを実装します。stablehlo/tests/ops_speculatability.mlir
にテストを追加して、投機性ロジックをカバーします。
- その演算に副作用がなく、常に投機的である場合は、