SuperAPI AI 工具集

workspace-estimation-shared-header

编程与开发

查看项目

更新于 10-16 00:31

技能介绍

用途:这份资料来自 microsoft/onnxruntime,记录实现 MatMulNBits 两级工作区大小估算(EstimateWorkspace / DeclareWorkspaceRequirements,issue #29775 Phase-A、PR #29811)时总结的 DLL 边界经验,适用于编辑会被树内代码和共享提供程序/插件桥接代码同时包含的边界安全共享头文件,例如 include/onnxruntime/core/framework/workspace_requirement.h 中的 WorkspaceRequirement 结构。

主要能力与要点:

  1. 不要在双世界共享头文件中前向声明 Node。onnxruntime::Node 在整个代码库中并非同一类型:树内代码看到的是 core/graph/graph.h 中的 class Node,插件 DLL 可达的共享提供程序/插件桥接代码看到的是提供程序桥接头文件中的另一个 Node(如 struct Node final),二者属于不同的 ODR 世界。写 class Node; 可能因 class 与 struct 的 class-key 冲突,或仅在特定包含顺序下静默选错类型。修复方式是彻底省略前向声明,让每个翻译单元自己的真实包含提供所需 Node 类型;不要为节省编译时间而前向声明。确认标准:该头文件在仅树内的翻译单元中能干净构建,且(当此类目标存在后)在插件 DLL 翻译单元中也能干净构建,不依赖包含顺序。
  2. 让工作区估算函数中可共享复用的部分不接触图类型。当内核的工作区大小计算需要同时被树内和(未来)插件代码调用时,拆成两块:纯数学核心,只接收普通形状/架构整数,例如 ComputeFpAIntBGemmWorkspaceSize(int m, int n, int k, int sm, int multiProcessorCount),不含 Node&、NodeArg、TensorShape 解析或任何 ORT 图类型,未来插件实现可原样调用(插件内核没有 Node&,只有 C-ABI 形状表示 OrtNode、Node_GetInputShape);图解析包装层,从 const Node&/NodeArg/TensorShape(或插件的 C-ABI 形状访问器)提取普通整数,这部分因构建配置而异,不可跨 DLL 边界复用,必须针对调用方持有的形状表示重新实现。若纯数学核心意外接受或触碰树内图类型,插件路径就无法复用,除非把树内图头文件链接进插件 DLL(违背插件边界目的)或复制整个函数。确认标准:在纯数学函数的签名与函数体中检索任何 ORT 图类型(Node、NodeArg、TensorShape、GraphViewer 等),它应只出现普通标量(int/int64_t/size_t),至多是由调用方已提取的不透明设备属性值。

限制:资料提到 docs/annotated_partitioning/future_directions_constrained_env.md(Phase A / 插件 ABI 部分)描述了 DeclareWorkspaceRequirements 预期的插件侧 C ABI 接口,但截至 PR #29811 尚无插件侧实现,该文档的“Cost of a Real Plugin-Side Override (Deferred)”说明了除遵循此拆分外仍缺失的内容。