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");
错误也可以在操作上下文之外报告。在这种情况下,必须提供一个位置。要报告警告或备注,只需在上述示例中将“Error”替换为“Warning”或“Remark”即可。
一旦 ONNX 图已验证,后续所有错误情况都应使用 assert 报告以停止编译,因为这是需要适当处理的编译器错误。可以使用两个调用
assert(condition-that-should-hold-true && "error message");
llvm_unreachable("error message");
unreachable 调用对于应返回值的函数很有用,因为如果该路径上没有虚拟值返回语句,编译器将不会报告警告。否则,在 void 函数中,使用 assert 是完全可以的。
其他相关信息可在下面提到的 LLVM 和 MLIR 文档中找到。