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