Pull Request已成功合入, 合并人@CANN-robot
(感谢 li-xingyue-lxy 的贡献)变更摘要
本 PR 为 Tensor API 的 experimental 寄存器向量计算新增 select、fill、interleave/deinterleave 三组接口:新增公共头文件 compare_and_select.h、data_padding.h、data_reorder.h 声明接口,并在 impl/tensor_api/experimental/arch/vector/ 下新增对应实现(通过 asc_select、asc_duplicate_scalar/asc_duplicate、asc_intlv/asc_deintlv 等内置指令实现),同时更新 vector_compute.h 统一聚合这些头文件。此外还补充了 fill、data_reorder 两个使用示例以及针对 __NPU_ARCH__ == 3510 的单元测试。
主要改动
- 新增
select接口: 新增compare_and_select.h声明及compare_and_select_impl.h实现,按条件掩码从两个reg_tensor<T>中逐元素选择,并通过is_select_support_type限制支持类型(bool、整型、fp8、half、bfloat16_t、float等)。 - 新增
fill接口: 新增data_padding.h及data_padding_impl.h,提供以标量值或寄存器张量按掩码填充的两种重载,返回带有掩码的reg_tensor<T>,支持类型由is_fill_support_type约束。 - 新增
interleave/deinterleave接口: 新增data_reorder.h及data_reorder_impl.h,对两个寄存器张量执行交错/解交错并返回reg_pair<T>(结果使用全量掩码),支持类型由is_data_reorder_support_type约束。 - 聚合头文件更新:
include/tensor_api/experimental/vector_compute.h增加对data_reorder.h、data_padding.h、compare_and_select.h的引用,使新接口通过统一的vector_compute.h对外暴露。 - 示例与测试: 新增
reg_vector_compute/fill与reg_vector_compute/data_reorder示例(含data_utils.h与scripts/gen_data.py数据生成脚本),并新增test_tensor_api_data_padding.cpp、test_tensor_api_data_reorder.cpp、test_tensor_api_compare_and_select.cpp覆盖各支持类型的编译与掩码行为断言。


代码审查
关闭总结
发现统计
- P0(2 个):阻断性编译错误 ——
data_padding_impl.h第二个fill重载使用未声明标识符val(应为src);fill.asc使用未声明标识符layer_out(应为layout)。 - P1(1 个):
test_tensor_api_compare_and_select.cpp引用全仓库未定义的宏COMPARE_AND_SELECT_TEST,测试文件无法编译。 - P3(7 个):data_reorder 测试期望掩码用
all_mask<uint8_t>与 T 不一致;data_reorder.asc 死代码(count/data_type未使用);两个示例 main 未检查aclrt*/ReadFile/WriteFile返回值(含失败路径泄漏 goldenData);两个 gen_data.py 未使用的argparse导入;两个 impl 头文件#warning路径写错(reg/→arch/vector/);select/interleave 单测缺少数据语义验证。
各文件审查结论
- examples/01_simd_cpp_api/07_tensor_api/experimental/reg_vector_compute/data_reorder/CMakeLists.txt —— no issues(与 fill 的 CMakeLists 一致,无实质问题)
- examples/01_simd_cpp_api/07_tensor_api/experimental/reg_vector_compute/data_reorder/data_reorder.asc —— P3 ×2(死代码、未检查返回值);golden 数据与 deinterleave 语义核对一致
- examples/01_simd_cpp_api/07_tensor_api/experimental/reg_vector_compute/data_reorder/data_utils.h —— no issues(ReadFile 有 size 上限检查,无溢出风险)
- examples/01_simd_cpp_api/07_tensor_api/experimental/reg_vector_compute/data_reorder/scripts/gen_data.py —— P3(未使用的 argparse)
- examples/01_simd_cpp_api/07_tensor_api/experimental/reg_vector_compute/fill/CMakeLists.txt —— no issues
- examples/01_simd_cpp_api/07_tensor_api/experimental/reg_vector_compute/fill/data_utils.h —— no issues(与 data_reorder 版一致)
- examples/01_simd_cpp_api/07_tensor_api/experimental/reg_vector_compute/fill/fill.asc —— P0(
layer_out未声明)+ P3(未检查返回值/泄漏) - examples/01_simd_cpp_api/07_tensor_api/experimental/reg_vector_compute/fill/scripts/gen_data.py —— P3(未使用的 argparse)
- impl/tensor_api/experimental/arch/vector/compare_and_select_impl.h —— P3(#warning 路径错误);
Std::未限定用法与仓库既有代码一致 - impl/tensor_api/experimental/arch/vector/data_padding_impl.h —— P0(
val未声明)+ P3(#warning 路径错误) - impl/tensor_api/experimental/arch/vector/data_reorder_impl.h —— no issues(
AscendC::Std限定、intrinsic 调用与 mask_reg_compute_impl 模式一致) - include/tensor_api/experimental/arch/vector/compare_and_select.h —— no issues
- include/tensor_api/experimental/arch/vector/data_padding.h —— no issues(默认实参
all_mask<T>()与实现签名匹配) - include/tensor_api/experimental/arch/vector/data_reorder.h —— no issues
- include/tensor_api/experimental/vector_compute.h —— no issues(新增 3 个 include)
- tests/api/tensor_api/npu_arch_3510/aiv/test_tensor_api_compare_and_select.cpp —— P1(未定义宏)+ P3(缺数据语义测试)
- tests/api/tensor_api/npu_arch_3510/aiv/test_tensor_api_data_padding.cpp —— no issues(自身宏完整;但会因 impl 的 P0 问题连带编译失败)
- tests/api/tensor_api/npu_arch_3510/aiv/test_tensor_api_data_reorder.cpp —— P3(期望掩码类型不一致)
总体风险判断
本 PR 新增 API 头文件与实现、示例和单测存在 3 个会直接导致构建失败的缺陷(其中 data_padding_impl.h 的 val 未声明会波及所有面向 3510 包含 vector_compute.h 的翻译单元),属阻断性问题,必须修复后才能合入。其余为示例健壮性、测试质量与告警文案层面的低危问题。deinterleave/fill 的金标准数据与内核语义经核对一致,API 头/实现的核心逻辑未见其他正确性缺陷。
| 类型 | 数量 |
|---|---|
| 🔴 阻塞 | 3 |
| 🟡 建议 | 0 |
⛔ 需要修改


compile


The MR can not be merged, because of CodeReview discussion not resolved
If you want to solve this problem, you can click here to do it in the FAQs.


描述
1.新增tensor api reg矢量计算select/fill/deinterleave接口
2.新增tensor api reg矢量计算select/fill/deinterleave的样例和资料
关联的Issue
https://gitcode.com/cann/asc-devkit/issues/1316
测试
自验
文档更新
tensor api矢量接口资料更新
类型标签