ONNX 模型在 MLIR 编译器基础设施中的表示和参考降低
本项目由 onnx 维护
托管于 GitHub Pages — 主题由 orderedlist 提供
错误有两种不同类型:来自用户输入的错误和编译器错误。对于用户输入错误,我们应提供有意义的用户反馈,并使用 emitError
函数。编译器错误应使用 asserts
或 llvm_unreachable
调用报告。实践中,如果函数中检查错误并可以返回“失败”,首选方式是使用 emitError
并返回失败。另一方面,如果函数不允许返回失败,则应使用断言或不可达调用。返回错误对于检查用户输入的 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(condition-that-should-hold-true && "error message");
llvm_unreachable("error message");
当函数应该返回值时,不可达调用很有用,因为如果该路径上没有 dummy-value return 语句,编译器将不会报告警告。否则,在 void
函数中,使用断言是完全可以的。
更多相关信息可在下方引用的 LLVM 和 MLIR 文档中找到。