ops-nn 流水线在同一节点串行执行多个算子的 eager cust 冒烟 job,各 job 以 --vendor_name=<算子名> 将自定义算子包装到独立 vendor 目录。当相邻 job 的安装包 存在同名算子注册(本 MR 各 matmul 算子因依赖展开,包内容天然重叠)时,后执行 job 的示例进程在运行期崩溃:
--vendor_name=<算子名>
double free or corruption (!prev) Run eager example failed, op_name: gemm_v3, failed_example: gemmv3
不涉及
编译成功
CI 日志时序(job 12095): 15:03:31 安装 batch_mat_mul_v3 包 → vendors/batch_mat_mul_v3_nn 15:03:39 bmmv3 的 5 个示例全部通过(此时节点仅一个 vendor,单份注册) 15:04:07 安装 gemm_v3 包 → vendors/gemm_v3_nn 15:04:14 gemm_v3 示例 double free 崩溃(此时两个 vendor 目录共存)
复现矩阵(本地,同一 CI 构建包):
包内容重叠证据(解包对比两个 CI 包的注册库):
触发原理:
已排除项:
结论:无法根治,不建议为绕过框架缺陷做架构级改造。原因:
Describe the current behavior / 问题描述 (Mandatory / 必填)
ops-nn 流水线在同一节点串行执行多个算子的 eager cust 冒烟 job,各 job 以
--vendor_name=<算子名>将自定义算子包装到独立 vendor 目录。当相邻 job 的安装包存在同名算子注册(本 MR 各 matmul 算子因依赖展开,包内容天然重叠)时,后执行 job
的示例进程在运行期崩溃:
Environment Information / 环境信息 (Mandatory / 必填)
不涉及
Steps to reproduce the issue / 重现步骤 (Mandatory / 必填)
bash cann-ops-nn-batch_mat_mul_v3_linux-aarch64.run --quiet # → batch_mat_mul_v3_nn
bash cann-ops-nn-gemm_v3_linux-aarch64.run --quiet # → gemm_v3_nn
bash build.sh --run_example gemm_v3 eager cust --vendor_name=gemm_v3
→ ❌ double free or corruption (!prev)
→ ✅ 成功
Describe the expected behavior / 预期结果 (Mandatory / 必填)
编译成功
Related log / screenshot / 日志 / 截图 (Mandatory / 必填)
CI 日志时序(job 12095):
15:03:31 安装 batch_mat_mul_v3 包 → vendors/batch_mat_mul_v3_nn
15:03:39 bmmv3 的 5 个示例全部通过(此时节点仅一个 vendor,单份注册)
15:04:07 安装 gemm_v3 包 → vendors/gemm_v3_nn
15:04:14 gemm_v3 示例 double free 崩溃(此时两个 vendor 目录共存)
Special notes for this issue/备注 (Optional / 选填)
复现矩阵(本地,同一 CI 构建包):
包内容重叠证据(解包对比两个 CI 包的注册库):
MatMulV3、TransposeBatchMatMul
job 的包收敛到同一算子集合,各自生成一份独立的注册库
触发原理:
REG_OP/OP_ADD/IMPL_OP_INFERSHAPE 宏展开的全局对象构造函数(静态初始化
器)形式存在于 liboptiling.so / libcust_opsproto_rt2.0.so 中
vendor 目录的注册库;每个 .so 是独立 ELF,其静态初始化器在加载时各自
执行一遍 → 同名算子在进程全局注册表中出现两条
注册表对同名重复注册既不报错也不跳过
内部资源被释放两次 → glibc "double free or corruption (!prev)"
已排除项:
ops-nn CMake 工程能否适配"不重复注册"
结论:无法根治,不建议为绕过框架缺陷做架构级改造。原因:
无法感知运行环境上会共存哪些 vendor 包
ExecAddmmGraph 等),其 def/infershape 的注册宏与功能代码同库,无法
"只编功能代码不编注册代码";按算子拆分注册库属于打包架构级改造
(需动 package.cmake/symbol.cmake/gen_ops_info 及全部流水线)
"重复注册不崩溃"(幂等或冲突报错)本质上只能由运行时注册表保证