ONNX 模型在 MLIR 编译器基础设施中的表示和参考下推
此项目由 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");
错误也可以在操作上下文之外报告。在这种情况下,必须提供位置。要报告警告或备注,只需在上述示例中将“Warning”或“Remark”替换为“Error”。
ONNX 图已验证后,所有后续的错误情况都应使用 assert 来报告以停止编译,因为这是需要妥善处理的编译器错误。有两个调用可以使用
assert(condition-that-should-hold-true && "error message");
llvm_unreachable("error message");
unreachable 调用在应该返回值但没有虚拟返回值语句的函数中很有用。否则,在 void
函数中,使用 assert 是完全可以的。
更多相关信息请参阅下面引用的 LLVM 和 MLIR 文档。