MLIR 編譯器基礎架構中 ONNX 模型的表示和參考降低
此專案由 onnx 維護
託管於 GitHub Pages — 主題由 orderedlist 提供
有兩種不同類型的錯誤:來自使用者輸入的錯誤和編譯器錯誤。我們應該為使用者輸入錯誤提供有意義的使用者回饋,並且應該使用 emitError
函式。編譯器錯誤應使用 asserts
或 llvm_unreachable
呼叫來回報。實際上,如果存在檢查錯誤的函式,並且能夠傳回「失敗」,則首選的方法是使用 emitError
並傳回失敗。另一方面,如果函式不允許傳回失敗,則應使用 assert 或 unreachable 呼叫。傳回錯誤對於檢查使用者輸入的 Pass 非常重要,例如在擷取 ONNX 模型期間。
MLIR 根據嚴重程度提供 3 個不同的呼叫:emitError
、emitWarning
和 ‘emitRemark’。錯誤通常應報告給呼叫函式以進行適當的處理。典型用法如下所示。
return op->emitError("message");
return op->emitError() << "message";
以上呼叫將包含操作的位置。它會傳回一個 LogicalResult
,可以如下設定/測試。請注意,emitError
呼叫會傳回 failure()
值;
LogicalResult isEven(int i) { return (i%2 == 0) success() : failure(); }
if (succeeded(isEven(0)) && failed(isEven(1))) printf("It is all good.\n");
錯誤也可以在操作的上下文之外回報。在這種情況下,必須提供位置。要回報警告或備註,只需將上面範例中的「Error」替換為「Warning」或「Remark」即可。
一旦 ONNX 圖形經過驗證,所有後續錯誤情況都應使用 assert 回報以停止編譯,因為這是需要妥善處理的編譯器錯誤。可以使用兩個呼叫
assert(condition-that-should-hold-true && "error message");
llvm_unreachable("error message");
unreachable 呼叫在應該傳回值的函式中很有用,因為如果該路徑上沒有虛擬值傳回陳述式,編譯器將不會回報警告。否則,在 void
函式中,使用 assert 是完全沒問題的。
其他相關資訊可在以下引用的 LLVM 和 MLIR 文件中找到。