| 文件 | 最后提交记录 | 最后更新时间 |
|---|---|---|
fix(sasum): 对齐 cuBLAS quick-return 语义 Co-authored-by: chensi79@huawei.com<chensi79@huawei.com> # message auto-generated for no-merge-commit merge: !302 merge fix/sasum-quick-return into master fix(sasum): 对齐 cuBLAS quick-return 语义 Created-by: chensi79 Commit-by: chensi79@huawei.com Merged-by: cann-robot Description: ## 问题 aclblasSasum 对 n < 0、incx <= 0 的处理与 cuBLAS/Netlib BLAS 不一致;n == 0 路径还会在 Host 侧直接解引用 Device result。 Closes #325 ## 修改 - n <= 0 或 incx <= 0 时返回成功,并向 Device result 写入 0.0f。 - quick-return 时允许 x == nullptr,但仍校验 result != nullptr。 - 同步更新 Netlib golden、NPU wrapper、README 和 CSV 测试。 - quick-return 测试将结果预置为非零,确保确实发生写零。 - 新增负步长、空 x、空 result 等边界用例。 - 按仓库 pre-commit clang-format 规则格式化涉及文件。 ## 测试 bash source ~/Ascend/cann-9.0.0/set_env.sh bash build.sh --ops=sasum --soc=ascend950 --run 结果:58/58 测试通过。 pre-commit:clang-format 与 pragma-once 检查通过。 ## 说明 cuBLAS 可通过 pointer mode 支持 Host/Device result;当前 ops-blas 未提供 pointer-mode API,故本修复遵循现有公开契约,将 result 作为 Device 输出处理。 See merge request: cann/ops-blas!302 | 1 个月前 | |
fix(complex): 统一复数 BLAS 算子接口对齐 BLAS 标准(issues #61-#75) Co-authored-by: 2301_82146483<2556943601@qq.com> # message auto-generated for no-merge-commit merge: !316 merge fix/complex-blas-interface-alignment into master fix(complex): 统一复数 BLAS 算子接口对齐 BLAS 标准(issues #61-#75) Created-by: 2301_82146483 Commit-by: 2301_82146483 Merged-by: cann-robot Description: ## 关联 Issues Closes #61, #62, #63, #64, #65, #66, #67, #68, #69, #70, #71, #72, #75 ## 背景 仓库中复数 BLAS 算子接口以及少数实数BLAS算子接口与标准BLAS算子存在三类风格差异: 1. 维度参数使用 int64_t 而非 int 2. 标量 alpha/beta/c/s 按值传递而非指针传递 3. 只读输入指针缺少 const 修饰 此外 aclblasCcopy 参数顺序为 (x, y, n, incx, incy),与 BLAS 标准和同库 aclblasScopy 的 (n, x, incx, y, incy) 不一致。 ## 本次 PR 内容 ### 三类风格统一 将 15 个算子的接口签名对齐到与标准浮点算子一致: | 改动类型 | 说明 | |---|---| | int64_t → int | n/m/incx/incy/lda/batchCount 等维度参数统一为 int | | 按值 → 指针 | const aclblasComplex alpha → const aclblasComplex* alpha;const float c, const float s → const float* c, const float* s | | 补 const | 只读输入指针 x/y/A 添加 const 修饰 | | 空指针检查 | 所有指针传递的标量参数(alpha/beta/c/s)在函数体开头添加 nullptr 检查 | | 溢出防护 | n * 2 表达式在乘法前加 static_cast 避免 int 溢出 | ### Ccopy 参数顺序修正 aclblasCcopy 参数顺序从 (handle, x, y, n, incx, incy) 修正为 (handle, n, x, incx, y, incy),与 BLAS 标准一致。 ### 涉及算子清单(15 个) | Issue | 算子 | 改动要点 | |---|---|---| | #61 | aclblasCaxpy | int64_t→int + alpha→指针 + const(x) + nullptr check | | #62 | aclblasCcopy | 参数顺序修正 + int64_t→int + const(x) | | #63 | aclblasCdotc | int64_t→int | | #64 | aclblasCdotu | int64_t→int | | #65 | aclblasCgemvBatched | int64_t→int + alpha/beta→指针 + const(A,x) + nullptr check | | #66 | aclblasCgemv | int64_t→int + alpha/beta→指针 + const(A,x) + nullptr check | | #67 | aclblasCgerc | int64_t→int + alpha→指针 + const(x,y) + nullptr check | | #68 | aclblasCscal | int64_t→int + alpha→指针 + nullptr check | | #69 | aclblasCsrot | int64_t→int + c/s→指针 + nullptr check | | #70 | aclblasCsscal | int64_t→int + alpha→指针 + nullptr check + 溢出防护 | | #71 | aclblasCswap | int64_t→int | | #72 | aclblasCtrmv | int64_t→int + const(A) | | #75 | aclblasScnrm2 | int64_t→int + const(x) + 溢出防护 | | — | aclblasSdot | int64_t→int(风格统一) | | — | aclblasSsymm | int64_t→int(风格统一) | ### 实现策略 - Host 实现内部通过 const_cast 桥接到 kernel_do 函数(接受 uint8_t*),**Kernel 二进制不变** - alpha/beta 解引用:alpha.real → alpha->real - 测试调用点:alpha → &alpha,局部变量 int64_t → int ## 测试结果 远端 Ascend 910B3(arch22)环境构建与测试(15 个算子全部通过): | 测试 | 结果 | |------|------| | caxpy | PASS | | cscal | PASS | | sscal | PASS | | csrot | PASS | | cswap | PASS | | cdot | PASS | | scopy | PASS | | snrm2 | PASS | | cgemv | PASS | | cgerc | PASS | | ctrmv | PASS | | cgemv_batched | PASS | | sdot | PASS | | ssymm | PASS | See merge request: cann/ops-blas!316 | 1 个月前 | |
Fix: Handle 类型由 void* 改为前向声明结构体指针风格,对齐 cuBLAS/ROCm Co-authored-by: Zitao Wang<wangzitao4@huawei.com> # message auto-generated for no-merge-commit merge: !277 merge issue_110_258 into master Fix: Handle 类型由 void* 改为前向声明结构体指针风格,对齐 cuBLAS/ROCm Created-by: wangzitao_leo Commit-by: Zitao Wang Merged-by: cann-robot Description: ## 描述 将 aclblasHandle_t 和 aclblasLtHandle_t 从 void* 改为前向声明结构体指针(typedef struct _aclblas_handle* aclblasHandle_t),对齐 cuBLAS/ROCm 主流标准,获得编译期类型校验。Descriptor 类型此前已完成结构体指针化改造,本次仅涉及 Handle。清理了所有冗余的 reinterpret_cast 和 trivial 辅助函数。 ### 改动范围 **核心改动(2 个公开头文件):** - include/cann_ops_blas.h:typedef void* aclblasHandle_t → typedef struct _aclblas_handle* aclblasHandle_t - include/cann_ops_blasLt.h:typedef void* aclblasLtHandle_t → typedef struct aclblasLtHandle* aclblasLtHandle_t **清理改动(90 个文件):** - 删除 3 个 trivial 辅助函数(ToInternalHandle、ToInternal x2) - 移除 92 处 reinterpret_cast<_aclblas_handle*>(handle) → 直接用 handle - 移除 3 处 reinterpret_cast<aclblasLtHandle*>(lightHandle) → 直接用 lightHandle - 移除 2 处反向 cast(reinterpret_cast<void*>(h) / reinterpret_cast<aclblasLtHandle_t>(h))→ 直接赋值 - 更新 1 处过时注释 ### ABI 兼容性 指针的二进制表示不变,无 ABI 破坏。 ## 关联的Issue [#110](https://gitcode.com/cann/ops-blas/issues/110) ## 测试 所有 host 侧目标文件(80+ 算子 host、aclblas_auxiliary、blasLt API)零错误编译通过;grep 确认零遗留 reinterpret_cast 和 ToInternalHandle/ToInternal;ABI 无破坏(指针二进制表示不变)。 ## 文档更新 无需文档更新,API 签名不变。 ## 类型标签 - [x] Bug修复 - [ ] 新特性 - [ ] 性能优化 - [ ] 文档更新 - [ ] 其他,请描述: See merge request: cann/ops-blas!277 | 1 个月前 | |
fix(trsm,gemm): 为 strsm_blocked_kernel 和 gemm 添加 CANN-9.0.0 版本守卫 Co-authored-by: LambdaMiX<202400800552@mail.sdu.edu.cn> # message auto-generated for no-merge-commit merge: !319 merge fix/trsm-cann90-compat into master fix(trsm,gemm): 为 strsm_blocked_kernel 和 gemm 添加 CANN-9.0.0 版本守卫 Created-by: LambdaMiX Commit-by: LambdaMiX Merged-by: cann-robot Description: ## 描述 <!--在这里详细描述你的改动,包括改动的原因和所采取的方法。--> ### 问题描述 master 分支在 CANN-9.0.0 社区版下编译 Ascend950 算子失败(issue #313)。 根因: blas/trsm/arch35/strsm_blocked_kernel.cpp 的 GEMM kernel 部分依赖 tensor_api(ops-tensor 仓库),其底层调用的三个 intrinsic(asc_get_phy_buf_addr / asc_get_vf_len / asc_set_l0c2gm_channel_para)在 CANN-9.0.0 的 sys_var.h 中尚不存在(9.0.0 未引入 #elif __NPU_ARCH__ == 3510 块,9.1.0 才新增)。 同时发现 blas/gemm/arch35/gemm_kernel.cpp(commit 775719b 新增)存在相同问题,且两者均未纳入已有的版本守卫机制。 ### 修改内容 采用与 trmm / syrk / syr2k 等已有算子一致的版本守卫模式(devkit >= 9.1 编译,低版本跳过),共 5 文件 +46/-4 行,不修改任何算子逻辑: | 文件 | 改动 | |------|------| | cmake/asc_devkit_version.cmake | 新增 ENABLE_BLAS_TRSM_BLOCKED + ENABLE_BLAS_GEMM 变量 | | blas/CMakeLists.txt | devkit < 9.1 时排除 strsm_blocked_kernel + /gemm/arch35/ | | blas/trsm/arch35/strsm_host.cpp | #if 条件编译,低版本 LEFT 路径 fallback 到 SIMT | | blas/gemm/arch35/gemm_host.cpp | 低版本整体跳过(gemm 为新增算子,9.0.0 原不含) | | cmake/test.cmake | 低版本跳过 gemm 测试注册 | **strsm 低版本行为**:strsm_kernel.cpp(SIMT path)不依赖 tensor_api,低版本下功能完整,LEFT 路径全部 fallback 到 SIMT,仅大矩阵性能有所降低。 **gemm 低版本行为**:gemm 为 issue #313 之后新增算子,9.0.0 社区版原不含此算子,低版本下整体跳过,与 trmm/syrk 等已有守卫算子处理方式一致。 ## 关联的Issue <!-- 如果这个PR是为了解决特定的Issue,请在这里提供Issue链接。例如:关联Issue #000--> [#313](https://gitcode.com/cann/ops-blas/issues/313) ## 测试 <!--描述进行了哪些测试来验证你的改动。--> 在真实 CANN-9.0.0 社区版和 CANN-9.1.0-beta.1 双环境下验证: | 验证项 | CANN-9.0.0 | CANN-9.1.0 | |--------|:----------:|:----------:| | 编译 | ✅ 0 error(两文件正确跳过) | ✅ 0 error(全量编译) | | trsm 精度测试 | ✅ 119/119 PASS(SIMT path) | ✅ 119/119 PASS(含 blocked path) | 性能对比(blocked vs SIMT,chrono 精确计时,3 预热 + 7 次取中位数): - 大方阵(512×512 ~ 1024×1024):9.1.0 blocked 比 9.0.0 SIMT 快 2.2~5.1x - 小矩阵 / RIGHT 路径:无差异(同走 SIMT) - 9.0.0 下大矩阵性能退化 2~5 倍,功能正确,升级 9.1.0 后恢复 ## 文档更新 <!--如果这个PR包含文档的更新,请在这里指出。例如:更新了README.md文件。--> ## 类型标签 <!-- [x] 表示选中 --> - [x] Bug修复 - [ ] 新特性 - [ ] 性能优化 - [ ] 文档更新 - [ ] 其他,请描述: See merge request: cann/ops-blas!319 | 1 个月前 | |
fix(complex): 统一复数 BLAS 算子接口对齐 BLAS 标准(issues #61-#75) Co-authored-by: 2301_82146483<2556943601@qq.com> # message auto-generated for no-merge-commit merge: !316 merge fix/complex-blas-interface-alignment into master fix(complex): 统一复数 BLAS 算子接口对齐 BLAS 标准(issues #61-#75) Created-by: 2301_82146483 Commit-by: 2301_82146483 Merged-by: cann-robot Description: ## 关联 Issues Closes #61, #62, #63, #64, #65, #66, #67, #68, #69, #70, #71, #72, #75 ## 背景 仓库中复数 BLAS 算子接口以及少数实数BLAS算子接口与标准BLAS算子存在三类风格差异: 1. 维度参数使用 int64_t 而非 int 2. 标量 alpha/beta/c/s 按值传递而非指针传递 3. 只读输入指针缺少 const 修饰 此外 aclblasCcopy 参数顺序为 (x, y, n, incx, incy),与 BLAS 标准和同库 aclblasScopy 的 (n, x, incx, y, incy) 不一致。 ## 本次 PR 内容 ### 三类风格统一 将 15 个算子的接口签名对齐到与标准浮点算子一致: | 改动类型 | 说明 | |---|---| | int64_t → int | n/m/incx/incy/lda/batchCount 等维度参数统一为 int | | 按值 → 指针 | const aclblasComplex alpha → const aclblasComplex* alpha;const float c, const float s → const float* c, const float* s | | 补 const | 只读输入指针 x/y/A 添加 const 修饰 | | 空指针检查 | 所有指针传递的标量参数(alpha/beta/c/s)在函数体开头添加 nullptr 检查 | | 溢出防护 | n * 2 表达式在乘法前加 static_cast 避免 int 溢出 | ### Ccopy 参数顺序修正 aclblasCcopy 参数顺序从 (handle, x, y, n, incx, incy) 修正为 (handle, n, x, incx, y, incy),与 BLAS 标准一致。 ### 涉及算子清单(15 个) | Issue | 算子 | 改动要点 | |---|---|---| | #61 | aclblasCaxpy | int64_t→int + alpha→指针 + const(x) + nullptr check | | #62 | aclblasCcopy | 参数顺序修正 + int64_t→int + const(x) | | #63 | aclblasCdotc | int64_t→int | | #64 | aclblasCdotu | int64_t→int | | #65 | aclblasCgemvBatched | int64_t→int + alpha/beta→指针 + const(A,x) + nullptr check | | #66 | aclblasCgemv | int64_t→int + alpha/beta→指针 + const(A,x) + nullptr check | | #67 | aclblasCgerc | int64_t→int + alpha→指针 + const(x,y) + nullptr check | | #68 | aclblasCscal | int64_t→int + alpha→指针 + nullptr check | | #69 | aclblasCsrot | int64_t→int + c/s→指针 + nullptr check | | #70 | aclblasCsscal | int64_t→int + alpha→指针 + nullptr check + 溢出防护 | | #71 | aclblasCswap | int64_t→int | | #72 | aclblasCtrmv | int64_t→int + const(A) | | #75 | aclblasScnrm2 | int64_t→int + const(x) + 溢出防护 | | — | aclblasSdot | int64_t→int(风格统一) | | — | aclblasSsymm | int64_t→int(风格统一) | ### 实现策略 - Host 实现内部通过 const_cast 桥接到 kernel_do 函数(接受 uint8_t*),**Kernel 二进制不变** - alpha/beta 解引用:alpha.real → alpha->real - 测试调用点:alpha → &alpha,局部变量 int64_t → int ## 测试结果 远端 Ascend 910B3(arch22)环境构建与测试(15 个算子全部通过): | 测试 | 结果 | |------|------| | caxpy | PASS | | cscal | PASS | | sscal | PASS | | csrot | PASS | | cswap | PASS | | cdot | PASS | | scopy | PASS | | snrm2 | PASS | | cgemv | PASS | | cgerc | PASS | | ctrmv | PASS | | cgemv_batched | PASS | | sdot | PASS | | ssymm | PASS | See merge request: cann/ops-blas!316 | 1 个月前 | |
feat(cdgmm): 迁移 ColwiseMul 为行主序 Cdgmm;新增 extensions/ 目录迁移 ComplexMatDot Co-authored-by: 2301_82146483<2556943601@qq.com> # message auto-generated for no-merge-commit merge: !314 merge feat/cdgmm-migration into master feat(cdgmm): 迁移 ColwiseMul 为行主序 Cdgmm;新增 extensions/ 目录迁移 ComplexMatDot Created-by: 2301_82146483 Commit-by: 2301_82146483 Merged-by: cann-robot Description: ## 关联 Issue Closes #84 ## 背景 Issue #84 要求对仓库中的非标准算子进行规范化迁移: 1. aclblasColwiseMul 是一个非标准接口,需重构为 aclblasCdgmm,接口形态对齐 cuBLAS cublasCdgmm。 2. 仓库需要新建 extensions/ 目录,将扩展类算子(如 complex_mat_dot)从 blas/ 迁移到 extensions/,保持与标准 BLAS 算子的目录分离。 ## 本次 PR 内容 ### 任务一:aclblasColwiseMul → aclblasCdgmm 迁移 按照迁移方案文档执行,核心策略为**行主序、LEFT-only、最小改动**: - **接口重构**:删除 aclblasColwiseMul,新增 aclblasCdgmm,参数数量、顺序和类型对齐 cublasCdgmm(handle, mode, m, n, A, lda, x, incx, C, ldc)。 - **行主序布局**:A/C 为行主序复数矩阵,lda/ldc 表示行跨度(>= max(1, n)),与 cuBLAS 列主序存在差异,文档已明确说明。 - **LEFT-only**:第一阶段只实现 ACLBLAS_SIDE_LEFT(C[i,j] = x[i] * A[i,j]),RIGHT 返回 ACLBLAS_STATUS_NOT_SUPPORTED,非法 mode 返回 ACLBLAS_STATUS_INVALID_ENUM。 - **标准参数支持**:独立 lda/ldc、正负 incx、padding 保持、原地执行(A==C && lda==ldc)。 - **内存修复**:aug 内存从 new[] 改为 std::vector,修复所有错误路径的内存泄漏。 - **动态核数**:使用 GetAivCoreCount() 替代硬编码 8 核,多核仍按行切分。 - **Kernel 复用**:原 colwise_mul 的 GatherMask 去交错、复数标量乘法、Gather 重新交错、ping-pong UB、大行分块等逻辑全部原样保留,仅拆分输入/输出行偏移为 2*row*lda / 2*row*ldc。 - **CMake 版本门槛**:ENABLE_BLAS_DGMM 改为 ENABLE_BLAS_SDGMM,使 arch22 Cdgmm 不被 arch35 Sdgmm 的 asc-devkit >= 9.1 门槛误伤。 - **测试迁移**:53 个 CSV 驱动用例 + 1 个 NullHandle TEST_F,覆盖参数校验、LEFT 功能、incx 正负、lda/ldc padding、原地执行、长行超 UB tile、多核切分等。 - **清理**:删除 blas/colwise_mul/、test/colwise_mul/,更新 docs/zh/api_list.md 和 blas/dgmm/README.md。 ### 任务二:complex_mat_dot → extensions/complexmatdot 迁移 - **新建 extensions/ 目录**:在根目录创建 extensions/,用于存放非标准 BLAS 扩展算子。 - **源码迁移**:blas/complex_mat_dot/ → extensions/complexmatdot/arch22/,文件名统一去掉下划线。 - **kernel.h 拆分**:从 kernel.cpp 的 include guard 中拆出独立的 complexmatdot_kernel.h。 - **内存修复**:aug 内存同样从 new[] 改为 std::vector。 - **测试迁移**:test/complex_mat_dot/complex_mat_dot/ → test/extensions/complexmatdot/。 - **CMake 适配**:extensions/CMakeLists.txt 追加到 ALL_BLAS_SRC_FILES(而非覆盖);cmake/test.cmake 增加 extensions/ 目录搜索路径;根 CMakeLists.txt 新增 add_subdirectory(extensions) 和 include 路径。 - **文档更新**:docs/zh/api_list.md 链接更新。 - **清理**:删除 blas/complex_mat_dot/ 和 test/complex_mat_dot/。 ## 测试结果 远端 Ascend 910B3 环境构建与测试: | 测试 | 结果 | |------|------| | cdgmm --soc=ascend910b3 --run | 54 tests passed(含 NullHandle + 53 CSV 用例)| | complexmatdot --soc=ascend910b3 --run | 1 test passed | | sdgmm --soc=ascend950 | 编译通过,不受影响 | | dgmm --soc=ascend910b3 | cdgmm 构建正确,sdgmm 正确跳过 | | dgmm --soc=ascend950 | sdgmm 构建正确,cdgmm 正确跳过 | 符号检查: - libops_blas.so 导出 aclblasCdgmm、aclblasComplexMatDot、aclblasCreate - 不导出 aclblasColwiseMul - rg -i "aclblasColwiseMul|ColwiseMul|colwise_mul" 无有效功能代码引用 ## 目标 SoC - Atlas A2 训练/推理系列(ascend910b3 / arch22):Cdgmm + ComplexMatDot - Ascend 950PR / Ascend 950DT(ascend950 / arch35):Sdgmm 不受影响 See merge request: cann/ops-blas!314 | 1 个月前 | |
fix(complex): 统一复数 BLAS 算子接口对齐 BLAS 标准(issues #61-#75) Co-authored-by: 2301_82146483<2556943601@qq.com> # message auto-generated for no-merge-commit merge: !316 merge fix/complex-blas-interface-alignment into master fix(complex): 统一复数 BLAS 算子接口对齐 BLAS 标准(issues #61-#75) Created-by: 2301_82146483 Commit-by: 2301_82146483 Merged-by: cann-robot Description: ## 关联 Issues Closes #61, #62, #63, #64, #65, #66, #67, #68, #69, #70, #71, #72, #75 ## 背景 仓库中复数 BLAS 算子接口以及少数实数BLAS算子接口与标准BLAS算子存在三类风格差异: 1. 维度参数使用 int64_t 而非 int 2. 标量 alpha/beta/c/s 按值传递而非指针传递 3. 只读输入指针缺少 const 修饰 此外 aclblasCcopy 参数顺序为 (x, y, n, incx, incy),与 BLAS 标准和同库 aclblasScopy 的 (n, x, incx, y, incy) 不一致。 ## 本次 PR 内容 ### 三类风格统一 将 15 个算子的接口签名对齐到与标准浮点算子一致: | 改动类型 | 说明 | |---|---| | int64_t → int | n/m/incx/incy/lda/batchCount 等维度参数统一为 int | | 按值 → 指针 | const aclblasComplex alpha → const aclblasComplex* alpha;const float c, const float s → const float* c, const float* s | | 补 const | 只读输入指针 x/y/A 添加 const 修饰 | | 空指针检查 | 所有指针传递的标量参数(alpha/beta/c/s)在函数体开头添加 nullptr 检查 | | 溢出防护 | n * 2 表达式在乘法前加 static_cast 避免 int 溢出 | ### Ccopy 参数顺序修正 aclblasCcopy 参数顺序从 (handle, x, y, n, incx, incy) 修正为 (handle, n, x, incx, y, incy),与 BLAS 标准一致。 ### 涉及算子清单(15 个) | Issue | 算子 | 改动要点 | |---|---|---| | #61 | aclblasCaxpy | int64_t→int + alpha→指针 + const(x) + nullptr check | | #62 | aclblasCcopy | 参数顺序修正 + int64_t→int + const(x) | | #63 | aclblasCdotc | int64_t→int | | #64 | aclblasCdotu | int64_t→int | | #65 | aclblasCgemvBatched | int64_t→int + alpha/beta→指针 + const(A,x) + nullptr check | | #66 | aclblasCgemv | int64_t→int + alpha/beta→指针 + const(A,x) + nullptr check | | #67 | aclblasCgerc | int64_t→int + alpha→指针 + const(x,y) + nullptr check | | #68 | aclblasCscal | int64_t→int + alpha→指针 + nullptr check | | #69 | aclblasCsrot | int64_t→int + c/s→指针 + nullptr check | | #70 | aclblasCsscal | int64_t→int + alpha→指针 + nullptr check + 溢出防护 | | #71 | aclblasCswap | int64_t→int | | #72 | aclblasCtrmv | int64_t→int + const(A) | | #75 | aclblasScnrm2 | int64_t→int + const(x) + 溢出防护 | | — | aclblasSdot | int64_t→int(风格统一) | | — | aclblasSsymm | int64_t→int(风格统一) | ### 实现策略 - Host 实现内部通过 const_cast 桥接到 kernel_do 函数(接受 uint8_t*),**Kernel 二进制不变** - alpha/beta 解引用:alpha.real → alpha->real - 测试调用点:alpha → &alpha,局部变量 int64_t → int ## 测试结果 远端 Ascend 910B3(arch22)环境构建与测试(15 个算子全部通过): | 测试 | 结果 | |------|------| | caxpy | PASS | | cscal | PASS | | sscal | PASS | | csrot | PASS | | cswap | PASS | | cdot | PASS | | scopy | PASS | | snrm2 | PASS | | cgemv | PASS | | cgerc | PASS | | ctrmv | PASS | | cgemv_batched | PASS | | sdot | PASS | | ssymm | PASS | See merge request: cann/ops-blas!316 | 1 个月前 | |
Feat: 新增面向arch35的aclblasDotEx接口 Co-authored-by: LuckySun<sunwenlong8@huawei.com> # message auto-generated for no-merge-commit merge: !262 merge aclblasDotEx into master Feat: 新增面向arch35的aclblasDotEx接口 Created-by: LuckySun Commit-by: LuckySun Merged-by: cann-robot Description: ## 描述 新增面向 arch35(Ascend 950) 的扩展点积接口 aclblasDotEx,对标 cuBLAS cublasDotEx。 接口签名: cpp aclblasStatus_t aclblasDotEx(aclblasHandle_t handle, int n, const void* x, aclDataType xType, int incx, const void* y, aclDataType yType, int incy, void* result, aclDataType resultType, aclDataType executionType); 支持 FP32/FP16/BF16 三种输入类型,内部统一以 FP32 精度计算,result 类型与输入类型一致。 实现采用双路径策略: - incx == incy && |incx| == 1:SIMD regbase 路径,Mul + ReduceSum 向量化,多核切分 + 跨核归约 - 其余情况:SIMT grid-stride 路径,各线程独立寻址累加,写 per-thread 槽位 + asc_syncthreads + thread 0 串行归约 → 跨核同步 → Core 0 最终 ReduceSum UB 分配采用权重法正比例计算,双缓冲 TQue 流水线。Workspace 布局: [per-thread: useCoreNum × numThreads] [per-core: useCoreNum] SIMT 路径各线程先写 per-thread 槽位,thread 0 归约后写入 per-core 区域,Core 0 从 per-core 区域连续读取做最终归约。 ## 关联的Issue https://gitcode.com/cann/ops-blas/issues/307 ## 测试  ## 文档更新 新增 blas/dotex/README.md。 ## 类型标签 - [ ] Bug修复 - [x] 新特性 - [ ] 性能优化 - [ ] 文档更新 - [ ] 其他,请描述: See merge request: cann/ops-blas!262 | 1 个月前 | |
Fix: Handle 类型由 void* 改为前向声明结构体指针风格,对齐 cuBLAS/ROCm Co-authored-by: Zitao Wang<wangzitao4@huawei.com> # message auto-generated for no-merge-commit merge: !277 merge issue_110_258 into master Fix: Handle 类型由 void* 改为前向声明结构体指针风格,对齐 cuBLAS/ROCm Created-by: wangzitao_leo Commit-by: Zitao Wang Merged-by: cann-robot Description: ## 描述 将 aclblasHandle_t 和 aclblasLtHandle_t 从 void* 改为前向声明结构体指针(typedef struct _aclblas_handle* aclblasHandle_t),对齐 cuBLAS/ROCm 主流标准,获得编译期类型校验。Descriptor 类型此前已完成结构体指针化改造,本次仅涉及 Handle。清理了所有冗余的 reinterpret_cast 和 trivial 辅助函数。 ### 改动范围 **核心改动(2 个公开头文件):** - include/cann_ops_blas.h:typedef void* aclblasHandle_t → typedef struct _aclblas_handle* aclblasHandle_t - include/cann_ops_blasLt.h:typedef void* aclblasLtHandle_t → typedef struct aclblasLtHandle* aclblasLtHandle_t **清理改动(90 个文件):** - 删除 3 个 trivial 辅助函数(ToInternalHandle、ToInternal x2) - 移除 92 处 reinterpret_cast<_aclblas_handle*>(handle) → 直接用 handle - 移除 3 处 reinterpret_cast<aclblasLtHandle*>(lightHandle) → 直接用 lightHandle - 移除 2 处反向 cast(reinterpret_cast<void*>(h) / reinterpret_cast<aclblasLtHandle_t>(h))→ 直接赋值 - 更新 1 处过时注释 ### ABI 兼容性 指针的二进制表示不变,无 ABI 破坏。 ## 关联的Issue [#110](https://gitcode.com/cann/ops-blas/issues/110) ## 测试 所有 host 侧目标文件(80+ 算子 host、aclblas_auxiliary、blasLt API)零错误编译通过;grep 确认零遗留 reinterpret_cast 和 ToInternalHandle/ToInternal;ABI 无破坏(指针二进制表示不变)。 ## 文档更新 无需文档更新,API 签名不变。 ## 类型标签 - [x] Bug修复 - [ ] 新特性 - [ ] 性能优化 - [ ] 文档更新 - [ ] 其他,请描述: See merge request: cann/ops-blas!277 | 1 个月前 | |
feat(arch35): 新增 geam 算子,包含 aclblasSgeam 和 aclblasCgeam 接口 Co-authored-by: iuyi<202313350054@nuist.edu.cn> # message auto-generated for no-merge-commit merge: !328 merge feat/geam into master feat(arch35): 新增 geam 算子,包含 aclblasSgeam 和 aclblasCgeam 接口 Created-by: iuyi Commit-by: iuyi Merged-by: cann-robot Description: ## 描述 GEAM(General Matrix Add)执行带标量缩放的矩阵加法运算,支持对输入矩阵 A、B 分别施加可选的转置(Transpose)或共轭转置(ConjTrans)操作。数学定义为: txt C[i, j] = alpha * op(A)[i, j] + beta * op(B)[i, j], i ∈ [0, m), j ∈ [0, n) 其中 op(X) 根据转置参数取 X(NoTrans)、X^T(Trans)或 X^H(ConjTrans,仅复杂数有意义,浮点数等价于 Trans)。矩阵采用列主序(Column-Major)存储,X[i, j] 的物理地址为 X[i + j * ldX]。 本算子提供两个接口:aclblasSgeam(单精度浮点 float)与 aclblasCgeam(单精度复数 aclblasComplex),覆盖实数与复数两类矩阵加法场景。 ## 关联的Issue <!-- 如果这个PR是为了解决特定的Issue,请在这里提供Issue链接。例如:关联Issue #000--> ## 测试 test/geam/ 下测试全部通过 ## 文档更新 blas/geam/README.md ## 类型标签 <!-- [x] 表示选中 --> - [ ] Bug修复 - [x] 新特性 - [ ] 性能优化 - [x] 文档更新 - [ ] 其他,请描述: See merge request: cann/ops-blas!328 | 28 天前 | |
Fix: Handle 类型由 void* 改为前向声明结构体指针风格,对齐 cuBLAS/ROCm Co-authored-by: Zitao Wang<wangzitao4@huawei.com> # message auto-generated for no-merge-commit merge: !277 merge issue_110_258 into master Fix: Handle 类型由 void* 改为前向声明结构体指针风格,对齐 cuBLAS/ROCm Created-by: wangzitao_leo Commit-by: Zitao Wang Merged-by: cann-robot Description: ## 描述 将 aclblasHandle_t 和 aclblasLtHandle_t 从 void* 改为前向声明结构体指针(typedef struct _aclblas_handle* aclblasHandle_t),对齐 cuBLAS/ROCm 主流标准,获得编译期类型校验。Descriptor 类型此前已完成结构体指针化改造,本次仅涉及 Handle。清理了所有冗余的 reinterpret_cast 和 trivial 辅助函数。 ### 改动范围 **核心改动(2 个公开头文件):** - include/cann_ops_blas.h:typedef void* aclblasHandle_t → typedef struct _aclblas_handle* aclblasHandle_t - include/cann_ops_blasLt.h:typedef void* aclblasLtHandle_t → typedef struct aclblasLtHandle* aclblasLtHandle_t **清理改动(90 个文件):** - 删除 3 个 trivial 辅助函数(ToInternalHandle、ToInternal x2) - 移除 92 处 reinterpret_cast<_aclblas_handle*>(handle) → 直接用 handle - 移除 3 处 reinterpret_cast<aclblasLtHandle*>(lightHandle) → 直接用 lightHandle - 移除 2 处反向 cast(reinterpret_cast<void*>(h) / reinterpret_cast<aclblasLtHandle_t>(h))→ 直接赋值 - 更新 1 处过时注释 ### ABI 兼容性 指针的二进制表示不变,无 ABI 破坏。 ## 关联的Issue [#110](https://gitcode.com/cann/ops-blas/issues/110) ## 测试 所有 host 侧目标文件(80+ 算子 host、aclblas_auxiliary、blasLt API)零错误编译通过;grep 确认零遗留 reinterpret_cast 和 ToInternalHandle/ToInternal;ABI 无破坏(指针二进制表示不变)。 ## 文档更新 无需文档更新,API 签名不变。 ## 类型标签 - [x] Bug修复 - [ ] 新特性 - [ ] 性能优化 - [ ] 文档更新 - [ ] 其他,请描述: See merge request: cann/ops-blas!277 | 1 个月前 | |
fix(trsm,gemm): 为 strsm_blocked_kernel 和 gemm 添加 CANN-9.0.0 版本守卫 Co-authored-by: LambdaMiX<202400800552@mail.sdu.edu.cn> # message auto-generated for no-merge-commit merge: !319 merge fix/trsm-cann90-compat into master fix(trsm,gemm): 为 strsm_blocked_kernel 和 gemm 添加 CANN-9.0.0 版本守卫 Created-by: LambdaMiX Commit-by: LambdaMiX Merged-by: cann-robot Description: ## 描述 <!--在这里详细描述你的改动,包括改动的原因和所采取的方法。--> ### 问题描述 master 分支在 CANN-9.0.0 社区版下编译 Ascend950 算子失败(issue #313)。 根因: blas/trsm/arch35/strsm_blocked_kernel.cpp 的 GEMM kernel 部分依赖 tensor_api(ops-tensor 仓库),其底层调用的三个 intrinsic(asc_get_phy_buf_addr / asc_get_vf_len / asc_set_l0c2gm_channel_para)在 CANN-9.0.0 的 sys_var.h 中尚不存在(9.0.0 未引入 #elif __NPU_ARCH__ == 3510 块,9.1.0 才新增)。 同时发现 blas/gemm/arch35/gemm_kernel.cpp(commit 775719b 新增)存在相同问题,且两者均未纳入已有的版本守卫机制。 ### 修改内容 采用与 trmm / syrk / syr2k 等已有算子一致的版本守卫模式(devkit >= 9.1 编译,低版本跳过),共 5 文件 +46/-4 行,不修改任何算子逻辑: | 文件 | 改动 | |------|------| | cmake/asc_devkit_version.cmake | 新增 ENABLE_BLAS_TRSM_BLOCKED + ENABLE_BLAS_GEMM 变量 | | blas/CMakeLists.txt | devkit < 9.1 时排除 strsm_blocked_kernel + /gemm/arch35/ | | blas/trsm/arch35/strsm_host.cpp | #if 条件编译,低版本 LEFT 路径 fallback 到 SIMT | | blas/gemm/arch35/gemm_host.cpp | 低版本整体跳过(gemm 为新增算子,9.0.0 原不含) | | cmake/test.cmake | 低版本跳过 gemm 测试注册 | **strsm 低版本行为**:strsm_kernel.cpp(SIMT path)不依赖 tensor_api,低版本下功能完整,LEFT 路径全部 fallback 到 SIMT,仅大矩阵性能有所降低。 **gemm 低版本行为**:gemm 为 issue #313 之后新增算子,9.0.0 社区版原不含此算子,低版本下整体跳过,与 trmm/syrk 等已有守卫算子处理方式一致。 ## 关联的Issue <!-- 如果这个PR是为了解决特定的Issue,请在这里提供Issue链接。例如:关联Issue #000--> [#313](https://gitcode.com/cann/ops-blas/issues/313) ## 测试 <!--描述进行了哪些测试来验证你的改动。--> 在真实 CANN-9.0.0 社区版和 CANN-9.1.0-beta.1 双环境下验证: | 验证项 | CANN-9.0.0 | CANN-9.1.0 | |--------|:----------:|:----------:| | 编译 | ✅ 0 error(两文件正确跳过) | ✅ 0 error(全量编译) | | trsm 精度测试 | ✅ 119/119 PASS(SIMT path) | ✅ 119/119 PASS(含 blocked path) | 性能对比(blocked vs SIMT,chrono 精确计时,3 预热 + 7 次取中位数): - 大方阵(512×512 ~ 1024×1024):9.1.0 blocked 比 9.0.0 SIMT 快 2.2~5.1x - 小矩阵 / RIGHT 路径:无差异(同走 SIMT) - 9.0.0 下大矩阵性能退化 2~5 倍,功能正确,升级 9.1.0 后恢复 ## 文档更新 <!--如果这个PR包含文档的更新,请在这里指出。例如:更新了README.md文件。--> ## 类型标签 <!-- [x] 表示选中 --> - [x] Bug修复 - [ ] 新特性 - [ ] 性能优化 - [ ] 文档更新 - [ ] 其他,请描述: See merge request: cann/ops-blas!319 | 1 个月前 | |
Feat: 新增面向arch35的aclblasgemm3m接口 Co-authored-by: ykxxlzhong<luzhihong3@hisilicon.com> # message auto-generated for no-merge-commit merge: !284 merge shift into master Feat: 新增面向arch35的aclblasgemm3m接口 Created-by: ykxxlzhong Commit-by: ykxxlzhong Merged-by: cann-robot Description: ## 描述 新增面向 arch35(Ascend 950)的 aclblasSgemm3m 接口实现。 GEMM3M 运算:C = alpha * (A1*B1 + A2*B2 + A3*B3) + beta * C(列主序,FP32),其中 A 沿 K 维合并 3 个子矩阵(A1/A2/A3),B 同理。 ### 实现架构 - **Cube Kernel(AIC, tensor_api)**:三重 GEMM + L0C 累加 - L1 双缓冲 + L0A/L0B ping-pong 两级流水线 - 支持 NN/NT/TN/TT 四种转置组合(模板特化 + 运行时分发) - K-L1 外层循环 × K-L0 内层循环 × 3 对子矩阵 Mmad 累加 - **Alpha/Beta Kernel(AIV, SIMD)**:后处理 C = alpha*temp + beta*C - DataCopyPad 搬运,支持非对齐尾块 - 4 队列流水线(tempQue / cOrigQue / calcQue / outQue) ### 安全编码改进 本次提交在代码检视后修复了以下问题: - 有符号整数溢出防护:3*k、CeilDiv 加法、2*k 指针偏移统一使用 int64_t/uint64_t 中间运算 - DataCopy 改为 DataCopyPad:AIV kernel 尾块非 32B 对齐时数据丢失修复 - reinterpret_cast 改为 static_cast:同类型转换和 void* 转换规范化 - const 正确性:只读 handle 指针参数加 const 修饰 - 魔鬼数字消除:tile 尺寸和矩阵对数使用命名常量(GEMM3M_BASE_M/N/K、GEMM3M_NUM_PAIRS) - AIV 搬运量优化:AB_TILE_SIZE 从 256(1KB)提升至 4096(16KB) ## 关联的Issue 无 ## 测试 - 编译平台:Ascend 950(arch35, DAV_3510),CANN 9.1.0 - 测试用例:76 个(L0 基础 33 + L1 扩展 42 + NullHandle 1),全部通过 - 覆盖场景: - 4 种转置组合(NN/NT/TN/TT) - 多种 shape(16x16 到 4096x4096,含非对齐 17x19x23) - alpha/beta 边界(alpha=0 跳过 matmul、beta=0 清零、k=0 标量缩放) - 参数校验(handle/transA/transB/m/n/k/lda/ldb/ldc/指针空值) - 精度验证:混合容差(rtol=2^-10, atol=2^-16, matchedRatio>=0.99) ## 文档更新 - 新增 blas/gemm3m/README.md:算子接口说明、参数定义、使用示例 ## 类型标签 - [x] 新特性 See merge request: cann/ops-blas!284 | 1 个月前 | |
Feat: gemm batched with tensor api Co-authored-by: wang-zhiyue2<wangzhiyue2@huawei.com> # message auto-generated for no-merge-commit merge: !269 merge gemm_batched into master Feat: gemm batched with tensor api Created-by: wang-zhiyue2 Commit-by: wang-zhiyue2 Merged-by: cann-robot Description: ## 描述 添加gemm batched算子 ## 关联的Issue ## 测试 sgemm_batched共测试157个用例,1个硬编码用例,156个csv用例,157/157已全部通过。  cgemm_batched共测试166个用例,1个硬编码用例,165个csv用例,166/166已全部通过。  ## 文档更新 添加gemm batched的README.md ## 类型标签 <!-- [x] 表示选中 --> - [ ] Bug修复 - [x] 新特性 - [ ] 性能优化 - [ ] 文档更新 - [ ] 其他,请描述: See merge request: cann/ops-blas!269 | 1 个月前 | |
Fix: Handle 类型由 void* 改为前向声明结构体指针风格,对齐 cuBLAS/ROCm Co-authored-by: Zitao Wang<wangzitao4@huawei.com> # message auto-generated for no-merge-commit merge: !277 merge issue_110_258 into master Fix: Handle 类型由 void* 改为前向声明结构体指针风格,对齐 cuBLAS/ROCm Created-by: wangzitao_leo Commit-by: Zitao Wang Merged-by: cann-robot Description: ## 描述 将 aclblasHandle_t 和 aclblasLtHandle_t 从 void* 改为前向声明结构体指针(typedef struct _aclblas_handle* aclblasHandle_t),对齐 cuBLAS/ROCm 主流标准,获得编译期类型校验。Descriptor 类型此前已完成结构体指针化改造,本次仅涉及 Handle。清理了所有冗余的 reinterpret_cast 和 trivial 辅助函数。 ### 改动范围 **核心改动(2 个公开头文件):** - include/cann_ops_blas.h:typedef void* aclblasHandle_t → typedef struct _aclblas_handle* aclblasHandle_t - include/cann_ops_blasLt.h:typedef void* aclblasLtHandle_t → typedef struct aclblasLtHandle* aclblasLtHandle_t **清理改动(90 个文件):** - 删除 3 个 trivial 辅助函数(ToInternalHandle、ToInternal x2) - 移除 92 处 reinterpret_cast<_aclblas_handle*>(handle) → 直接用 handle - 移除 3 处 reinterpret_cast<aclblasLtHandle*>(lightHandle) → 直接用 lightHandle - 移除 2 处反向 cast(reinterpret_cast<void*>(h) / reinterpret_cast<aclblasLtHandle_t>(h))→ 直接赋值 - 更新 1 处过时注释 ### ABI 兼容性 指针的二进制表示不变,无 ABI 破坏。 ## 关联的Issue [#110](https://gitcode.com/cann/ops-blas/issues/110) ## 测试 所有 host 侧目标文件(80+ 算子 host、aclblas_auxiliary、blasLt API)零错误编译通过;grep 确认零遗留 reinterpret_cast 和 ToInternalHandle/ToInternal;ABI 无破坏(指针二进制表示不变)。 ## 文档更新 无需文档更新,API 签名不变。 ## 类型标签 - [x] Bug修复 - [ ] 新特性 - [ ] 性能优化 - [ ] 文档更新 - [ ] 其他,请描述: See merge request: cann/ops-blas!277 | 1 个月前 | |
fix(gemm):新增 gemm 实现并更新精度标准为MIXED_TOLERANCE Co-authored-by: OpenCode<opencode@ops-blas.local> Co-authored-by: 2301_78862378<242060376@hdu.edu.cn> # message auto-generated for no-merge-commit merge: !292 merge pr_229 into master fix(gemm):新增 gemm 实现并更新精度标准为MIXED_TOLERANCE Created-by: 2301_78862378 Commit-by: 2301_78862378;OpenCode Merged-by: cann-robot Description: ## 描述 基于 PR #229 的 gemm 算子实现,修复 PR #229 的问题并更新测试精度标准为 MIXED_TOLERANCE。 ### 目录重构 将原 blas/gemm/ 下的 gemm_ex 相关文件移动到 blas/gemm_ex/,为后续 gemm 算子腾出目录 ### 新增算子实现 - **aclblasSgemm**:FP32 通用矩阵乘法,Cube kernel 使用 Blaze tensor_api 路径(GM→L1→L0→Mmad→L0C→GM),通过列主序交换(col-major swap)适配 BLAS 列主序语义 - **aclblasCgemm**:Complex32 通用矩阵乘法,分解为 4 个实数矩阵乘法(Re/Im 组合),参数类型使用 aclblasComplex* - 完整的 Validate + Launch 架构分离 - 参数校验:handle/trans/dimensions/lda/ldb/ldc/alpha/beta/A/B/C 全覆盖 - dlog 集成:OP_LOGE/OP_LOGD/OP_LOGI 分级日志 - Workspace 管理:使用 aclblasGetEffectiveWorkspace ### Cube kernel tensor_api 重构 - GM→L1: DataCopy+Nd2NzParams → Copy(CopyGM2L1{}) - L1→L0A/B: LoadData+LoadData2DParamsV2 → Copy(CopyL12L0A/B{}) - Mmad: Mmad+MmadParams → Mmad(MmadAtom{}.with(params)) - L0C→GM: Fixpipe+FixpipeParamsArch3510 → CopyL0C2GM{}.Call() - 转置: ifTranspose → GM layout NDExt/DNExt 自动派发 - GM tensor 构造使用 MakeFrameLayout,将 leadingDim 作为 shape 维度传入,解决 BLAS 列主序 lda≠K 场景 ### 非对齐大矩阵修复 - Fixpipe N 尾块 nSize 按 16 对齐(对齐 sgemm_ex) - tempAB 中间结果 ldc 按 16 对齐(CeilAlign),新增 cLdc 字段 - Vector kernel DataCopy → DataCopyPad(支持非 32 字节对齐搬运) ### 编译错误修复 - 修复函数名错误:aclblasCheckEffectiveWorkspaceSize → CheckEffectiveWorkspaceSize - 修复函数名错误:aclblasGetEffectiveWorkspace → GetEffectiveWorkspace - 修复 aclblasSgemm/aclblasCgemm 缺少 extern C 导致符号 mangled,链接失败 ### 代码规范修复 - 删除死代码:DeinterleaveKernel/ComplexAlphaBetaKernel 及对应 launcher(无调用点,~400行) - 移除 gemm_tiling_data.h 中未使用的 GemmDTypeCase 枚举(与 gemm_ex ODR 冲突) - 删除 gemm_golden.h 冗余 include - 删除 gemm_test.cpp 冗余 include - 修复 golden 错误码:ACLBLAS_STATUS_NOT_INITIALIZED → ACLBLAS_STATUS_HANDLE_IS_NULLPTR ### 功能修复 - 修复 Cube 核使用 GetAivCoreCount → GetAicCoreCount(Sgemm + Cgemm) - 修复 ValidateGemmPointers:k>0 且 C==nullptr 时应拒绝而非放行 - 补充 alpha==0 快速返回路径(对齐 BLAS 标准) ### 精度验证修复 - 精度验证从 MERE_MARE 切换为 MIXED_TOLERANCE(对齐生态算子开源精度标准) - 修复 Complex GEMM 精度验证忽略虚部 - alpha==0 时测试使用 EXACT 位精确校验 ## 关联的Issue 无 ## 测试 - FP32 GEMM:NN/NT/TN/TT/CN 转置、16~512 维度、alpha/beta 组合、m/n/k=0 边界、全参数异常校验 - Complex32 GEMM:NN/NT/TN/TT/CN/CC 转置、复数 alpha/beta、m/n/k=0 边界、异常校验 - 非对齐大矩阵(sgemm):S_L0_15(NN, 693×693×693)、S_L0_16(TN, 693×521×377,lda≠K 非方阵场景) - 非对齐大矩阵(cgemm):C_L0_14(NN, 693×521×377)、C_L0_15(TN, 693×521×377, 复数 alpha) - 52 个测试全部 PASSED(ascend950/arch35) ## 文档更新 - 新增 blas/gemm/README.md:接口说明、参数表、约束条件、调用示例、编译命令 - 更新 README.md、CONTRIBUTING.md、docs/zh/api_list.md 中的路径引用(gemm → gemm_ex) - README 补充约束说明和精度验证章节 ## 类型标签 <!-- [x] 表示选中 --> - [x] Bug修复 - [ ] 新特性 - [ ] 性能优化 - [x] 文档更新 - [ ] 其他,请描述: See merge request: cann/ops-blas!292 | 1 个月前 | |
Fix: Handle 类型由 void* 改为前向声明结构体指针风格,对齐 cuBLAS/ROCm Co-authored-by: Zitao Wang<wangzitao4@huawei.com> # message auto-generated for no-merge-commit merge: !277 merge issue_110_258 into master Fix: Handle 类型由 void* 改为前向声明结构体指针风格,对齐 cuBLAS/ROCm Created-by: wangzitao_leo Commit-by: Zitao Wang Merged-by: cann-robot Description: ## 描述 将 aclblasHandle_t 和 aclblasLtHandle_t 从 void* 改为前向声明结构体指针(typedef struct _aclblas_handle* aclblasHandle_t),对齐 cuBLAS/ROCm 主流标准,获得编译期类型校验。Descriptor 类型此前已完成结构体指针化改造,本次仅涉及 Handle。清理了所有冗余的 reinterpret_cast 和 trivial 辅助函数。 ### 改动范围 **核心改动(2 个公开头文件):** - include/cann_ops_blas.h:typedef void* aclblasHandle_t → typedef struct _aclblas_handle* aclblasHandle_t - include/cann_ops_blasLt.h:typedef void* aclblasLtHandle_t → typedef struct aclblasLtHandle* aclblasLtHandle_t **清理改动(90 个文件):** - 删除 3 个 trivial 辅助函数(ToInternalHandle、ToInternal x2) - 移除 92 处 reinterpret_cast<_aclblas_handle*>(handle) → 直接用 handle - 移除 3 处 reinterpret_cast<aclblasLtHandle*>(lightHandle) → 直接用 lightHandle - 移除 2 处反向 cast(reinterpret_cast<void*>(h) / reinterpret_cast<aclblasLtHandle_t>(h))→ 直接赋值 - 更新 1 处过时注释 ### ABI 兼容性 指针的二进制表示不变,无 ABI 破坏。 ## 关联的Issue [#110](https://gitcode.com/cann/ops-blas/issues/110) ## 测试 所有 host 侧目标文件(80+ 算子 host、aclblas_auxiliary、blasLt API)零错误编译通过;grep 确认零遗留 reinterpret_cast 和 ToInternalHandle/ToInternal;ABI 无破坏(指针二进制表示不变)。 ## 文档更新 无需文档更新,API 签名不变。 ## 类型标签 - [x] Bug修复 - [ ] 新特性 - [ ] 性能优化 - [ ] 文档更新 - [ ] 其他,请描述: See merge request: cann/ops-blas!277 | 1 个月前 | |
Fix: Handle 类型由 void* 改为前向声明结构体指针风格,对齐 cuBLAS/ROCm Co-authored-by: Zitao Wang<wangzitao4@huawei.com> # message auto-generated for no-merge-commit merge: !277 merge issue_110_258 into master Fix: Handle 类型由 void* 改为前向声明结构体指针风格,对齐 cuBLAS/ROCm Created-by: wangzitao_leo Commit-by: Zitao Wang Merged-by: cann-robot Description: ## 描述 将 aclblasHandle_t 和 aclblasLtHandle_t 从 void* 改为前向声明结构体指针(typedef struct _aclblas_handle* aclblasHandle_t),对齐 cuBLAS/ROCm 主流标准,获得编译期类型校验。Descriptor 类型此前已完成结构体指针化改造,本次仅涉及 Handle。清理了所有冗余的 reinterpret_cast 和 trivial 辅助函数。 ### 改动范围 **核心改动(2 个公开头文件):** - include/cann_ops_blas.h:typedef void* aclblasHandle_t → typedef struct _aclblas_handle* aclblasHandle_t - include/cann_ops_blasLt.h:typedef void* aclblasLtHandle_t → typedef struct aclblasLtHandle* aclblasLtHandle_t **清理改动(90 个文件):** - 删除 3 个 trivial 辅助函数(ToInternalHandle、ToInternal x2) - 移除 92 处 reinterpret_cast<_aclblas_handle*>(handle) → 直接用 handle - 移除 3 处 reinterpret_cast<aclblasLtHandle*>(lightHandle) → 直接用 lightHandle - 移除 2 处反向 cast(reinterpret_cast<void*>(h) / reinterpret_cast<aclblasLtHandle_t>(h))→ 直接赋值 - 更新 1 处过时注释 ### ABI 兼容性 指针的二进制表示不变,无 ABI 破坏。 ## 关联的Issue [#110](https://gitcode.com/cann/ops-blas/issues/110) ## 测试 所有 host 侧目标文件(80+ 算子 host、aclblas_auxiliary、blasLt API)零错误编译通过;grep 确认零遗留 reinterpret_cast 和 ToInternalHandle/ToInternal;ABI 无破坏(指针二进制表示不变)。 ## 文档更新 无需文档更新,API 签名不变。 ## 类型标签 - [x] Bug修复 - [ ] 新特性 - [ ] 性能优化 - [ ] 文档更新 - [ ] 其他,请描述: See merge request: cann/ops-blas!277 | 1 个月前 | |
Feat: 新增面向arch35的aclblasSgemmStridedBatched接口 Co-authored-by: mazihan<mazihan1@huawei.com> # message auto-generated for no-merge-commit merge: !297 merge aclblasSgemmStridedBatched into master Feat: 新增面向arch35的aclblasSgemmStridedBatched接口 Created-by: zihan0007 Commit-by: mazihan Merged-by: cann-robot Description: ## 描述 本 PR 新增面向 arch35(Ascend 950 / DAV_3510)的 aclblasSgemmStridedBatched 算子实现,为 Strided Batched GEMM(批处理矩阵乘)接口,属 BLAS Level 3。 ### 算子功能 对 batchCount 个规格一致(m/n/k/transA/transB 相同)的 FP32 矩阵乘执行批量计算: C_i = alpha * op(A_i) * op(B_i) + beta * C_i, i = 0, 1, ..., batchCount-1 - 所有矩阵按列主序(Column-Major)存储,支持 transA/transB 四组合(NN/NT/TN/TT)。 - 支持 strideA/strideB=0 广播语义(跨 batch 复用同一矩阵)。 - 支持 alpha/beta 标量缩放、k=0/alpha=0 仅缩放快捷路径。 ### 目标芯片与数据类型 | 项目 | 内容 | |------|------| | 目标芯片 | Ascend 950(Ascend 950PR / Ascend 950DT) | | 目标架构 | arch35(DAV_3510) | | 数据类型 | FP32(A / B / C 均为 float) | ### 实现方法 - **编程模型**:Blaze tensor_api(AscendC::Te CopyAtom/MmadAtom),GEMM 数据搬运与矩阵乘全部由 tensor_api 实现。 - **模板选型**:纯AIC 基线(GM→L1→L0→MMAD→L0C→Fixpipe→GM),fast path Fixpipe 直写 C_i,general path 两段式(GEMM 写 temp + 独立 SIMD-membase combine kernel 融合 alpha/beta)。 - **Tiling 策略**:batch 串行(Host 循环)+ 单 batch 内 serpentine 二维 M/N tile 切核(128×128),L1/L0 ping-pong 双缓冲,K-chunk 累加。 - **列主序处理**:swap 技巧(计算 C^T = op(B)^T op(A)^T),NDExt/DNExt layout pattern 按 trans 分发,硬件自动 ND→NZ/ZN 格式转换。 - **workspace**:由 handle 统一管理,峰值 n * CeilAlign(m, 8) * 4 字节,逐 batch 复用,禁止 aclrtMalloc。 ### 交付物清单 | 类别 | 文件 | |------|------| | 算子代码 | blas/gemm_strided_batched/arch35/gemm_strided_batched_host.cpp、gemm_strided_batched_kernel.cpp、gemm_strided_batched_kernel.h、gemm_strided_batched_tiling_data.h | | 构建配置 | blas/gemm_strided_batched/CMakeLists.txt | | 接口声明 | include/cann_ops_blas.h(新增 aclblasSgemmStridedBatched 原型) | | 测试代码 | test/gemm_strided_batched/(CMakeLists.txt、golden.h、param.h、arch35/npu_wrapper.h、test.cpp、test.csv) | | 框架增强 | test/frame/types.h、test/frame/verify.h、test/frame/fill.h(atolFloor 通用框架增强,向后兼容) | | 文档 | blas/gemm_strided_batched/README.md | 变更统计:15 个文件,+1842 行。 ## 关联的Issue https://gitcode.com/zihan0007/ops-blas/issues/1 ## 测试 ### 精度测试(ST) - **测试环境**:Ascend 950(arch35 / DAV_3510),CANN 9.1.0,devkit 9.1,device=0 上板实测。 - **全量通过率**:**67/67(100%)** - L0 用例:21/21 通过(含四转置 NN/NT/TN/TT + m≠n general、fast-path ldc%8!=0 退化、大 shape 2048/4096 实跑、stride 广播、异常错误码矩阵) - L1 用例:45/45 通过 + 1 NullHandle fixture - 大 shape(2048³/4096³)全部实跑无跳过 - **精度标准**:FP32 浮点计算类社区标准 - MERE(平均相对误差)≤ 2^-13 ≈ 1.221e-4 - MARE(最大相对误差)≤ 10 × 2^-13 ≈ 1.221e-3 - 近零抵消元素通过 atol_floor=2^-13 钳位豁免 - **守护用例全覆盖通过**:m≠n general(HIGH-1 temp stride)、四转置组合、fast-path ldc 非对齐退化、大 shape、双广播 strideA0+strideB0、ldc>m 逐列 memset、异常错误码矩阵。 ### 性能测试 - **Cube 利用率**:99.4%(中大 shape 场景,msprof op 实测) - **编程模型验证**:Blaze tensor_api 实现确认到位,零低阶残留(无 LoadData/Mmad/Fixpipe 低阶手写)。 ### 代码检视 - 3.1 代码检视通过(0 HIGH / 0 阻塞),编程模型确认到位。 ## 文档更新 - 新增 blas/gemm_strided_batched/README.md:算子功能说明、接口签名、参数约束、精度标准、支持的芯片架构。 ## 类型标签 - [ ] Bug修复 - [x] 新特性 - [ ] 性能优化 - [ ] 文档更新 - [ ] 其他,请描述: See merge request: cann/ops-blas!297 | 1 个月前 | |
fix(complex): 统一复数 BLAS 算子接口对齐 BLAS 标准(issues #61-#75) Co-authored-by: 2301_82146483<2556943601@qq.com> # message auto-generated for no-merge-commit merge: !316 merge fix/complex-blas-interface-alignment into master fix(complex): 统一复数 BLAS 算子接口对齐 BLAS 标准(issues #61-#75) Created-by: 2301_82146483 Commit-by: 2301_82146483 Merged-by: cann-robot Description: ## 关联 Issues Closes #61, #62, #63, #64, #65, #66, #67, #68, #69, #70, #71, #72, #75 ## 背景 仓库中复数 BLAS 算子接口以及少数实数BLAS算子接口与标准BLAS算子存在三类风格差异: 1. 维度参数使用 int64_t 而非 int 2. 标量 alpha/beta/c/s 按值传递而非指针传递 3. 只读输入指针缺少 const 修饰 此外 aclblasCcopy 参数顺序为 (x, y, n, incx, incy),与 BLAS 标准和同库 aclblasScopy 的 (n, x, incx, y, incy) 不一致。 ## 本次 PR 内容 ### 三类风格统一 将 15 个算子的接口签名对齐到与标准浮点算子一致: | 改动类型 | 说明 | |---|---| | int64_t → int | n/m/incx/incy/lda/batchCount 等维度参数统一为 int | | 按值 → 指针 | const aclblasComplex alpha → const aclblasComplex* alpha;const float c, const float s → const float* c, const float* s | | 补 const | 只读输入指针 x/y/A 添加 const 修饰 | | 空指针检查 | 所有指针传递的标量参数(alpha/beta/c/s)在函数体开头添加 nullptr 检查 | | 溢出防护 | n * 2 表达式在乘法前加 static_cast 避免 int 溢出 | ### Ccopy 参数顺序修正 aclblasCcopy 参数顺序从 (handle, x, y, n, incx, incy) 修正为 (handle, n, x, incx, y, incy),与 BLAS 标准一致。 ### 涉及算子清单(15 个) | Issue | 算子 | 改动要点 | |---|---|---| | #61 | aclblasCaxpy | int64_t→int + alpha→指针 + const(x) + nullptr check | | #62 | aclblasCcopy | 参数顺序修正 + int64_t→int + const(x) | | #63 | aclblasCdotc | int64_t→int | | #64 | aclblasCdotu | int64_t→int | | #65 | aclblasCgemvBatched | int64_t→int + alpha/beta→指针 + const(A,x) + nullptr check | | #66 | aclblasCgemv | int64_t→int + alpha/beta→指针 + const(A,x) + nullptr check | | #67 | aclblasCgerc | int64_t→int + alpha→指针 + const(x,y) + nullptr check | | #68 | aclblasCscal | int64_t→int + alpha→指针 + nullptr check | | #69 | aclblasCsrot | int64_t→int + c/s→指针 + nullptr check | | #70 | aclblasCsscal | int64_t→int + alpha→指针 + nullptr check + 溢出防护 | | #71 | aclblasCswap | int64_t→int | | #72 | aclblasCtrmv | int64_t→int + const(A) | | #75 | aclblasScnrm2 | int64_t→int + const(x) + 溢出防护 | | — | aclblasSdot | int64_t→int(风格统一) | | — | aclblasSsymm | int64_t→int(风格统一) | ### 实现策略 - Host 实现内部通过 const_cast 桥接到 kernel_do 函数(接受 uint8_t*),**Kernel 二进制不变** - alpha/beta 解引用:alpha.real → alpha->real - 测试调用点:alpha → &alpha,局部变量 int64_t → int ## 测试结果 远端 Ascend 910B3(arch22)环境构建与测试(15 个算子全部通过): | 测试 | 结果 | |------|------| | caxpy | PASS | | cscal | PASS | | sscal | PASS | | csrot | PASS | | cswap | PASS | | cdot | PASS | | scopy | PASS | | snrm2 | PASS | | cgemv | PASS | | cgerc | PASS | | ctrmv | PASS | | cgemv_batched | PASS | | sdot | PASS | | ssymm | PASS | See merge request: cann/ops-blas!316 | 1 个月前 | |
fix(complex): 统一复数 BLAS 算子接口对齐 BLAS 标准(issues #61-#75) Co-authored-by: 2301_82146483<2556943601@qq.com> # message auto-generated for no-merge-commit merge: !316 merge fix/complex-blas-interface-alignment into master fix(complex): 统一复数 BLAS 算子接口对齐 BLAS 标准(issues #61-#75) Created-by: 2301_82146483 Commit-by: 2301_82146483 Merged-by: cann-robot Description: ## 关联 Issues Closes #61, #62, #63, #64, #65, #66, #67, #68, #69, #70, #71, #72, #75 ## 背景 仓库中复数 BLAS 算子接口以及少数实数BLAS算子接口与标准BLAS算子存在三类风格差异: 1. 维度参数使用 int64_t 而非 int 2. 标量 alpha/beta/c/s 按值传递而非指针传递 3. 只读输入指针缺少 const 修饰 此外 aclblasCcopy 参数顺序为 (x, y, n, incx, incy),与 BLAS 标准和同库 aclblasScopy 的 (n, x, incx, y, incy) 不一致。 ## 本次 PR 内容 ### 三类风格统一 将 15 个算子的接口签名对齐到与标准浮点算子一致: | 改动类型 | 说明 | |---|---| | int64_t → int | n/m/incx/incy/lda/batchCount 等维度参数统一为 int | | 按值 → 指针 | const aclblasComplex alpha → const aclblasComplex* alpha;const float c, const float s → const float* c, const float* s | | 补 const | 只读输入指针 x/y/A 添加 const 修饰 | | 空指针检查 | 所有指针传递的标量参数(alpha/beta/c/s)在函数体开头添加 nullptr 检查 | | 溢出防护 | n * 2 表达式在乘法前加 static_cast 避免 int 溢出 | ### Ccopy 参数顺序修正 aclblasCcopy 参数顺序从 (handle, x, y, n, incx, incy) 修正为 (handle, n, x, incx, y, incy),与 BLAS 标准一致。 ### 涉及算子清单(15 个) | Issue | 算子 | 改动要点 | |---|---|---| | #61 | aclblasCaxpy | int64_t→int + alpha→指针 + const(x) + nullptr check | | #62 | aclblasCcopy | 参数顺序修正 + int64_t→int + const(x) | | #63 | aclblasCdotc | int64_t→int | | #64 | aclblasCdotu | int64_t→int | | #65 | aclblasCgemvBatched | int64_t→int + alpha/beta→指针 + const(A,x) + nullptr check | | #66 | aclblasCgemv | int64_t→int + alpha/beta→指针 + const(A,x) + nullptr check | | #67 | aclblasCgerc | int64_t→int + alpha→指针 + const(x,y) + nullptr check | | #68 | aclblasCscal | int64_t→int + alpha→指针 + nullptr check | | #69 | aclblasCsrot | int64_t→int + c/s→指针 + nullptr check | | #70 | aclblasCsscal | int64_t→int + alpha→指针 + nullptr check + 溢出防护 | | #71 | aclblasCswap | int64_t→int | | #72 | aclblasCtrmv | int64_t→int + const(A) | | #75 | aclblasScnrm2 | int64_t→int + const(x) + 溢出防护 | | — | aclblasSdot | int64_t→int(风格统一) | | — | aclblasSsymm | int64_t→int(风格统一) | ### 实现策略 - Host 实现内部通过 const_cast 桥接到 kernel_do 函数(接受 uint8_t*),**Kernel 二进制不变** - alpha/beta 解引用:alpha.real → alpha->real - 测试调用点:alpha → &alpha,局部变量 int64_t → int ## 测试结果 远端 Ascend 910B3(arch22)环境构建与测试(15 个算子全部通过): | 测试 | 结果 | |------|------| | caxpy | PASS | | cscal | PASS | | sscal | PASS | | csrot | PASS | | cswap | PASS | | cdot | PASS | | scopy | PASS | | snrm2 | PASS | | cgemv | PASS | | cgerc | PASS | | ctrmv | PASS | | cgemv_batched | PASS | | sdot | PASS | | ssymm | PASS | See merge request: cann/ops-blas!316 | 1 个月前 | |
fix(gemv_strided_batched): 修复 UB buffer 越界并补齐 README 调用示例 Co-authored-by: yuyuanfeng<yuyuanfeng1@huawei.com> # message auto-generated for no-merge-commit merge: !279 merge fix/gemv-strided-batched into master fix(gemv_strided_batched): 修复 UB buffer 越界并补齐 README 调用示例 Created-by: yuyuanfeng Commit-by: yuyuanfeng Merged-by: cann-robot Description: ## 描述 修复 gemv_strided_batched 算子(Ascend950 / arch35)非 FP32 半精度路径中 Cast 操作可能超出 UB buffer 分配容量的越界风险,并补齐 README 中缺失的 HSH/HSS/TST/TSS 接口完整调用示例。 ### 改动范围 **核心改动(1 个内核文件):** - blas/gemv_strided_batched/arch35/gemv_strided_batched_kernel.cpp - InitUbuf():补充 maxVecEleNum >= outTile 保护 - CastleYHalfToFloat():对 cnt 和 castCnt 增加 maxVecEleNum 上界 clamp - CastleHalfToFloat():对 matCastCnt 增加 maxMatEleNum 上界 clamp **文档改动(1 个 README 文件):** - blas/gemv_strided_batched/README.md:补齐 aclblasHSHgemvStridedBatched / aclblasHSSgemvStridedBatched / aclblasTSTgemvStridedBatched / aclblasTSSgemvStridedBatched 四个接口的完整可运行 C++ 调用示例,添加编译运行命令 ## 关联的Issue [#309](https://gitcode.com/cann/ops-blas/issues/309) ## 测试 - gemv_strided_batched_test:**118/118 PASSED**(FP32/FP16/BF16 × 5 种接口,覆盖大 shape/多核/负 stride/AIV-SIMT 边界) ## 文档更新 blas/gemv_strided_batched/README.md ## 类型标签 - [x] Bug修复 - [ ] 新特性 - [ ] 性能优化 - [x] 文档更新 - [ ] 其他,请描述: See merge request: cann/ops-blas!279 | 1 个月前 | |
Fix: Handle 类型由 void* 改为前向声明结构体指针风格,对齐 cuBLAS/ROCm Co-authored-by: Zitao Wang<wangzitao4@huawei.com> # message auto-generated for no-merge-commit merge: !277 merge issue_110_258 into master Fix: Handle 类型由 void* 改为前向声明结构体指针风格,对齐 cuBLAS/ROCm Created-by: wangzitao_leo Commit-by: Zitao Wang Merged-by: cann-robot Description: ## 描述 将 aclblasHandle_t 和 aclblasLtHandle_t 从 void* 改为前向声明结构体指针(typedef struct _aclblas_handle* aclblasHandle_t),对齐 cuBLAS/ROCm 主流标准,获得编译期类型校验。Descriptor 类型此前已完成结构体指针化改造,本次仅涉及 Handle。清理了所有冗余的 reinterpret_cast 和 trivial 辅助函数。 ### 改动范围 **核心改动(2 个公开头文件):** - include/cann_ops_blas.h:typedef void* aclblasHandle_t → typedef struct _aclblas_handle* aclblasHandle_t - include/cann_ops_blasLt.h:typedef void* aclblasLtHandle_t → typedef struct aclblasLtHandle* aclblasLtHandle_t **清理改动(90 个文件):** - 删除 3 个 trivial 辅助函数(ToInternalHandle、ToInternal x2) - 移除 92 处 reinterpret_cast<_aclblas_handle*>(handle) → 直接用 handle - 移除 3 处 reinterpret_cast<aclblasLtHandle*>(lightHandle) → 直接用 lightHandle - 移除 2 处反向 cast(reinterpret_cast<void*>(h) / reinterpret_cast<aclblasLtHandle_t>(h))→ 直接赋值 - 更新 1 处过时注释 ### ABI 兼容性 指针的二进制表示不变,无 ABI 破坏。 ## 关联的Issue [#110](https://gitcode.com/cann/ops-blas/issues/110) ## 测试 所有 host 侧目标文件(80+ 算子 host、aclblas_auxiliary、blasLt API)零错误编译通过;grep 确认零遗留 reinterpret_cast 和 ToInternalHandle/ToInternal;ABI 无破坏(指针二进制表示不变)。 ## 文档更新 无需文档更新,API 签名不变。 ## 类型标签 - [x] Bug修复 - [ ] 新特性 - [ ] 性能优化 - [ ] 文档更新 - [ ] 其他,请描述: See merge request: cann/ops-blas!277 | 1 个月前 | |
Fix: Handle 类型由 void* 改为前向声明结构体指针风格,对齐 cuBLAS/ROCm Co-authored-by: Zitao Wang<wangzitao4@huawei.com> # message auto-generated for no-merge-commit merge: !277 merge issue_110_258 into master Fix: Handle 类型由 void* 改为前向声明结构体指针风格,对齐 cuBLAS/ROCm Created-by: wangzitao_leo Commit-by: Zitao Wang Merged-by: cann-robot Description: ## 描述 将 aclblasHandle_t 和 aclblasLtHandle_t 从 void* 改为前向声明结构体指针(typedef struct _aclblas_handle* aclblasHandle_t),对齐 cuBLAS/ROCm 主流标准,获得编译期类型校验。Descriptor 类型此前已完成结构体指针化改造,本次仅涉及 Handle。清理了所有冗余的 reinterpret_cast 和 trivial 辅助函数。 ### 改动范围 **核心改动(2 个公开头文件):** - include/cann_ops_blas.h:typedef void* aclblasHandle_t → typedef struct _aclblas_handle* aclblasHandle_t - include/cann_ops_blasLt.h:typedef void* aclblasLtHandle_t → typedef struct aclblasLtHandle* aclblasLtHandle_t **清理改动(90 个文件):** - 删除 3 个 trivial 辅助函数(ToInternalHandle、ToInternal x2) - 移除 92 处 reinterpret_cast<_aclblas_handle*>(handle) → 直接用 handle - 移除 3 处 reinterpret_cast<aclblasLtHandle*>(lightHandle) → 直接用 lightHandle - 移除 2 处反向 cast(reinterpret_cast<void*>(h) / reinterpret_cast<aclblasLtHandle_t>(h))→ 直接赋值 - 更新 1 处过时注释 ### ABI 兼容性 指针的二进制表示不变,无 ABI 破坏。 ## 关联的Issue [#110](https://gitcode.com/cann/ops-blas/issues/110) ## 测试 所有 host 侧目标文件(80+ 算子 host、aclblas_auxiliary、blasLt API)零错误编译通过;grep 确认零遗留 reinterpret_cast 和 ToInternalHandle/ToInternal;ABI 无破坏(指针二进制表示不变)。 ## 文档更新 无需文档更新,API 签名不变。 ## 类型标签 - [x] Bug修复 - [ ] 新特性 - [ ] 性能优化 - [ ] 文档更新 - [ ] 其他,请描述: See merge request: cann/ops-blas!277 | 1 个月前 | |
fix(complex): 统一复数 BLAS 算子接口对齐 BLAS 标准(issues #61-#75) Co-authored-by: 2301_82146483<2556943601@qq.com> # message auto-generated for no-merge-commit merge: !316 merge fix/complex-blas-interface-alignment into master fix(complex): 统一复数 BLAS 算子接口对齐 BLAS 标准(issues #61-#75) Created-by: 2301_82146483 Commit-by: 2301_82146483 Merged-by: cann-robot Description: ## 关联 Issues Closes #61, #62, #63, #64, #65, #66, #67, #68, #69, #70, #71, #72, #75 ## 背景 仓库中复数 BLAS 算子接口以及少数实数BLAS算子接口与标准BLAS算子存在三类风格差异: 1. 维度参数使用 int64_t 而非 int 2. 标量 alpha/beta/c/s 按值传递而非指针传递 3. 只读输入指针缺少 const 修饰 此外 aclblasCcopy 参数顺序为 (x, y, n, incx, incy),与 BLAS 标准和同库 aclblasScopy 的 (n, x, incx, y, incy) 不一致。 ## 本次 PR 内容 ### 三类风格统一 将 15 个算子的接口签名对齐到与标准浮点算子一致: | 改动类型 | 说明 | |---|---| | int64_t → int | n/m/incx/incy/lda/batchCount 等维度参数统一为 int | | 按值 → 指针 | const aclblasComplex alpha → const aclblasComplex* alpha;const float c, const float s → const float* c, const float* s | | 补 const | 只读输入指针 x/y/A 添加 const 修饰 | | 空指针检查 | 所有指针传递的标量参数(alpha/beta/c/s)在函数体开头添加 nullptr 检查 | | 溢出防护 | n * 2 表达式在乘法前加 static_cast 避免 int 溢出 | ### Ccopy 参数顺序修正 aclblasCcopy 参数顺序从 (handle, x, y, n, incx, incy) 修正为 (handle, n, x, incx, y, incy),与 BLAS 标准一致。 ### 涉及算子清单(15 个) | Issue | 算子 | 改动要点 | |---|---|---| | #61 | aclblasCaxpy | int64_t→int + alpha→指针 + const(x) + nullptr check | | #62 | aclblasCcopy | 参数顺序修正 + int64_t→int + const(x) | | #63 | aclblasCdotc | int64_t→int | | #64 | aclblasCdotu | int64_t→int | | #65 | aclblasCgemvBatched | int64_t→int + alpha/beta→指针 + const(A,x) + nullptr check | | #66 | aclblasCgemv | int64_t→int + alpha/beta→指针 + const(A,x) + nullptr check | | #67 | aclblasCgerc | int64_t→int + alpha→指针 + const(x,y) + nullptr check | | #68 | aclblasCscal | int64_t→int + alpha→指针 + nullptr check | | #69 | aclblasCsrot | int64_t→int + c/s→指针 + nullptr check | | #70 | aclblasCsscal | int64_t→int + alpha→指针 + nullptr check + 溢出防护 | | #71 | aclblasCswap | int64_t→int | | #72 | aclblasCtrmv | int64_t→int + const(A) | | #75 | aclblasScnrm2 | int64_t→int + const(x) + 溢出防护 | | — | aclblasSdot | int64_t→int(风格统一) | | — | aclblasSsymm | int64_t→int(风格统一) | ### 实现策略 - Host 实现内部通过 const_cast 桥接到 kernel_do 函数(接受 uint8_t*),**Kernel 二进制不变** - alpha/beta 解引用:alpha.real → alpha->real - 测试调用点:alpha → &alpha,局部变量 int64_t → int ## 测试结果 远端 Ascend 910B3(arch22)环境构建与测试(15 个算子全部通过): | 测试 | 结果 | |------|------| | caxpy | PASS | | cscal | PASS | | sscal | PASS | | csrot | PASS | | cswap | PASS | | cdot | PASS | | scopy | PASS | | snrm2 | PASS | | cgemv | PASS | | cgerc | PASS | | ctrmv | PASS | | cgemv_batched | PASS | | sdot | PASS | | ssymm | PASS | See merge request: cann/ops-blas!316 | 1 个月前 | |
Fix: Handle 类型由 void* 改为前向声明结构体指针风格,对齐 cuBLAS/ROCm Co-authored-by: Zitao Wang<wangzitao4@huawei.com> # message auto-generated for no-merge-commit merge: !277 merge issue_110_258 into master Fix: Handle 类型由 void* 改为前向声明结构体指针风格,对齐 cuBLAS/ROCm Created-by: wangzitao_leo Commit-by: Zitao Wang Merged-by: cann-robot Description: ## 描述 将 aclblasHandle_t 和 aclblasLtHandle_t 从 void* 改为前向声明结构体指针(typedef struct _aclblas_handle* aclblasHandle_t),对齐 cuBLAS/ROCm 主流标准,获得编译期类型校验。Descriptor 类型此前已完成结构体指针化改造,本次仅涉及 Handle。清理了所有冗余的 reinterpret_cast 和 trivial 辅助函数。 ### 改动范围 **核心改动(2 个公开头文件):** - include/cann_ops_blas.h:typedef void* aclblasHandle_t → typedef struct _aclblas_handle* aclblasHandle_t - include/cann_ops_blasLt.h:typedef void* aclblasLtHandle_t → typedef struct aclblasLtHandle* aclblasLtHandle_t **清理改动(90 个文件):** - 删除 3 个 trivial 辅助函数(ToInternalHandle、ToInternal x2) - 移除 92 处 reinterpret_cast<_aclblas_handle*>(handle) → 直接用 handle - 移除 3 处 reinterpret_cast<aclblasLtHandle*>(lightHandle) → 直接用 lightHandle - 移除 2 处反向 cast(reinterpret_cast<void*>(h) / reinterpret_cast<aclblasLtHandle_t>(h))→ 直接赋值 - 更新 1 处过时注释 ### ABI 兼容性 指针的二进制表示不变,无 ABI 破坏。 ## 关联的Issue [#110](https://gitcode.com/cann/ops-blas/issues/110) ## 测试 所有 host 侧目标文件(80+ 算子 host、aclblas_auxiliary、blasLt API)零错误编译通过;grep 确认零遗留 reinterpret_cast 和 ToInternalHandle/ToInternal;ABI 无破坏(指针二进制表示不变)。 ## 文档更新 无需文档更新,API 签名不变。 ## 类型标签 - [x] Bug修复 - [ ] 新特性 - [ ] 性能优化 - [ ] 文档更新 - [ ] 其他,请描述: See merge request: cann/ops-blas!277 | 1 个月前 | |
Fix: Handle 类型由 void* 改为前向声明结构体指针风格,对齐 cuBLAS/ROCm Co-authored-by: Zitao Wang<wangzitao4@huawei.com> # message auto-generated for no-merge-commit merge: !277 merge issue_110_258 into master Fix: Handle 类型由 void* 改为前向声明结构体指针风格,对齐 cuBLAS/ROCm Created-by: wangzitao_leo Commit-by: Zitao Wang Merged-by: cann-robot Description: ## 描述 将 aclblasHandle_t 和 aclblasLtHandle_t 从 void* 改为前向声明结构体指针(typedef struct _aclblas_handle* aclblasHandle_t),对齐 cuBLAS/ROCm 主流标准,获得编译期类型校验。Descriptor 类型此前已完成结构体指针化改造,本次仅涉及 Handle。清理了所有冗余的 reinterpret_cast 和 trivial 辅助函数。 ### 改动范围 **核心改动(2 个公开头文件):** - include/cann_ops_blas.h:typedef void* aclblasHandle_t → typedef struct _aclblas_handle* aclblasHandle_t - include/cann_ops_blasLt.h:typedef void* aclblasLtHandle_t → typedef struct aclblasLtHandle* aclblasLtHandle_t **清理改动(90 个文件):** - 删除 3 个 trivial 辅助函数(ToInternalHandle、ToInternal x2) - 移除 92 处 reinterpret_cast<_aclblas_handle*>(handle) → 直接用 handle - 移除 3 处 reinterpret_cast<aclblasLtHandle*>(lightHandle) → 直接用 lightHandle - 移除 2 处反向 cast(reinterpret_cast<void*>(h) / reinterpret_cast<aclblasLtHandle_t>(h))→ 直接赋值 - 更新 1 处过时注释 ### ABI 兼容性 指针的二进制表示不变,无 ABI 破坏。 ## 关联的Issue [#110](https://gitcode.com/cann/ops-blas/issues/110) ## 测试 所有 host 侧目标文件(80+ 算子 host、aclblas_auxiliary、blasLt API)零错误编译通过;grep 确认零遗留 reinterpret_cast 和 ToInternalHandle/ToInternal;ABI 无破坏(指针二进制表示不变)。 ## 文档更新 无需文档更新,API 签名不变。 ## 类型标签 - [x] Bug修复 - [ ] 新特性 - [ ] 性能优化 - [ ] 文档更新 - [ ] 其他,请描述: See merge request: cann/ops-blas!277 | 1 个月前 | |
Fix: Handle 类型由 void* 改为前向声明结构体指针风格,对齐 cuBLAS/ROCm Co-authored-by: Zitao Wang<wangzitao4@huawei.com> # message auto-generated for no-merge-commit merge: !277 merge issue_110_258 into master Fix: Handle 类型由 void* 改为前向声明结构体指针风格,对齐 cuBLAS/ROCm Created-by: wangzitao_leo Commit-by: Zitao Wang Merged-by: cann-robot Description: ## 描述 将 aclblasHandle_t 和 aclblasLtHandle_t 从 void* 改为前向声明结构体指针(typedef struct _aclblas_handle* aclblasHandle_t),对齐 cuBLAS/ROCm 主流标准,获得编译期类型校验。Descriptor 类型此前已完成结构体指针化改造,本次仅涉及 Handle。清理了所有冗余的 reinterpret_cast 和 trivial 辅助函数。 ### 改动范围 **核心改动(2 个公开头文件):** - include/cann_ops_blas.h:typedef void* aclblasHandle_t → typedef struct _aclblas_handle* aclblasHandle_t - include/cann_ops_blasLt.h:typedef void* aclblasLtHandle_t → typedef struct aclblasLtHandle* aclblasLtHandle_t **清理改动(90 个文件):** - 删除 3 个 trivial 辅助函数(ToInternalHandle、ToInternal x2) - 移除 92 处 reinterpret_cast<_aclblas_handle*>(handle) → 直接用 handle - 移除 3 处 reinterpret_cast<aclblasLtHandle*>(lightHandle) → 直接用 lightHandle - 移除 2 处反向 cast(reinterpret_cast<void*>(h) / reinterpret_cast<aclblasLtHandle_t>(h))→ 直接赋值 - 更新 1 处过时注释 ### ABI 兼容性 指针的二进制表示不变,无 ABI 破坏。 ## 关联的Issue [#110](https://gitcode.com/cann/ops-blas/issues/110) ## 测试 所有 host 侧目标文件(80+ 算子 host、aclblas_auxiliary、blasLt API)零错误编译通过;grep 确认零遗留 reinterpret_cast 和 ToInternalHandle/ToInternal;ABI 无破坏(指针二进制表示不变)。 ## 文档更新 无需文档更新,API 签名不变。 ## 类型标签 - [x] Bug修复 - [ ] 新特性 - [ ] 性能优化 - [ ] 文档更新 - [ ] 其他,请描述: See merge request: cann/ops-blas!277 | 1 个月前 | |
Feat: 新增面向arch35的aclblasCherk接口 Co-authored-by: eternityk<taoyikun@huawei.com> # message auto-generated for no-merge-commit merge: !320 merge aclblasCherk into master Feat: 新增面向arch35的aclblasCherk接口 Created-by: eternityk Commit-by: eternityk Merged-by: cann-robot Description: ## 描述 BLAS Level 3 标准接口中的 HERK(Hermitian Rank-k Update)算子用于计算复数 Hermitian 矩阵的秩-k 更新: C = alpha·A·A^H + beta·C。当前 ops-blas 仓缺少该算子的 arch35 实现,需要新增 aclblasCherk 接口以补全 BLAS Level 3 复数算子覆盖范围。 ## 关联的Issue [#345](https://gitcode.com/cann/ops-blas/issues/345) ## 测试  ## 文档更新 <!--如果这个PR包含文档的更新,请在这里指出。例如:更新了README.md文件。--> ## 类型标签 <!-- [x] 表示选中 --> - [ ] Bug修复 - [x] 新特性 - [ ] 性能优化 - [ ] 文档更新 - [ ] 其他,请描述: See merge request: cann/ops-blas!320 | 30 天前 | |
docs: 修正算子文档标题与注释编码问题 Co-authored-by: 2301_82146483<2556943601@qq.com> # message auto-generated for no-merge-commit merge: !312 merge fix/readme-and-encoding into master docs: 修正算子文档标题与注释编码问题 Created-by: 2301_82146483 Commit-by: 2301_82146483 Merged-by: cann-robot Description: ## 描述 修正算子文档中的标题命名问题和源码注释的 UTF-8 双重编码乱码。 ## 改动内容 **1. blas/iamax/README.md — 算子标题修正** 算子文档标题和概述中的算子名称应为 Iamax,而非 Isamax。Isamax 是该算子的单精度(single-precision)接口实现,类似于 Saxpy 之于 Axpy。算子名称不应以特定数据类型的接口前缀命名,标题和概述修正为 Iamax。 **2. blas/spmv/README.md — 算子标题修正** 同理,算子文档标题和概述中的算子名称应为 Spmv,而非 Sspmv。Sspmv 是该算子的单精度接口实现。标题和概述修正为 Spmv。 **3. blas/gerc/arch22/cgerc_host.cpp — 注释乱码修复** 第 56 行注释存在 UTF-8 双重编码乱码(原始 UTF-8 中文被当作 Latin-1 解码后又重新按 UTF-8 编码),导致注释不可读。还原为正确中文: 修改前:// æå¤æ°ä½tilingï¼ä»¥ä¸åä½é½æ¯å¤æ°? 修改后:// 按复数作tiling,以下单位都是复数 ## 关联 Issue - Close #330 blas/gerc/arch22/cgerc_host.cpp 注释存在 UTF-8 双重编码乱码 ## 测试 bash build.sh --ops=cgerc --soc=ascend910b --run - 编译通过 - cgerc 测试 16/16 全部通过,精度验证 MaxErr=0.000000 ## 类型标签 - [ ] Bug修复 - [ ] 新特性 - [ ] 性能优化 - [x] 文档更新 See merge request: cann/ops-blas!312 | 1 个月前 | |
Fix: Handle 类型由 void* 改为前向声明结构体指针风格,对齐 cuBLAS/ROCm Co-authored-by: Zitao Wang<wangzitao4@huawei.com> # message auto-generated for no-merge-commit merge: !277 merge issue_110_258 into master Fix: Handle 类型由 void* 改为前向声明结构体指针风格,对齐 cuBLAS/ROCm Created-by: wangzitao_leo Commit-by: Zitao Wang Merged-by: cann-robot Description: ## 描述 将 aclblasHandle_t 和 aclblasLtHandle_t 从 void* 改为前向声明结构体指针(typedef struct _aclblas_handle* aclblasHandle_t),对齐 cuBLAS/ROCm 主流标准,获得编译期类型校验。Descriptor 类型此前已完成结构体指针化改造,本次仅涉及 Handle。清理了所有冗余的 reinterpret_cast 和 trivial 辅助函数。 ### 改动范围 **核心改动(2 个公开头文件):** - include/cann_ops_blas.h:typedef void* aclblasHandle_t → typedef struct _aclblas_handle* aclblasHandle_t - include/cann_ops_blasLt.h:typedef void* aclblasLtHandle_t → typedef struct aclblasLtHandle* aclblasLtHandle_t **清理改动(90 个文件):** - 删除 3 个 trivial 辅助函数(ToInternalHandle、ToInternal x2) - 移除 92 处 reinterpret_cast<_aclblas_handle*>(handle) → 直接用 handle - 移除 3 处 reinterpret_cast<aclblasLtHandle*>(lightHandle) → 直接用 lightHandle - 移除 2 处反向 cast(reinterpret_cast<void*>(h) / reinterpret_cast<aclblasLtHandle_t>(h))→ 直接赋值 - 更新 1 处过时注释 ### ABI 兼容性 指针的二进制表示不变,无 ABI 破坏。 ## 关联的Issue [#110](https://gitcode.com/cann/ops-blas/issues/110) ## 测试 所有 host 侧目标文件(80+ 算子 host、aclblas_auxiliary、blasLt API)零错误编译通过;grep 确认零遗留 reinterpret_cast 和 ToInternalHandle/ToInternal;ABI 无破坏(指针二进制表示不变)。 ## 文档更新 无需文档更新,API 签名不变。 ## 类型标签 - [x] Bug修复 - [ ] 新特性 - [ ] 性能优化 - [ ] 文档更新 - [ ] 其他,请描述: See merge request: cann/ops-blas!277 | 1 个月前 | |
Fix: Handle 类型由 void* 改为前向声明结构体指针风格,对齐 cuBLAS/ROCm Co-authored-by: Zitao Wang<wangzitao4@huawei.com> # message auto-generated for no-merge-commit merge: !277 merge issue_110_258 into master Fix: Handle 类型由 void* 改为前向声明结构体指针风格,对齐 cuBLAS/ROCm Created-by: wangzitao_leo Commit-by: Zitao Wang Merged-by: cann-robot Description: ## 描述 将 aclblasHandle_t 和 aclblasLtHandle_t 从 void* 改为前向声明结构体指针(typedef struct _aclblas_handle* aclblasHandle_t),对齐 cuBLAS/ROCm 主流标准,获得编译期类型校验。Descriptor 类型此前已完成结构体指针化改造,本次仅涉及 Handle。清理了所有冗余的 reinterpret_cast 和 trivial 辅助函数。 ### 改动范围 **核心改动(2 个公开头文件):** - include/cann_ops_blas.h:typedef void* aclblasHandle_t → typedef struct _aclblas_handle* aclblasHandle_t - include/cann_ops_blasLt.h:typedef void* aclblasLtHandle_t → typedef struct aclblasLtHandle* aclblasLtHandle_t **清理改动(90 个文件):** - 删除 3 个 trivial 辅助函数(ToInternalHandle、ToInternal x2) - 移除 92 处 reinterpret_cast<_aclblas_handle*>(handle) → 直接用 handle - 移除 3 处 reinterpret_cast<aclblasLtHandle*>(lightHandle) → 直接用 lightHandle - 移除 2 处反向 cast(reinterpret_cast<void*>(h) / reinterpret_cast<aclblasLtHandle_t>(h))→ 直接赋值 - 更新 1 处过时注释 ### ABI 兼容性 指针的二进制表示不变,无 ABI 破坏。 ## 关联的Issue [#110](https://gitcode.com/cann/ops-blas/issues/110) ## 测试 所有 host 侧目标文件(80+ 算子 host、aclblas_auxiliary、blasLt API)零错误编译通过;grep 确认零遗留 reinterpret_cast 和 ToInternalHandle/ToInternal;ABI 无破坏(指针二进制表示不变)。 ## 文档更新 无需文档更新,API 签名不变。 ## 类型标签 - [x] Bug修复 - [ ] 新特性 - [ ] 性能优化 - [ ] 文档更新 - [ ] 其他,请描述: See merge request: cann/ops-blas!277 | 1 个月前 | |
fix(complex): 统一复数 BLAS 算子接口对齐 BLAS 标准(issues #61-#75) Co-authored-by: 2301_82146483<2556943601@qq.com> # message auto-generated for no-merge-commit merge: !316 merge fix/complex-blas-interface-alignment into master fix(complex): 统一复数 BLAS 算子接口对齐 BLAS 标准(issues #61-#75) Created-by: 2301_82146483 Commit-by: 2301_82146483 Merged-by: cann-robot Description: ## 关联 Issues Closes #61, #62, #63, #64, #65, #66, #67, #68, #69, #70, #71, #72, #75 ## 背景 仓库中复数 BLAS 算子接口以及少数实数BLAS算子接口与标准BLAS算子存在三类风格差异: 1. 维度参数使用 int64_t 而非 int 2. 标量 alpha/beta/c/s 按值传递而非指针传递 3. 只读输入指针缺少 const 修饰 此外 aclblasCcopy 参数顺序为 (x, y, n, incx, incy),与 BLAS 标准和同库 aclblasScopy 的 (n, x, incx, y, incy) 不一致。 ## 本次 PR 内容 ### 三类风格统一 将 15 个算子的接口签名对齐到与标准浮点算子一致: | 改动类型 | 说明 | |---|---| | int64_t → int | n/m/incx/incy/lda/batchCount 等维度参数统一为 int | | 按值 → 指针 | const aclblasComplex alpha → const aclblasComplex* alpha;const float c, const float s → const float* c, const float* s | | 补 const | 只读输入指针 x/y/A 添加 const 修饰 | | 空指针检查 | 所有指针传递的标量参数(alpha/beta/c/s)在函数体开头添加 nullptr 检查 | | 溢出防护 | n * 2 表达式在乘法前加 static_cast 避免 int 溢出 | ### Ccopy 参数顺序修正 aclblasCcopy 参数顺序从 (handle, x, y, n, incx, incy) 修正为 (handle, n, x, incx, y, incy),与 BLAS 标准一致。 ### 涉及算子清单(15 个) | Issue | 算子 | 改动要点 | |---|---|---| | #61 | aclblasCaxpy | int64_t→int + alpha→指针 + const(x) + nullptr check | | #62 | aclblasCcopy | 参数顺序修正 + int64_t→int + const(x) | | #63 | aclblasCdotc | int64_t→int | | #64 | aclblasCdotu | int64_t→int | | #65 | aclblasCgemvBatched | int64_t→int + alpha/beta→指针 + const(A,x) + nullptr check | | #66 | aclblasCgemv | int64_t→int + alpha/beta→指针 + const(A,x) + nullptr check | | #67 | aclblasCgerc | int64_t→int + alpha→指针 + const(x,y) + nullptr check | | #68 | aclblasCscal | int64_t→int + alpha→指针 + nullptr check | | #69 | aclblasCsrot | int64_t→int + c/s→指针 + nullptr check | | #70 | aclblasCsscal | int64_t→int + alpha→指针 + nullptr check + 溢出防护 | | #71 | aclblasCswap | int64_t→int | | #72 | aclblasCtrmv | int64_t→int + const(A) | | #75 | aclblasScnrm2 | int64_t→int + const(x) + 溢出防护 | | — | aclblasSdot | int64_t→int(风格统一) | | — | aclblasSsymm | int64_t→int(风格统一) | ### 实现策略 - Host 实现内部通过 const_cast 桥接到 kernel_do 函数(接受 uint8_t*),**Kernel 二进制不变** - alpha/beta 解引用:alpha.real → alpha->real - 测试调用点:alpha → &alpha,局部变量 int64_t → int ## 测试结果 远端 Ascend 910B3(arch22)环境构建与测试(15 个算子全部通过): | 测试 | 结果 | |------|------| | caxpy | PASS | | cscal | PASS | | sscal | PASS | | csrot | PASS | | cswap | PASS | | cdot | PASS | | scopy | PASS | | snrm2 | PASS | | cgemv | PASS | | cgerc | PASS | | ctrmv | PASS | | cgemv_batched | PASS | | sdot | PASS | | ssymm | PASS | See merge request: cann/ops-blas!316 | 1 个月前 | |
fix(complex): 统一复数 BLAS 算子接口对齐 BLAS 标准(issues #61-#75) Co-authored-by: 2301_82146483<2556943601@qq.com> # message auto-generated for no-merge-commit merge: !316 merge fix/complex-blas-interface-alignment into master fix(complex): 统一复数 BLAS 算子接口对齐 BLAS 标准(issues #61-#75) Created-by: 2301_82146483 Commit-by: 2301_82146483 Merged-by: cann-robot Description: ## 关联 Issues Closes #61, #62, #63, #64, #65, #66, #67, #68, #69, #70, #71, #72, #75 ## 背景 仓库中复数 BLAS 算子接口以及少数实数BLAS算子接口与标准BLAS算子存在三类风格差异: 1. 维度参数使用 int64_t 而非 int 2. 标量 alpha/beta/c/s 按值传递而非指针传递 3. 只读输入指针缺少 const 修饰 此外 aclblasCcopy 参数顺序为 (x, y, n, incx, incy),与 BLAS 标准和同库 aclblasScopy 的 (n, x, incx, y, incy) 不一致。 ## 本次 PR 内容 ### 三类风格统一 将 15 个算子的接口签名对齐到与标准浮点算子一致: | 改动类型 | 说明 | |---|---| | int64_t → int | n/m/incx/incy/lda/batchCount 等维度参数统一为 int | | 按值 → 指针 | const aclblasComplex alpha → const aclblasComplex* alpha;const float c, const float s → const float* c, const float* s | | 补 const | 只读输入指针 x/y/A 添加 const 修饰 | | 空指针检查 | 所有指针传递的标量参数(alpha/beta/c/s)在函数体开头添加 nullptr 检查 | | 溢出防护 | n * 2 表达式在乘法前加 static_cast 避免 int 溢出 | ### Ccopy 参数顺序修正 aclblasCcopy 参数顺序从 (handle, x, y, n, incx, incy) 修正为 (handle, n, x, incx, y, incy),与 BLAS 标准一致。 ### 涉及算子清单(15 个) | Issue | 算子 | 改动要点 | |---|---|---| | #61 | aclblasCaxpy | int64_t→int + alpha→指针 + const(x) + nullptr check | | #62 | aclblasCcopy | 参数顺序修正 + int64_t→int + const(x) | | #63 | aclblasCdotc | int64_t→int | | #64 | aclblasCdotu | int64_t→int | | #65 | aclblasCgemvBatched | int64_t→int + alpha/beta→指针 + const(A,x) + nullptr check | | #66 | aclblasCgemv | int64_t→int + alpha/beta→指针 + const(A,x) + nullptr check | | #67 | aclblasCgerc | int64_t→int + alpha→指针 + const(x,y) + nullptr check | | #68 | aclblasCscal | int64_t→int + alpha→指针 + nullptr check | | #69 | aclblasCsrot | int64_t→int + c/s→指针 + nullptr check | | #70 | aclblasCsscal | int64_t→int + alpha→指针 + nullptr check + 溢出防护 | | #71 | aclblasCswap | int64_t→int | | #72 | aclblasCtrmv | int64_t→int + const(A) | | #75 | aclblasScnrm2 | int64_t→int + const(x) + 溢出防护 | | — | aclblasSdot | int64_t→int(风格统一) | | — | aclblasSsymm | int64_t→int(风格统一) | ### 实现策略 - Host 实现内部通过 const_cast 桥接到 kernel_do 函数(接受 uint8_t*),**Kernel 二进制不变** - alpha/beta 解引用:alpha.real → alpha->real - 测试调用点:alpha → &alpha,局部变量 int64_t → int ## 测试结果 远端 Ascend 910B3(arch22)环境构建与测试(15 个算子全部通过): | 测试 | 结果 | |------|------| | caxpy | PASS | | cscal | PASS | | sscal | PASS | | csrot | PASS | | cswap | PASS | | cdot | PASS | | scopy | PASS | | snrm2 | PASS | | cgemv | PASS | | cgerc | PASS | | ctrmv | PASS | | cgemv_batched | PASS | | sdot | PASS | | ssymm | PASS | See merge request: cann/ops-blas!316 | 1 个月前 | |
fix(docs): 修复 aclblasScopy/aclblasRotEx README 调用示例,采用 RAII 资源管理 Co-authored-by: Twoliges<202383290096@nuist.edu.cn> # message auto-generated for no-merge-commit merge: !224 merge fix/readme-raii-scopy-rotex-234-237 into master fix(docs): 修复 aclblasScopy/aclblasRotEx README 调用示例,采用 RAII 资源管理 Created-by: Twoliges Commit-by: Twoliges Merged-by: cann-robot Description: ## 描述 修复 aclblasScopy 和 aclblasRotEx 两个算子 README 中调用示例的编译错误,并采用 RAII 模式进行资源管理,对齐 compile_and_run_example.md 中的推荐写法。 ### 主要改动 **blas/copy/README.md(aclblasScopy)** - 修正 aclrtStreamSynchronize → aclrtSynchronizeStream(API 名称错误导致编译失败) - 修正参数顺序:原示例将 dX(uint8_t*)传给了 n(int)参数 - 修正参数类型:uint8_t* → const float* / float*,与函数签名一致 - 引入 AclContext RAII 类自动管理 ACL 初始化/释放、Device 设置/重置、Stream 创建/销毁 - 引入 std::unique_ptr + 自定义删除器自动管理 Device 内存(aclrtFree)和 BLAS 句柄(aclblasDestroy) - 添加 CHECK_RET / LOG_PRINT 错误检查宏,完善异常路径的资源安全释放 **blas/rotex/README.md(aclblasRotEx)** - 修正 aclrtStreamSynchronize → aclrtSynchronizeStream(同上) - 引入 AclContext RAII 类 + std::unique_ptr 实现自动资源管理(同上模式) - 移除不需要的 <cstdint> 头文件 - 添加 CHECK_RET / LOG_PRINT 错误检查宏 - 将示例数据量从 n=1024 调整为 n=5,使输出简洁可验证 ## 关联的Issue - [#234](https://gitcode.com/cann/ops-blas/issues/234) aclblasScopy 调用示例编译失败 - [#237](https://gitcode.com/cann/ops-blas/issues/237) aclblasRotEx 调用示例编译失败 ## 测试 按照 docs/zh/develop/compile_and_run_example.md 流程完成自测: 1. 编译 ops-blas 安装包:bash build.sh --pkg --soc=ascend950 2. 安装 run 包到 /usr/local/Ascend/cann 3. 使用 README 中的示例代码 + CMakeLists.txt 编译,**零编译错误** 4. 在 Ascend 950PR 上运行,输出结果符合预期: === aclblasScopy === result[0] is: 1.000000 result[1] is: 2.000000 result[2] is: 3.000000 result[3] is: 4.000000 result[4] is: 5.000000 === aclblasRotEx === resultX[0] is: 4.400000, resultY[0] is: 4.200000 resultX[1] is: 5.800000, resultY[1] is: 4.400000 resultX[2] is: 7.200000, resultY[2] is: 4.600000 resultX[3] is: 8.600000, resultY[3] is: 4.800000 resultX[4] is: 10.000000, resultY[4] is: 5.000000 ## 文档更新 - 更新 blas/copy/README.md 中 aclblasScopy 调用示例 - 更新 blas/rotex/README.md 中 aclblasRotEx 调用示例 ## 类型标签 - [x] Bug修复 - [ ] 新特性 - [ ] 性能优化 - [x] 文档更新 - [ ] 其他,请描述: See merge request: cann/ops-blas!224 | 2 个月前 | |
Fix: Handle 类型由 void* 改为前向声明结构体指针风格,对齐 cuBLAS/ROCm Co-authored-by: Zitao Wang<wangzitao4@huawei.com> # message auto-generated for no-merge-commit merge: !277 merge issue_110_258 into master Fix: Handle 类型由 void* 改为前向声明结构体指针风格,对齐 cuBLAS/ROCm Created-by: wangzitao_leo Commit-by: Zitao Wang Merged-by: cann-robot Description: ## 描述 将 aclblasHandle_t 和 aclblasLtHandle_t 从 void* 改为前向声明结构体指针(typedef struct _aclblas_handle* aclblasHandle_t),对齐 cuBLAS/ROCm 主流标准,获得编译期类型校验。Descriptor 类型此前已完成结构体指针化改造,本次仅涉及 Handle。清理了所有冗余的 reinterpret_cast 和 trivial 辅助函数。 ### 改动范围 **核心改动(2 个公开头文件):** - include/cann_ops_blas.h:typedef void* aclblasHandle_t → typedef struct _aclblas_handle* aclblasHandle_t - include/cann_ops_blasLt.h:typedef void* aclblasLtHandle_t → typedef struct aclblasLtHandle* aclblasLtHandle_t **清理改动(90 个文件):** - 删除 3 个 trivial 辅助函数(ToInternalHandle、ToInternal x2) - 移除 92 处 reinterpret_cast<_aclblas_handle*>(handle) → 直接用 handle - 移除 3 处 reinterpret_cast<aclblasLtHandle*>(lightHandle) → 直接用 lightHandle - 移除 2 处反向 cast(reinterpret_cast<void*>(h) / reinterpret_cast<aclblasLtHandle_t>(h))→ 直接赋值 - 更新 1 处过时注释 ### ABI 兼容性 指针的二进制表示不变,无 ABI 破坏。 ## 关联的Issue [#110](https://gitcode.com/cann/ops-blas/issues/110) ## 测试 所有 host 侧目标文件(80+ 算子 host、aclblas_auxiliary、blasLt API)零错误编译通过;grep 确认零遗留 reinterpret_cast 和 ToInternalHandle/ToInternal;ABI 无破坏(指针二进制表示不变)。 ## 文档更新 无需文档更新,API 签名不变。 ## 类型标签 - [x] Bug修复 - [ ] 新特性 - [ ] 性能优化 - [ ] 文档更新 - [ ] 其他,请描述: See merge request: cann/ops-blas!277 | 1 个月前 | |
Fix: Handle 类型由 void* 改为前向声明结构体指针风格,对齐 cuBLAS/ROCm Co-authored-by: Zitao Wang<wangzitao4@huawei.com> # message auto-generated for no-merge-commit merge: !277 merge issue_110_258 into master Fix: Handle 类型由 void* 改为前向声明结构体指针风格,对齐 cuBLAS/ROCm Created-by: wangzitao_leo Commit-by: Zitao Wang Merged-by: cann-robot Description: ## 描述 将 aclblasHandle_t 和 aclblasLtHandle_t 从 void* 改为前向声明结构体指针(typedef struct _aclblas_handle* aclblasHandle_t),对齐 cuBLAS/ROCm 主流标准,获得编译期类型校验。Descriptor 类型此前已完成结构体指针化改造,本次仅涉及 Handle。清理了所有冗余的 reinterpret_cast 和 trivial 辅助函数。 ### 改动范围 **核心改动(2 个公开头文件):** - include/cann_ops_blas.h:typedef void* aclblasHandle_t → typedef struct _aclblas_handle* aclblasHandle_t - include/cann_ops_blasLt.h:typedef void* aclblasLtHandle_t → typedef struct aclblasLtHandle* aclblasLtHandle_t **清理改动(90 个文件):** - 删除 3 个 trivial 辅助函数(ToInternalHandle、ToInternal x2) - 移除 92 处 reinterpret_cast<_aclblas_handle*>(handle) → 直接用 handle - 移除 3 处 reinterpret_cast<aclblasLtHandle*>(lightHandle) → 直接用 lightHandle - 移除 2 处反向 cast(reinterpret_cast<void*>(h) / reinterpret_cast<aclblasLtHandle_t>(h))→ 直接赋值 - 更新 1 处过时注释 ### ABI 兼容性 指针的二进制表示不变,无 ABI 破坏。 ## 关联的Issue [#110](https://gitcode.com/cann/ops-blas/issues/110) ## 测试 所有 host 侧目标文件(80+ 算子 host、aclblas_auxiliary、blasLt API)零错误编译通过;grep 确认零遗留 reinterpret_cast 和 ToInternalHandle/ToInternal;ABI 无破坏(指针二进制表示不变)。 ## 文档更新 无需文档更新,API 签名不变。 ## 类型标签 - [x] Bug修复 - [ ] 新特性 - [ ] 性能优化 - [ ] 文档更新 - [ ] 其他,请描述: See merge request: cann/ops-blas!277 | 1 个月前 | |
Fix: Handle 类型由 void* 改为前向声明结构体指针风格,对齐 cuBLAS/ROCm Co-authored-by: Zitao Wang<wangzitao4@huawei.com> # message auto-generated for no-merge-commit merge: !277 merge issue_110_258 into master Fix: Handle 类型由 void* 改为前向声明结构体指针风格,对齐 cuBLAS/ROCm Created-by: wangzitao_leo Commit-by: Zitao Wang Merged-by: cann-robot Description: ## 描述 将 aclblasHandle_t 和 aclblasLtHandle_t 从 void* 改为前向声明结构体指针(typedef struct _aclblas_handle* aclblasHandle_t),对齐 cuBLAS/ROCm 主流标准,获得编译期类型校验。Descriptor 类型此前已完成结构体指针化改造,本次仅涉及 Handle。清理了所有冗余的 reinterpret_cast 和 trivial 辅助函数。 ### 改动范围 **核心改动(2 个公开头文件):** - include/cann_ops_blas.h:typedef void* aclblasHandle_t → typedef struct _aclblas_handle* aclblasHandle_t - include/cann_ops_blasLt.h:typedef void* aclblasLtHandle_t → typedef struct aclblasLtHandle* aclblasLtHandle_t **清理改动(90 个文件):** - 删除 3 个 trivial 辅助函数(ToInternalHandle、ToInternal x2) - 移除 92 处 reinterpret_cast<_aclblas_handle*>(handle) → 直接用 handle - 移除 3 处 reinterpret_cast<aclblasLtHandle*>(lightHandle) → 直接用 lightHandle - 移除 2 处反向 cast(reinterpret_cast<void*>(h) / reinterpret_cast<aclblasLtHandle_t>(h))→ 直接赋值 - 更新 1 处过时注释 ### ABI 兼容性 指针的二进制表示不变,无 ABI 破坏。 ## 关联的Issue [#110](https://gitcode.com/cann/ops-blas/issues/110) ## 测试 所有 host 侧目标文件(80+ 算子 host、aclblas_auxiliary、blasLt API)零错误编译通过;grep 确认零遗留 reinterpret_cast 和 ToInternalHandle/ToInternal;ABI 无破坏(指针二进制表示不变)。 ## 文档更新 无需文档更新,API 签名不变。 ## 类型标签 - [x] Bug修复 - [ ] 新特性 - [ ] 性能优化 - [ ] 文档更新 - [ ] 其他,请描述: See merge request: cann/ops-blas!277 | 1 个月前 | |
Fix: Handle 类型由 void* 改为前向声明结构体指针风格,对齐 cuBLAS/ROCm Co-authored-by: Zitao Wang<wangzitao4@huawei.com> # message auto-generated for no-merge-commit merge: !277 merge issue_110_258 into master Fix: Handle 类型由 void* 改为前向声明结构体指针风格,对齐 cuBLAS/ROCm Created-by: wangzitao_leo Commit-by: Zitao Wang Merged-by: cann-robot Description: ## 描述 将 aclblasHandle_t 和 aclblasLtHandle_t 从 void* 改为前向声明结构体指针(typedef struct _aclblas_handle* aclblasHandle_t),对齐 cuBLAS/ROCm 主流标准,获得编译期类型校验。Descriptor 类型此前已完成结构体指针化改造,本次仅涉及 Handle。清理了所有冗余的 reinterpret_cast 和 trivial 辅助函数。 ### 改动范围 **核心改动(2 个公开头文件):** - include/cann_ops_blas.h:typedef void* aclblasHandle_t → typedef struct _aclblas_handle* aclblasHandle_t - include/cann_ops_blasLt.h:typedef void* aclblasLtHandle_t → typedef struct aclblasLtHandle* aclblasLtHandle_t **清理改动(90 个文件):** - 删除 3 个 trivial 辅助函数(ToInternalHandle、ToInternal x2) - 移除 92 处 reinterpret_cast<_aclblas_handle*>(handle) → 直接用 handle - 移除 3 处 reinterpret_cast<aclblasLtHandle*>(lightHandle) → 直接用 lightHandle - 移除 2 处反向 cast(reinterpret_cast<void*>(h) / reinterpret_cast<aclblasLtHandle_t>(h))→ 直接赋值 - 更新 1 处过时注释 ### ABI 兼容性 指针的二进制表示不变,无 ABI 破坏。 ## 关联的Issue [#110](https://gitcode.com/cann/ops-blas/issues/110) ## 测试 所有 host 侧目标文件(80+ 算子 host、aclblas_auxiliary、blasLt API)零错误编译通过;grep 确认零遗留 reinterpret_cast 和 ToInternalHandle/ToInternal;ABI 无破坏(指针二进制表示不变)。 ## 文档更新 无需文档更新,API 签名不变。 ## 类型标签 - [x] Bug修复 - [ ] 新特性 - [ ] 性能优化 - [ ] 文档更新 - [ ] 其他,请描述: See merge request: cann/ops-blas!277 | 1 个月前 | |
fix: 对齐 snrm2,srot,sscal,scalex算子 quick return 行为 Co-authored-by: chensi79@huawei.com<chensi79@huawei.com> # message auto-generated for no-merge-commit merge: !304 merge fix/arch35-level1-quick-return into master fix: 对齐 snrm2,srot,sscal,scalex算子 quick return 行为 Created-by: chensi79 Commit-by: chensi79@huawei.com Merged-by: cann-robot Description: ## 修改说明 - 根据 A100 cuBLAS 实测结果,调整 arch35 aclblasSscal 和 aclblasScalex 的 quick return:先校验 handle,随后在 n <= 0 || incx <= 0 时成功返回,并跳过数据指针校验。 - 将 aclblasScalex 的负 n 行为及 golden 预期改为成功空操作。 - 修正 aclblasSnrm2 quick-return 测试,使 result 使用 device 内存并从非零初值验证写零。 - 为 aclblasSrot、aclblasSscal、aclblasScalex 增加 handle 优先级和空数据指针测试。 ## 验证 - A100 cuBLAS 探测:Sscal/ScalEx 在 n <= 0 || incx <= 0 时返回 SUCCESS 且数据不变;空 handle 返回 NOT_INITIALIZED。 - CANN ascend950: bash build.sh --ops=snrm2,srot,sscal,scalex --soc=ascend950 --run - snrm2: 56/56 passed - srot: 49/49 passed - sscal: 57/57 passed - scalex: 92/92 passed - pre-commit: passed See merge request: cann/ops-blas!304 | 1 个月前 | |
fix: 对齐 snrm2,srot,sscal,scalex算子 quick return 行为 Co-authored-by: chensi79@huawei.com<chensi79@huawei.com> # message auto-generated for no-merge-commit merge: !304 merge fix/arch35-level1-quick-return into master fix: 对齐 snrm2,srot,sscal,scalex算子 quick return 行为 Created-by: chensi79 Commit-by: chensi79@huawei.com Merged-by: cann-robot Description: ## 修改说明 - 根据 A100 cuBLAS 实测结果,调整 arch35 aclblasSscal 和 aclblasScalex 的 quick return:先校验 handle,随后在 n <= 0 || incx <= 0 时成功返回,并跳过数据指针校验。 - 将 aclblasScalex 的负 n 行为及 golden 预期改为成功空操作。 - 修正 aclblasSnrm2 quick-return 测试,使 result 使用 device 内存并从非零初值验证写零。 - 为 aclblasSrot、aclblasSscal、aclblasScalex 增加 handle 优先级和空数据指针测试。 ## 验证 - A100 cuBLAS 探测:Sscal/ScalEx 在 n <= 0 || incx <= 0 时返回 SUCCESS 且数据不变;空 handle 返回 NOT_INITIALIZED。 - CANN ascend950: bash build.sh --ops=snrm2,srot,sscal,scalex --soc=ascend950 --run - snrm2: 56/56 passed - srot: 49/49 passed - sscal: 57/57 passed - scalex: 92/92 passed - pre-commit: passed See merge request: cann/ops-blas!304 | 1 个月前 | |
docs: 修正算子文档标题与注释编码问题 Co-authored-by: 2301_82146483<2556943601@qq.com> # message auto-generated for no-merge-commit merge: !312 merge fix/readme-and-encoding into master docs: 修正算子文档标题与注释编码问题 Created-by: 2301_82146483 Commit-by: 2301_82146483 Merged-by: cann-robot Description: ## 描述 修正算子文档中的标题命名问题和源码注释的 UTF-8 双重编码乱码。 ## 改动内容 **1. blas/iamax/README.md — 算子标题修正** 算子文档标题和概述中的算子名称应为 Iamax,而非 Isamax。Isamax 是该算子的单精度(single-precision)接口实现,类似于 Saxpy 之于 Axpy。算子名称不应以特定数据类型的接口前缀命名,标题和概述修正为 Iamax。 **2. blas/spmv/README.md — 算子标题修正** 同理,算子文档标题和概述中的算子名称应为 Spmv,而非 Sspmv。Sspmv 是该算子的单精度接口实现。标题和概述修正为 Spmv。 **3. blas/gerc/arch22/cgerc_host.cpp — 注释乱码修复** 第 56 行注释存在 UTF-8 双重编码乱码(原始 UTF-8 中文被当作 Latin-1 解码后又重新按 UTF-8 编码),导致注释不可读。还原为正确中文: 修改前:// æå¤æ°ä½tilingï¼ä»¥ä¸åä½é½æ¯å¤æ°? 修改后:// 按复数作tiling,以下单位都是复数 ## 关联 Issue - Close #330 blas/gerc/arch22/cgerc_host.cpp 注释存在 UTF-8 双重编码乱码 ## 测试 bash build.sh --ops=cgerc --soc=ascend910b --run - 编译通过 - cgerc 测试 16/16 全部通过,精度验证 MaxErr=0.000000 ## 类型标签 - [ ] Bug修复 - [ ] 新特性 - [ ] 性能优化 - [x] 文档更新 See merge request: cann/ops-blas!312 | 1 个月前 | |
Fix: Handle 类型由 void* 改为前向声明结构体指针风格,对齐 cuBLAS/ROCm Co-authored-by: Zitao Wang<wangzitao4@huawei.com> # message auto-generated for no-merge-commit merge: !277 merge issue_110_258 into master Fix: Handle 类型由 void* 改为前向声明结构体指针风格,对齐 cuBLAS/ROCm Created-by: wangzitao_leo Commit-by: Zitao Wang Merged-by: cann-robot Description: ## 描述 将 aclblasHandle_t 和 aclblasLtHandle_t 从 void* 改为前向声明结构体指针(typedef struct _aclblas_handle* aclblasHandle_t),对齐 cuBLAS/ROCm 主流标准,获得编译期类型校验。Descriptor 类型此前已完成结构体指针化改造,本次仅涉及 Handle。清理了所有冗余的 reinterpret_cast 和 trivial 辅助函数。 ### 改动范围 **核心改动(2 个公开头文件):** - include/cann_ops_blas.h:typedef void* aclblasHandle_t → typedef struct _aclblas_handle* aclblasHandle_t - include/cann_ops_blasLt.h:typedef void* aclblasLtHandle_t → typedef struct aclblasLtHandle* aclblasLtHandle_t **清理改动(90 个文件):** - 删除 3 个 trivial 辅助函数(ToInternalHandle、ToInternal x2) - 移除 92 处 reinterpret_cast<_aclblas_handle*>(handle) → 直接用 handle - 移除 3 处 reinterpret_cast<aclblasLtHandle*>(lightHandle) → 直接用 lightHandle - 移除 2 处反向 cast(reinterpret_cast<void*>(h) / reinterpret_cast<aclblasLtHandle_t>(h))→ 直接赋值 - 更新 1 处过时注释 ### ABI 兼容性 指针的二进制表示不变,无 ABI 破坏。 ## 关联的Issue [#110](https://gitcode.com/cann/ops-blas/issues/110) ## 测试 所有 host 侧目标文件(80+ 算子 host、aclblas_auxiliary、blasLt API)零错误编译通过;grep 确认零遗留 reinterpret_cast 和 ToInternalHandle/ToInternal;ABI 无破坏(指针二进制表示不变)。 ## 文档更新 无需文档更新,API 签名不变。 ## 类型标签 - [x] Bug修复 - [ ] 新特性 - [ ] 性能优化 - [ ] 文档更新 - [ ] 其他,请描述: See merge request: cann/ops-blas!277 | 1 个月前 | |
Fix: Handle 类型由 void* 改为前向声明结构体指针风格,对齐 cuBLAS/ROCm Co-authored-by: Zitao Wang<wangzitao4@huawei.com> # message auto-generated for no-merge-commit merge: !277 merge issue_110_258 into master Fix: Handle 类型由 void* 改为前向声明结构体指针风格,对齐 cuBLAS/ROCm Created-by: wangzitao_leo Commit-by: Zitao Wang Merged-by: cann-robot Description: ## 描述 将 aclblasHandle_t 和 aclblasLtHandle_t 从 void* 改为前向声明结构体指针(typedef struct _aclblas_handle* aclblasHandle_t),对齐 cuBLAS/ROCm 主流标准,获得编译期类型校验。Descriptor 类型此前已完成结构体指针化改造,本次仅涉及 Handle。清理了所有冗余的 reinterpret_cast 和 trivial 辅助函数。 ### 改动范围 **核心改动(2 个公开头文件):** - include/cann_ops_blas.h:typedef void* aclblasHandle_t → typedef struct _aclblas_handle* aclblasHandle_t - include/cann_ops_blasLt.h:typedef void* aclblasLtHandle_t → typedef struct aclblasLtHandle* aclblasLtHandle_t **清理改动(90 个文件):** - 删除 3 个 trivial 辅助函数(ToInternalHandle、ToInternal x2) - 移除 92 处 reinterpret_cast<_aclblas_handle*>(handle) → 直接用 handle - 移除 3 处 reinterpret_cast<aclblasLtHandle*>(lightHandle) → 直接用 lightHandle - 移除 2 处反向 cast(reinterpret_cast<void*>(h) / reinterpret_cast<aclblasLtHandle_t>(h))→ 直接赋值 - 更新 1 处过时注释 ### ABI 兼容性 指针的二进制表示不变,无 ABI 破坏。 ## 关联的Issue [#110](https://gitcode.com/cann/ops-blas/issues/110) ## 测试 所有 host 侧目标文件(80+ 算子 host、aclblas_auxiliary、blasLt API)零错误编译通过;grep 确认零遗留 reinterpret_cast 和 ToInternalHandle/ToInternal;ABI 无破坏(指针二进制表示不变)。 ## 文档更新 无需文档更新,API 签名不变。 ## 类型标签 - [x] Bug修复 - [ ] 新特性 - [ ] 性能优化 - [ ] 文档更新 - [ ] 其他,请描述: See merge request: cann/ops-blas!277 | 1 个月前 | |
Fix: Handle 类型由 void* 改为前向声明结构体指针风格,对齐 cuBLAS/ROCm Co-authored-by: Zitao Wang<wangzitao4@huawei.com> # message auto-generated for no-merge-commit merge: !277 merge issue_110_258 into master Fix: Handle 类型由 void* 改为前向声明结构体指针风格,对齐 cuBLAS/ROCm Created-by: wangzitao_leo Commit-by: Zitao Wang Merged-by: cann-robot Description: ## 描述 将 aclblasHandle_t 和 aclblasLtHandle_t 从 void* 改为前向声明结构体指针(typedef struct _aclblas_handle* aclblasHandle_t),对齐 cuBLAS/ROCm 主流标准,获得编译期类型校验。Descriptor 类型此前已完成结构体指针化改造,本次仅涉及 Handle。清理了所有冗余的 reinterpret_cast 和 trivial 辅助函数。 ### 改动范围 **核心改动(2 个公开头文件):** - include/cann_ops_blas.h:typedef void* aclblasHandle_t → typedef struct _aclblas_handle* aclblasHandle_t - include/cann_ops_blasLt.h:typedef void* aclblasLtHandle_t → typedef struct aclblasLtHandle* aclblasLtHandle_t **清理改动(90 个文件):** - 删除 3 个 trivial 辅助函数(ToInternalHandle、ToInternal x2) - 移除 92 处 reinterpret_cast<_aclblas_handle*>(handle) → 直接用 handle - 移除 3 处 reinterpret_cast<aclblasLtHandle*>(lightHandle) → 直接用 lightHandle - 移除 2 处反向 cast(reinterpret_cast<void*>(h) / reinterpret_cast<aclblasLtHandle_t>(h))→ 直接赋值 - 更新 1 处过时注释 ### ABI 兼容性 指针的二进制表示不变,无 ABI 破坏。 ## 关联的Issue [#110](https://gitcode.com/cann/ops-blas/issues/110) ## 测试 所有 host 侧目标文件(80+ 算子 host、aclblas_auxiliary、blasLt API)零错误编译通过;grep 确认零遗留 reinterpret_cast 和 ToInternalHandle/ToInternal;ABI 无破坏(指针二进制表示不变)。 ## 文档更新 无需文档更新,API 签名不变。 ## 类型标签 - [x] Bug修复 - [ ] 新特性 - [ ] 性能优化 - [ ] 文档更新 - [ ] 其他,请描述: See merge request: cann/ops-blas!277 | 1 个月前 | |
fix(complex): 统一复数 BLAS 算子接口对齐 BLAS 标准(issues #61-#75) Co-authored-by: 2301_82146483<2556943601@qq.com> # message auto-generated for no-merge-commit merge: !316 merge fix/complex-blas-interface-alignment into master fix(complex): 统一复数 BLAS 算子接口对齐 BLAS 标准(issues #61-#75) Created-by: 2301_82146483 Commit-by: 2301_82146483 Merged-by: cann-robot Description: ## 关联 Issues Closes #61, #62, #63, #64, #65, #66, #67, #68, #69, #70, #71, #72, #75 ## 背景 仓库中复数 BLAS 算子接口以及少数实数BLAS算子接口与标准BLAS算子存在三类风格差异: 1. 维度参数使用 int64_t 而非 int 2. 标量 alpha/beta/c/s 按值传递而非指针传递 3. 只读输入指针缺少 const 修饰 此外 aclblasCcopy 参数顺序为 (x, y, n, incx, incy),与 BLAS 标准和同库 aclblasScopy 的 (n, x, incx, y, incy) 不一致。 ## 本次 PR 内容 ### 三类风格统一 将 15 个算子的接口签名对齐到与标准浮点算子一致: | 改动类型 | 说明 | |---|---| | int64_t → int | n/m/incx/incy/lda/batchCount 等维度参数统一为 int | | 按值 → 指针 | const aclblasComplex alpha → const aclblasComplex* alpha;const float c, const float s → const float* c, const float* s | | 补 const | 只读输入指针 x/y/A 添加 const 修饰 | | 空指针检查 | 所有指针传递的标量参数(alpha/beta/c/s)在函数体开头添加 nullptr 检查 | | 溢出防护 | n * 2 表达式在乘法前加 static_cast 避免 int 溢出 | ### Ccopy 参数顺序修正 aclblasCcopy 参数顺序从 (handle, x, y, n, incx, incy) 修正为 (handle, n, x, incx, y, incy),与 BLAS 标准一致。 ### 涉及算子清单(15 个) | Issue | 算子 | 改动要点 | |---|---|---| | #61 | aclblasCaxpy | int64_t→int + alpha→指针 + const(x) + nullptr check | | #62 | aclblasCcopy | 参数顺序修正 + int64_t→int + const(x) | | #63 | aclblasCdotc | int64_t→int | | #64 | aclblasCdotu | int64_t→int | | #65 | aclblasCgemvBatched | int64_t→int + alpha/beta→指针 + const(A,x) + nullptr check | | #66 | aclblasCgemv | int64_t→int + alpha/beta→指针 + const(A,x) + nullptr check | | #67 | aclblasCgerc | int64_t→int + alpha→指针 + const(x,y) + nullptr check | | #68 | aclblasCscal | int64_t→int + alpha→指针 + nullptr check | | #69 | aclblasCsrot | int64_t→int + c/s→指针 + nullptr check | | #70 | aclblasCsscal | int64_t→int + alpha→指针 + nullptr check + 溢出防护 | | #71 | aclblasCswap | int64_t→int | | #72 | aclblasCtrmv | int64_t→int + const(A) | | #75 | aclblasScnrm2 | int64_t→int + const(x) + 溢出防护 | | — | aclblasSdot | int64_t→int(风格统一) | | — | aclblasSsymm | int64_t→int(风格统一) | ### 实现策略 - Host 实现内部通过 const_cast 桥接到 kernel_do 函数(接受 uint8_t*),**Kernel 二进制不变** - alpha/beta 解引用:alpha.real → alpha->real - 测试调用点:alpha → &alpha,局部变量 int64_t → int ## 测试结果 远端 Ascend 910B3(arch22)环境构建与测试(15 个算子全部通过): | 测试 | 结果 | |------|------| | caxpy | PASS | | cscal | PASS | | sscal | PASS | | csrot | PASS | | cswap | PASS | | cdot | PASS | | scopy | PASS | | snrm2 | PASS | | cgemv | PASS | | cgerc | PASS | | ctrmv | PASS | | cgemv_batched | PASS | | sdot | PASS | | ssymm | PASS | See merge request: cann/ops-blas!316 | 1 个月前 | |
fix(complex): 统一复数 BLAS 算子接口对齐 BLAS 标准(issues #61-#75) Co-authored-by: 2301_82146483<2556943601@qq.com> # message auto-generated for no-merge-commit merge: !316 merge fix/complex-blas-interface-alignment into master fix(complex): 统一复数 BLAS 算子接口对齐 BLAS 标准(issues #61-#75) Created-by: 2301_82146483 Commit-by: 2301_82146483 Merged-by: cann-robot Description: ## 关联 Issues Closes #61, #62, #63, #64, #65, #66, #67, #68, #69, #70, #71, #72, #75 ## 背景 仓库中复数 BLAS 算子接口以及少数实数BLAS算子接口与标准BLAS算子存在三类风格差异: 1. 维度参数使用 int64_t 而非 int 2. 标量 alpha/beta/c/s 按值传递而非指针传递 3. 只读输入指针缺少 const 修饰 此外 aclblasCcopy 参数顺序为 (x, y, n, incx, incy),与 BLAS 标准和同库 aclblasScopy 的 (n, x, incx, y, incy) 不一致。 ## 本次 PR 内容 ### 三类风格统一 将 15 个算子的接口签名对齐到与标准浮点算子一致: | 改动类型 | 说明 | |---|---| | int64_t → int | n/m/incx/incy/lda/batchCount 等维度参数统一为 int | | 按值 → 指针 | const aclblasComplex alpha → const aclblasComplex* alpha;const float c, const float s → const float* c, const float* s | | 补 const | 只读输入指针 x/y/A 添加 const 修饰 | | 空指针检查 | 所有指针传递的标量参数(alpha/beta/c/s)在函数体开头添加 nullptr 检查 | | 溢出防护 | n * 2 表达式在乘法前加 static_cast 避免 int 溢出 | ### Ccopy 参数顺序修正 aclblasCcopy 参数顺序从 (handle, x, y, n, incx, incy) 修正为 (handle, n, x, incx, y, incy),与 BLAS 标准一致。 ### 涉及算子清单(15 个) | Issue | 算子 | 改动要点 | |---|---|---| | #61 | aclblasCaxpy | int64_t→int + alpha→指针 + const(x) + nullptr check | | #62 | aclblasCcopy | 参数顺序修正 + int64_t→int + const(x) | | #63 | aclblasCdotc | int64_t→int | | #64 | aclblasCdotu | int64_t→int | | #65 | aclblasCgemvBatched | int64_t→int + alpha/beta→指针 + const(A,x) + nullptr check | | #66 | aclblasCgemv | int64_t→int + alpha/beta→指针 + const(A,x) + nullptr check | | #67 | aclblasCgerc | int64_t→int + alpha→指针 + const(x,y) + nullptr check | | #68 | aclblasCscal | int64_t→int + alpha→指针 + nullptr check | | #69 | aclblasCsrot | int64_t→int + c/s→指针 + nullptr check | | #70 | aclblasCsscal | int64_t→int + alpha→指针 + nullptr check + 溢出防护 | | #71 | aclblasCswap | int64_t→int | | #72 | aclblasCtrmv | int64_t→int + const(A) | | #75 | aclblasScnrm2 | int64_t→int + const(x) + 溢出防护 | | — | aclblasSdot | int64_t→int(风格统一) | | — | aclblasSsymm | int64_t→int(风格统一) | ### 实现策略 - Host 实现内部通过 const_cast 桥接到 kernel_do 函数(接受 uint8_t*),**Kernel 二进制不变** - alpha/beta 解引用:alpha.real → alpha->real - 测试调用点:alpha → &alpha,局部变量 int64_t → int ## 测试结果 远端 Ascend 910B3(arch22)环境构建与测试(15 个算子全部通过): | 测试 | 结果 | |------|------| | caxpy | PASS | | cscal | PASS | | sscal | PASS | | csrot | PASS | | cswap | PASS | | cdot | PASS | | scopy | PASS | | snrm2 | PASS | | cgemv | PASS | | cgerc | PASS | | ctrmv | PASS | | cgemv_batched | PASS | | sdot | PASS | | ssymm | PASS | See merge request: cann/ops-blas!316 | 1 个月前 | |
Fix: Handle 类型由 void* 改为前向声明结构体指针风格,对齐 cuBLAS/ROCm Co-authored-by: Zitao Wang<wangzitao4@huawei.com> # message auto-generated for no-merge-commit merge: !277 merge issue_110_258 into master Fix: Handle 类型由 void* 改为前向声明结构体指针风格,对齐 cuBLAS/ROCm Created-by: wangzitao_leo Commit-by: Zitao Wang Merged-by: cann-robot Description: ## 描述 将 aclblasHandle_t 和 aclblasLtHandle_t 从 void* 改为前向声明结构体指针(typedef struct _aclblas_handle* aclblasHandle_t),对齐 cuBLAS/ROCm 主流标准,获得编译期类型校验。Descriptor 类型此前已完成结构体指针化改造,本次仅涉及 Handle。清理了所有冗余的 reinterpret_cast 和 trivial 辅助函数。 ### 改动范围 **核心改动(2 个公开头文件):** - include/cann_ops_blas.h:typedef void* aclblasHandle_t → typedef struct _aclblas_handle* aclblasHandle_t - include/cann_ops_blasLt.h:typedef void* aclblasLtHandle_t → typedef struct aclblasLtHandle* aclblasLtHandle_t **清理改动(90 个文件):** - 删除 3 个 trivial 辅助函数(ToInternalHandle、ToInternal x2) - 移除 92 处 reinterpret_cast<_aclblas_handle*>(handle) → 直接用 handle - 移除 3 处 reinterpret_cast<aclblasLtHandle*>(lightHandle) → 直接用 lightHandle - 移除 2 处反向 cast(reinterpret_cast<void*>(h) / reinterpret_cast<aclblasLtHandle_t>(h))→ 直接赋值 - 更新 1 处过时注释 ### ABI 兼容性 指针的二进制表示不变,无 ABI 破坏。 ## 关联的Issue [#110](https://gitcode.com/cann/ops-blas/issues/110) ## 测试 所有 host 侧目标文件(80+ 算子 host、aclblas_auxiliary、blasLt API)零错误编译通过;grep 确认零遗留 reinterpret_cast 和 ToInternalHandle/ToInternal;ABI 无破坏(指针二进制表示不变)。 ## 文档更新 无需文档更新,API 签名不变。 ## 类型标签 - [x] Bug修复 - [ ] 新特性 - [ ] 性能优化 - [ ] 文档更新 - [ ] 其他,请描述: See merge request: cann/ops-blas!277 | 1 个月前 | |
Fix: Handle 类型由 void* 改为前向声明结构体指针风格,对齐 cuBLAS/ROCm Co-authored-by: Zitao Wang<wangzitao4@huawei.com> # message auto-generated for no-merge-commit merge: !277 merge issue_110_258 into master Fix: Handle 类型由 void* 改为前向声明结构体指针风格,对齐 cuBLAS/ROCm Created-by: wangzitao_leo Commit-by: Zitao Wang Merged-by: cann-robot Description: ## 描述 将 aclblasHandle_t 和 aclblasLtHandle_t 从 void* 改为前向声明结构体指针(typedef struct _aclblas_handle* aclblasHandle_t),对齐 cuBLAS/ROCm 主流标准,获得编译期类型校验。Descriptor 类型此前已完成结构体指针化改造,本次仅涉及 Handle。清理了所有冗余的 reinterpret_cast 和 trivial 辅助函数。 ### 改动范围 **核心改动(2 个公开头文件):** - include/cann_ops_blas.h:typedef void* aclblasHandle_t → typedef struct _aclblas_handle* aclblasHandle_t - include/cann_ops_blasLt.h:typedef void* aclblasLtHandle_t → typedef struct aclblasLtHandle* aclblasLtHandle_t **清理改动(90 个文件):** - 删除 3 个 trivial 辅助函数(ToInternalHandle、ToInternal x2) - 移除 92 处 reinterpret_cast<_aclblas_handle*>(handle) → 直接用 handle - 移除 3 处 reinterpret_cast<aclblasLtHandle*>(lightHandle) → 直接用 lightHandle - 移除 2 处反向 cast(reinterpret_cast<void*>(h) / reinterpret_cast<aclblasLtHandle_t>(h))→ 直接赋值 - 更新 1 处过时注释 ### ABI 兼容性 指针的二进制表示不变,无 ABI 破坏。 ## 关联的Issue [#110](https://gitcode.com/cann/ops-blas/issues/110) ## 测试 所有 host 侧目标文件(80+ 算子 host、aclblas_auxiliary、blasLt API)零错误编译通过;grep 确认零遗留 reinterpret_cast 和 ToInternalHandle/ToInternal;ABI 无破坏(指针二进制表示不变)。 ## 文档更新 无需文档更新,API 签名不变。 ## 类型标签 - [x] Bug修复 - [ ] 新特性 - [ ] 性能优化 - [ ] 文档更新 - [ ] 其他,请描述: See merge request: cann/ops-blas!277 | 1 个月前 | |
Fix: Handle 类型由 void* 改为前向声明结构体指针风格,对齐 cuBLAS/ROCm Co-authored-by: Zitao Wang<wangzitao4@huawei.com> # message auto-generated for no-merge-commit merge: !277 merge issue_110_258 into master Fix: Handle 类型由 void* 改为前向声明结构体指针风格,对齐 cuBLAS/ROCm Created-by: wangzitao_leo Commit-by: Zitao Wang Merged-by: cann-robot Description: ## 描述 将 aclblasHandle_t 和 aclblasLtHandle_t 从 void* 改为前向声明结构体指针(typedef struct _aclblas_handle* aclblasHandle_t),对齐 cuBLAS/ROCm 主流标准,获得编译期类型校验。Descriptor 类型此前已完成结构体指针化改造,本次仅涉及 Handle。清理了所有冗余的 reinterpret_cast 和 trivial 辅助函数。 ### 改动范围 **核心改动(2 个公开头文件):** - include/cann_ops_blas.h:typedef void* aclblasHandle_t → typedef struct _aclblas_handle* aclblasHandle_t - include/cann_ops_blasLt.h:typedef void* aclblasLtHandle_t → typedef struct aclblasLtHandle* aclblasLtHandle_t **清理改动(90 个文件):** - 删除 3 个 trivial 辅助函数(ToInternalHandle、ToInternal x2) - 移除 92 处 reinterpret_cast<_aclblas_handle*>(handle) → 直接用 handle - 移除 3 处 reinterpret_cast<aclblasLtHandle*>(lightHandle) → 直接用 lightHandle - 移除 2 处反向 cast(reinterpret_cast<void*>(h) / reinterpret_cast<aclblasLtHandle_t>(h))→ 直接赋值 - 更新 1 处过时注释 ### ABI 兼容性 指针的二进制表示不变,无 ABI 破坏。 ## 关联的Issue [#110](https://gitcode.com/cann/ops-blas/issues/110) ## 测试 所有 host 侧目标文件(80+ 算子 host、aclblas_auxiliary、blasLt API)零错误编译通过;grep 确认零遗留 reinterpret_cast 和 ToInternalHandle/ToInternal;ABI 无破坏(指针二进制表示不变)。 ## 文档更新 无需文档更新,API 签名不变。 ## 类型标签 - [x] Bug修复 - [ ] 新特性 - [ ] 性能优化 - [ ] 文档更新 - [ ] 其他,请描述: See merge request: cann/ops-blas!277 | 1 个月前 | |
Feat: 新增面向arch35的aclblasSsyrkx接口 Co-authored-by: eternityk<taoyikun@huawei.com> # message auto-generated for no-merge-commit merge: !300 merge aclblasSsyrkx into master Feat: 新增面向arch35的aclblasSsyrkx接口 Created-by: eternityk Commit-by: eternityk Merged-by: cann-robot Description: ## 描述 BLAS Level-3 对称秩-k 更新(变体)接口 aclblasSsyrkx 当前缺少 DAV_3510(ascend950)架构的支持。本次新增 arch35 实现,使 Ssyrkx 在 ascend950 上可用。 Ssyrkx 计算公式: C = alpha * op(A) * op(B)^T + beta * C 其中 op(X) = X(trans=N)或 op(X) = X^T(trans=T),C 为 n×n 对称矩阵(仅更新 uplo 指定三角),A/B 为 n×k 或 k×n 矩阵(A≠B)。 ## 关联的Issue [#337](https://gitcode.com/cann/ops-blas/issues/337) ## 测试  ## 文档更新 <!--如果这个PR包含文档的更新,请在这里指出。例如:更新了README.md文件。--> ## 类型标签 <!-- [x] 表示选中 --> - [ ] Bug修复 - [x] 新特性 - [ ] 性能优化 - [ ] 文档更新 - [ ] 其他,请描述: See merge request: cann/ops-blas!300 | 1 个月前 | |
Feat: 新增面向arch35的aclblasSsyrkx接口 Co-authored-by: eternityk<taoyikun@huawei.com> # message auto-generated for no-merge-commit merge: !300 merge aclblasSsyrkx into master Feat: 新增面向arch35的aclblasSsyrkx接口 Created-by: eternityk Commit-by: eternityk Merged-by: cann-robot Description: ## 描述 BLAS Level-3 对称秩-k 更新(变体)接口 aclblasSsyrkx 当前缺少 DAV_3510(ascend950)架构的支持。本次新增 arch35 实现,使 Ssyrkx 在 ascend950 上可用。 Ssyrkx 计算公式: C = alpha * op(A) * op(B)^T + beta * C 其中 op(X) = X(trans=N)或 op(X) = X^T(trans=T),C 为 n×n 对称矩阵(仅更新 uplo 指定三角),A/B 为 n×k 或 k×n 矩阵(A≠B)。 ## 关联的Issue [#337](https://gitcode.com/cann/ops-blas/issues/337) ## 测试  ## 文档更新 <!--如果这个PR包含文档的更新,请在这里指出。例如:更新了README.md文件。--> ## 类型标签 <!-- [x] 表示选中 --> - [ ] Bug修复 - [x] 新特性 - [ ] 性能优化 - [ ] 文档更新 - [ ] 其他,请描述: See merge request: cann/ops-blas!300 | 1 个月前 | |
Feat: 新增面向arch35的aclblasCherk接口 Co-authored-by: eternityk<taoyikun@huawei.com> # message auto-generated for no-merge-commit merge: !320 merge aclblasCherk into master Feat: 新增面向arch35的aclblasCherk接口 Created-by: eternityk Commit-by: eternityk Merged-by: cann-robot Description: ## 描述 BLAS Level 3 标准接口中的 HERK(Hermitian Rank-k Update)算子用于计算复数 Hermitian 矩阵的秩-k 更新: C = alpha·A·A^H + beta·C。当前 ops-blas 仓缺少该算子的 arch35 实现,需要新增 aclblasCherk 接口以补全 BLAS Level 3 复数算子覆盖范围。 ## 关联的Issue [#345](https://gitcode.com/cann/ops-blas/issues/345) ## 测试  ## 文档更新 <!--如果这个PR包含文档的更新,请在这里指出。例如:更新了README.md文件。--> ## 类型标签 <!-- [x] 表示选中 --> - [ ] Bug修复 - [x] 新特性 - [ ] 性能优化 - [ ] 文档更新 - [ ] 其他,请描述: See merge request: cann/ops-blas!320 | 30 天前 | |
Fix: Handle 类型由 void* 改为前向声明结构体指针风格,对齐 cuBLAS/ROCm Co-authored-by: Zitao Wang<wangzitao4@huawei.com> # message auto-generated for no-merge-commit merge: !277 merge issue_110_258 into master Fix: Handle 类型由 void* 改为前向声明结构体指针风格,对齐 cuBLAS/ROCm Created-by: wangzitao_leo Commit-by: Zitao Wang Merged-by: cann-robot Description: ## 描述 将 aclblasHandle_t 和 aclblasLtHandle_t 从 void* 改为前向声明结构体指针(typedef struct _aclblas_handle* aclblasHandle_t),对齐 cuBLAS/ROCm 主流标准,获得编译期类型校验。Descriptor 类型此前已完成结构体指针化改造,本次仅涉及 Handle。清理了所有冗余的 reinterpret_cast 和 trivial 辅助函数。 ### 改动范围 **核心改动(2 个公开头文件):** - include/cann_ops_blas.h:typedef void* aclblasHandle_t → typedef struct _aclblas_handle* aclblasHandle_t - include/cann_ops_blasLt.h:typedef void* aclblasLtHandle_t → typedef struct aclblasLtHandle* aclblasLtHandle_t **清理改动(90 个文件):** - 删除 3 个 trivial 辅助函数(ToInternalHandle、ToInternal x2) - 移除 92 处 reinterpret_cast<_aclblas_handle*>(handle) → 直接用 handle - 移除 3 处 reinterpret_cast<aclblasLtHandle*>(lightHandle) → 直接用 lightHandle - 移除 2 处反向 cast(reinterpret_cast<void*>(h) / reinterpret_cast<aclblasLtHandle_t>(h))→ 直接赋值 - 更新 1 处过时注释 ### ABI 兼容性 指针的二进制表示不变,无 ABI 破坏。 ## 关联的Issue [#110](https://gitcode.com/cann/ops-blas/issues/110) ## 测试 所有 host 侧目标文件(80+ 算子 host、aclblas_auxiliary、blasLt API)零错误编译通过;grep 确认零遗留 reinterpret_cast 和 ToInternalHandle/ToInternal;ABI 无破坏(指针二进制表示不变)。 ## 文档更新 无需文档更新,API 签名不变。 ## 类型标签 - [x] Bug修复 - [ ] 新特性 - [ ] 性能优化 - [ ] 文档更新 - [ ] 其他,请描述: See merge request: cann/ops-blas!277 | 1 个月前 | |
Fix: Handle 类型由 void* 改为前向声明结构体指针风格,对齐 cuBLAS/ROCm Co-authored-by: Zitao Wang<wangzitao4@huawei.com> # message auto-generated for no-merge-commit merge: !277 merge issue_110_258 into master Fix: Handle 类型由 void* 改为前向声明结构体指针风格,对齐 cuBLAS/ROCm Created-by: wangzitao_leo Commit-by: Zitao Wang Merged-by: cann-robot Description: ## 描述 将 aclblasHandle_t 和 aclblasLtHandle_t 从 void* 改为前向声明结构体指针(typedef struct _aclblas_handle* aclblasHandle_t),对齐 cuBLAS/ROCm 主流标准,获得编译期类型校验。Descriptor 类型此前已完成结构体指针化改造,本次仅涉及 Handle。清理了所有冗余的 reinterpret_cast 和 trivial 辅助函数。 ### 改动范围 **核心改动(2 个公开头文件):** - include/cann_ops_blas.h:typedef void* aclblasHandle_t → typedef struct _aclblas_handle* aclblasHandle_t - include/cann_ops_blasLt.h:typedef void* aclblasLtHandle_t → typedef struct aclblasLtHandle* aclblasLtHandle_t **清理改动(90 个文件):** - 删除 3 个 trivial 辅助函数(ToInternalHandle、ToInternal x2) - 移除 92 处 reinterpret_cast<_aclblas_handle*>(handle) → 直接用 handle - 移除 3 处 reinterpret_cast<aclblasLtHandle*>(lightHandle) → 直接用 lightHandle - 移除 2 处反向 cast(reinterpret_cast<void*>(h) / reinterpret_cast<aclblasLtHandle_t>(h))→ 直接赋值 - 更新 1 处过时注释 ### ABI 兼容性 指针的二进制表示不变,无 ABI 破坏。 ## 关联的Issue [#110](https://gitcode.com/cann/ops-blas/issues/110) ## 测试 所有 host 侧目标文件(80+ 算子 host、aclblas_auxiliary、blasLt API)零错误编译通过;grep 确认零遗留 reinterpret_cast 和 ToInternalHandle/ToInternal;ABI 无破坏(指针二进制表示不变)。 ## 文档更新 无需文档更新,API 签名不变。 ## 类型标签 - [x] Bug修复 - [ ] 新特性 - [ ] 性能优化 - [ ] 文档更新 - [ ] 其他,请描述: See merge request: cann/ops-blas!277 | 1 个月前 | |
Fix: Handle 类型由 void* 改为前向声明结构体指针风格,对齐 cuBLAS/ROCm Co-authored-by: Zitao Wang<wangzitao4@huawei.com> # message auto-generated for no-merge-commit merge: !277 merge issue_110_258 into master Fix: Handle 类型由 void* 改为前向声明结构体指针风格,对齐 cuBLAS/ROCm Created-by: wangzitao_leo Commit-by: Zitao Wang Merged-by: cann-robot Description: ## 描述 将 aclblasHandle_t 和 aclblasLtHandle_t 从 void* 改为前向声明结构体指针(typedef struct _aclblas_handle* aclblasHandle_t),对齐 cuBLAS/ROCm 主流标准,获得编译期类型校验。Descriptor 类型此前已完成结构体指针化改造,本次仅涉及 Handle。清理了所有冗余的 reinterpret_cast 和 trivial 辅助函数。 ### 改动范围 **核心改动(2 个公开头文件):** - include/cann_ops_blas.h:typedef void* aclblasHandle_t → typedef struct _aclblas_handle* aclblasHandle_t - include/cann_ops_blasLt.h:typedef void* aclblasLtHandle_t → typedef struct aclblasLtHandle* aclblasLtHandle_t **清理改动(90 个文件):** - 删除 3 个 trivial 辅助函数(ToInternalHandle、ToInternal x2) - 移除 92 处 reinterpret_cast<_aclblas_handle*>(handle) → 直接用 handle - 移除 3 处 reinterpret_cast<aclblasLtHandle*>(lightHandle) → 直接用 lightHandle - 移除 2 处反向 cast(reinterpret_cast<void*>(h) / reinterpret_cast<aclblasLtHandle_t>(h))→ 直接赋值 - 更新 1 处过时注释 ### ABI 兼容性 指针的二进制表示不变,无 ABI 破坏。 ## 关联的Issue [#110](https://gitcode.com/cann/ops-blas/issues/110) ## 测试 所有 host 侧目标文件(80+ 算子 host、aclblas_auxiliary、blasLt API)零错误编译通过;grep 确认零遗留 reinterpret_cast 和 ToInternalHandle/ToInternal;ABI 无破坏(指针二进制表示不变)。 ## 文档更新 无需文档更新,API 签名不变。 ## 类型标签 - [x] Bug修复 - [ ] 新特性 - [ ] 性能优化 - [ ] 文档更新 - [ ] 其他,请描述: See merge request: cann/ops-blas!277 | 1 个月前 | |
Fix: Handle 类型由 void* 改为前向声明结构体指针风格,对齐 cuBLAS/ROCm Co-authored-by: Zitao Wang<wangzitao4@huawei.com> # message auto-generated for no-merge-commit merge: !277 merge issue_110_258 into master Fix: Handle 类型由 void* 改为前向声明结构体指针风格,对齐 cuBLAS/ROCm Created-by: wangzitao_leo Commit-by: Zitao Wang Merged-by: cann-robot Description: ## 描述 将 aclblasHandle_t 和 aclblasLtHandle_t 从 void* 改为前向声明结构体指针(typedef struct _aclblas_handle* aclblasHandle_t),对齐 cuBLAS/ROCm 主流标准,获得编译期类型校验。Descriptor 类型此前已完成结构体指针化改造,本次仅涉及 Handle。清理了所有冗余的 reinterpret_cast 和 trivial 辅助函数。 ### 改动范围 **核心改动(2 个公开头文件):** - include/cann_ops_blas.h:typedef void* aclblasHandle_t → typedef struct _aclblas_handle* aclblasHandle_t - include/cann_ops_blasLt.h:typedef void* aclblasLtHandle_t → typedef struct aclblasLtHandle* aclblasLtHandle_t **清理改动(90 个文件):** - 删除 3 个 trivial 辅助函数(ToInternalHandle、ToInternal x2) - 移除 92 处 reinterpret_cast<_aclblas_handle*>(handle) → 直接用 handle - 移除 3 处 reinterpret_cast<aclblasLtHandle*>(lightHandle) → 直接用 lightHandle - 移除 2 处反向 cast(reinterpret_cast<void*>(h) / reinterpret_cast<aclblasLtHandle_t>(h))→ 直接赋值 - 更新 1 处过时注释 ### ABI 兼容性 指针的二进制表示不变,无 ABI 破坏。 ## 关联的Issue [#110](https://gitcode.com/cann/ops-blas/issues/110) ## 测试 所有 host 侧目标文件(80+ 算子 host、aclblas_auxiliary、blasLt API)零错误编译通过;grep 确认零遗留 reinterpret_cast 和 ToInternalHandle/ToInternal;ABI 无破坏(指针二进制表示不变)。 ## 文档更新 无需文档更新,API 签名不变。 ## 类型标签 - [x] Bug修复 - [ ] 新特性 - [ ] 性能优化 - [ ] 文档更新 - [ ] 其他,请描述: See merge request: cann/ops-blas!277 | 1 个月前 | |
fix(trmm):aclblasStrmm 接口参数对齐 BLAS 标准 Co-authored-by: eternityk<taoyikun@huawei.com> # message auto-generated for no-merge-commit merge: !272 merge master into master fix(trmm):aclblasStrmm 接口参数对齐 BLAS 标准 Created-by: eternityk Commit-by: eternityk Merged-by: cann-robot Description: ## 描述 aclblasStrmm 接口参数设计不符合 BLAS 标准。当前接口采用 in-place 设计(结果写回 B 矩阵),缺少独立的输出矩阵 C 及其主维参数 ldc;维度参数 m/n/lda/ldb 使用 int64_t 而非 BLAS 标准的 int 类型;参数命名 transA 与标准 BLAS 的 trans 不一致。这导致接口与标准 BLAS TRMM 签名不兼容,用户迁移成本高。 ## 关联的Issue [#310](https://gitcode.com/cann/ops-blas/issues/310) ## 测试  ## 文档更新 更新了README.md文件。 ## 类型标签 <!-- [x] 表示选中 --> - [x] Bug修复 - [ ] 新特性 - [ ] 性能优化 - [ ] 文档更新 - [ ] 其他,请描述: See merge request: cann/ops-blas!272 | 1 个月前 | |
fix(complex): 统一复数 BLAS 算子接口对齐 BLAS 标准(issues #61-#75) Co-authored-by: 2301_82146483<2556943601@qq.com> # message auto-generated for no-merge-commit merge: !316 merge fix/complex-blas-interface-alignment into master fix(complex): 统一复数 BLAS 算子接口对齐 BLAS 标准(issues #61-#75) Created-by: 2301_82146483 Commit-by: 2301_82146483 Merged-by: cann-robot Description: ## 关联 Issues Closes #61, #62, #63, #64, #65, #66, #67, #68, #69, #70, #71, #72, #75 ## 背景 仓库中复数 BLAS 算子接口以及少数实数BLAS算子接口与标准BLAS算子存在三类风格差异: 1. 维度参数使用 int64_t 而非 int 2. 标量 alpha/beta/c/s 按值传递而非指针传递 3. 只读输入指针缺少 const 修饰 此外 aclblasCcopy 参数顺序为 (x, y, n, incx, incy),与 BLAS 标准和同库 aclblasScopy 的 (n, x, incx, y, incy) 不一致。 ## 本次 PR 内容 ### 三类风格统一 将 15 个算子的接口签名对齐到与标准浮点算子一致: | 改动类型 | 说明 | |---|---| | int64_t → int | n/m/incx/incy/lda/batchCount 等维度参数统一为 int | | 按值 → 指针 | const aclblasComplex alpha → const aclblasComplex* alpha;const float c, const float s → const float* c, const float* s | | 补 const | 只读输入指针 x/y/A 添加 const 修饰 | | 空指针检查 | 所有指针传递的标量参数(alpha/beta/c/s)在函数体开头添加 nullptr 检查 | | 溢出防护 | n * 2 表达式在乘法前加 static_cast 避免 int 溢出 | ### Ccopy 参数顺序修正 aclblasCcopy 参数顺序从 (handle, x, y, n, incx, incy) 修正为 (handle, n, x, incx, y, incy),与 BLAS 标准一致。 ### 涉及算子清单(15 个) | Issue | 算子 | 改动要点 | |---|---|---| | #61 | aclblasCaxpy | int64_t→int + alpha→指针 + const(x) + nullptr check | | #62 | aclblasCcopy | 参数顺序修正 + int64_t→int + const(x) | | #63 | aclblasCdotc | int64_t→int | | #64 | aclblasCdotu | int64_t→int | | #65 | aclblasCgemvBatched | int64_t→int + alpha/beta→指针 + const(A,x) + nullptr check | | #66 | aclblasCgemv | int64_t→int + alpha/beta→指针 + const(A,x) + nullptr check | | #67 | aclblasCgerc | int64_t→int + alpha→指针 + const(x,y) + nullptr check | | #68 | aclblasCscal | int64_t→int + alpha→指针 + nullptr check | | #69 | aclblasCsrot | int64_t→int + c/s→指针 + nullptr check | | #70 | aclblasCsscal | int64_t→int + alpha→指针 + nullptr check + 溢出防护 | | #71 | aclblasCswap | int64_t→int | | #72 | aclblasCtrmv | int64_t→int + const(A) | | #75 | aclblasScnrm2 | int64_t→int + const(x) + 溢出防护 | | — | aclblasSdot | int64_t→int(风格统一) | | — | aclblasSsymm | int64_t→int(风格统一) | ### 实现策略 - Host 实现内部通过 const_cast 桥接到 kernel_do 函数(接受 uint8_t*),**Kernel 二进制不变** - alpha/beta 解引用:alpha.real → alpha->real - 测试调用点:alpha → &alpha,局部变量 int64_t → int ## 测试结果 远端 Ascend 910B3(arch22)环境构建与测试(15 个算子全部通过): | 测试 | 结果 | |------|------| | caxpy | PASS | | cscal | PASS | | sscal | PASS | | csrot | PASS | | cswap | PASS | | cdot | PASS | | scopy | PASS | | snrm2 | PASS | | cgemv | PASS | | cgerc | PASS | | ctrmv | PASS | | cgemv_batched | PASS | | sdot | PASS | | ssymm | PASS | See merge request: cann/ops-blas!316 | 1 个月前 | |
fix(trsm,gemm): 为 strsm_blocked_kernel 和 gemm 添加 CANN-9.0.0 版本守卫 Co-authored-by: LambdaMiX<202400800552@mail.sdu.edu.cn> # message auto-generated for no-merge-commit merge: !319 merge fix/trsm-cann90-compat into master fix(trsm,gemm): 为 strsm_blocked_kernel 和 gemm 添加 CANN-9.0.0 版本守卫 Created-by: LambdaMiX Commit-by: LambdaMiX Merged-by: cann-robot Description: ## 描述 <!--在这里详细描述你的改动,包括改动的原因和所采取的方法。--> ### 问题描述 master 分支在 CANN-9.0.0 社区版下编译 Ascend950 算子失败(issue #313)。 根因: blas/trsm/arch35/strsm_blocked_kernel.cpp 的 GEMM kernel 部分依赖 tensor_api(ops-tensor 仓库),其底层调用的三个 intrinsic(asc_get_phy_buf_addr / asc_get_vf_len / asc_set_l0c2gm_channel_para)在 CANN-9.0.0 的 sys_var.h 中尚不存在(9.0.0 未引入 #elif __NPU_ARCH__ == 3510 块,9.1.0 才新增)。 同时发现 blas/gemm/arch35/gemm_kernel.cpp(commit 775719b 新增)存在相同问题,且两者均未纳入已有的版本守卫机制。 ### 修改内容 采用与 trmm / syrk / syr2k 等已有算子一致的版本守卫模式(devkit >= 9.1 编译,低版本跳过),共 5 文件 +46/-4 行,不修改任何算子逻辑: | 文件 | 改动 | |------|------| | cmake/asc_devkit_version.cmake | 新增 ENABLE_BLAS_TRSM_BLOCKED + ENABLE_BLAS_GEMM 变量 | | blas/CMakeLists.txt | devkit < 9.1 时排除 strsm_blocked_kernel + /gemm/arch35/ | | blas/trsm/arch35/strsm_host.cpp | #if 条件编译,低版本 LEFT 路径 fallback 到 SIMT | | blas/gemm/arch35/gemm_host.cpp | 低版本整体跳过(gemm 为新增算子,9.0.0 原不含) | | cmake/test.cmake | 低版本跳过 gemm 测试注册 | **strsm 低版本行为**:strsm_kernel.cpp(SIMT path)不依赖 tensor_api,低版本下功能完整,LEFT 路径全部 fallback 到 SIMT,仅大矩阵性能有所降低。 **gemm 低版本行为**:gemm 为 issue #313 之后新增算子,9.0.0 社区版原不含此算子,低版本下整体跳过,与 trmm/syrk 等已有守卫算子处理方式一致。 ## 关联的Issue <!-- 如果这个PR是为了解决特定的Issue,请在这里提供Issue链接。例如:关联Issue #000--> [#313](https://gitcode.com/cann/ops-blas/issues/313) ## 测试 <!--描述进行了哪些测试来验证你的改动。--> 在真实 CANN-9.0.0 社区版和 CANN-9.1.0-beta.1 双环境下验证: | 验证项 | CANN-9.0.0 | CANN-9.1.0 | |--------|:----------:|:----------:| | 编译 | ✅ 0 error(两文件正确跳过) | ✅ 0 error(全量编译) | | trsm 精度测试 | ✅ 119/119 PASS(SIMT path) | ✅ 119/119 PASS(含 blocked path) | 性能对比(blocked vs SIMT,chrono 精确计时,3 预热 + 7 次取中位数): - 大方阵(512×512 ~ 1024×1024):9.1.0 blocked 比 9.0.0 SIMT 快 2.2~5.1x - 小矩阵 / RIGHT 路径:无差异(同走 SIMT) - 9.0.0 下大矩阵性能退化 2~5 倍,功能正确,升级 9.1.0 后恢复 ## 文档更新 <!--如果这个PR包含文档的更新,请在这里指出。例如:更新了README.md文件。--> ## 类型标签 <!-- [x] 表示选中 --> - [x] Bug修复 - [ ] 新特性 - [ ] 性能优化 - [ ] 文档更新 - [ ] 其他,请描述: See merge request: cann/ops-blas!319 | 1 个月前 | |
Feat: 新增面向arch35的aclblasStrsmbatched接口 Co-authored-by: eternityk<taoyikun@huawei.com> # message auto-generated for no-merge-commit merge: !298 merge aclblasStrsmbatched into master Feat: 新增面向arch35的aclblasStrsmbatched接口 Created-by: eternityk Commit-by: eternityk Merged-by: cann-robot Description: ## 描述 BLAS Level-3 批量三角方程组求解接口 aclblasStrsmbatched 当前缺少 DAV_3510(ascend950)架构的支持。本次新增 arch35 实现,使 Strsmbatched 在 ascend950 上可用。 Strsmbatched 计算公式: side=LEFT: op(A_i) * X_i = alpha * B_i side=RIGHT: X_i * op(A_i) = alpha * B_i 其中 A_i 为 batchCount 个三角矩阵(仅存储 UPPER 或 LOWER 一个三角),B_i 为普通矩阵,op(A) 可为 A / A^T / A^H。 ## 关联的Issue [#335](https://gitcode.com/cann/ops-blas/issues/335) ## 测试  ## 文档更新 <!--如果这个PR包含文档的更新,请在这里指出。例如:更新了README.md文件。--> ## 类型标签 <!-- [x] 表示选中 --> - [ ] Bug修复 - [x] 新特性 - [ ] 性能优化 - [ ] 文档更新 - [ ] 其他,请描述: See merge request: cann/ops-blas!298 | 1 个月前 | |
Fix: Handle 类型由 void* 改为前向声明结构体指针风格,对齐 cuBLAS/ROCm Co-authored-by: Zitao Wang<wangzitao4@huawei.com> # message auto-generated for no-merge-commit merge: !277 merge issue_110_258 into master Fix: Handle 类型由 void* 改为前向声明结构体指针风格,对齐 cuBLAS/ROCm Created-by: wangzitao_leo Commit-by: Zitao Wang Merged-by: cann-robot Description: ## 描述 将 aclblasHandle_t 和 aclblasLtHandle_t 从 void* 改为前向声明结构体指针(typedef struct _aclblas_handle* aclblasHandle_t),对齐 cuBLAS/ROCm 主流标准,获得编译期类型校验。Descriptor 类型此前已完成结构体指针化改造,本次仅涉及 Handle。清理了所有冗余的 reinterpret_cast 和 trivial 辅助函数。 ### 改动范围 **核心改动(2 个公开头文件):** - include/cann_ops_blas.h:typedef void* aclblasHandle_t → typedef struct _aclblas_handle* aclblasHandle_t - include/cann_ops_blasLt.h:typedef void* aclblasLtHandle_t → typedef struct aclblasLtHandle* aclblasLtHandle_t **清理改动(90 个文件):** - 删除 3 个 trivial 辅助函数(ToInternalHandle、ToInternal x2) - 移除 92 处 reinterpret_cast<_aclblas_handle*>(handle) → 直接用 handle - 移除 3 处 reinterpret_cast<aclblasLtHandle*>(lightHandle) → 直接用 lightHandle - 移除 2 处反向 cast(reinterpret_cast<void*>(h) / reinterpret_cast<aclblasLtHandle_t>(h))→ 直接赋值 - 更新 1 处过时注释 ### ABI 兼容性 指针的二进制表示不变,无 ABI 破坏。 ## 关联的Issue [#110](https://gitcode.com/cann/ops-blas/issues/110) ## 测试 所有 host 侧目标文件(80+ 算子 host、aclblas_auxiliary、blasLt API)零错误编译通过;grep 确认零遗留 reinterpret_cast 和 ToInternalHandle/ToInternal;ABI 无破坏(指针二进制表示不变)。 ## 文档更新 无需文档更新,API 签名不变。 ## 类型标签 - [x] Bug修复 - [ ] 新特性 - [ ] 性能优化 - [ ] 文档更新 - [ ] 其他,请描述: See merge request: cann/ops-blas!277 | 1 个月前 | |
Fix: Handle 类型由 void* 改为前向声明结构体指针风格,对齐 cuBLAS/ROCm Co-authored-by: Zitao Wang<wangzitao4@huawei.com> # message auto-generated for no-merge-commit merge: !277 merge issue_110_258 into master Fix: Handle 类型由 void* 改为前向声明结构体指针风格,对齐 cuBLAS/ROCm Created-by: wangzitao_leo Commit-by: Zitao Wang Merged-by: cann-robot Description: ## 描述 将 aclblasHandle_t 和 aclblasLtHandle_t 从 void* 改为前向声明结构体指针(typedef struct _aclblas_handle* aclblasHandle_t),对齐 cuBLAS/ROCm 主流标准,获得编译期类型校验。Descriptor 类型此前已完成结构体指针化改造,本次仅涉及 Handle。清理了所有冗余的 reinterpret_cast 和 trivial 辅助函数。 ### 改动范围 **核心改动(2 个公开头文件):** - include/cann_ops_blas.h:typedef void* aclblasHandle_t → typedef struct _aclblas_handle* aclblasHandle_t - include/cann_ops_blasLt.h:typedef void* aclblasLtHandle_t → typedef struct aclblasLtHandle* aclblasLtHandle_t **清理改动(90 个文件):** - 删除 3 个 trivial 辅助函数(ToInternalHandle、ToInternal x2) - 移除 92 处 reinterpret_cast<_aclblas_handle*>(handle) → 直接用 handle - 移除 3 处 reinterpret_cast<aclblasLtHandle*>(lightHandle) → 直接用 lightHandle - 移除 2 处反向 cast(reinterpret_cast<void*>(h) / reinterpret_cast<aclblasLtHandle_t>(h))→ 直接赋值 - 更新 1 处过时注释 ### ABI 兼容性 指针的二进制表示不变,无 ABI 破坏。 ## 关联的Issue [#110](https://gitcode.com/cann/ops-blas/issues/110) ## 测试 所有 host 侧目标文件(80+ 算子 host、aclblas_auxiliary、blasLt API)零错误编译通过;grep 确认零遗留 reinterpret_cast 和 ToInternalHandle/ToInternal;ABI 无破坏(指针二进制表示不变)。 ## 文档更新 无需文档更新,API 签名不变。 ## 类型标签 - [x] Bug修复 - [ ] 新特性 - [ ] 性能优化 - [ ] 文档更新 - [ ] 其他,请描述: See merge request: cann/ops-blas!277 | 1 个月前 | |
Feat: 新增面向arch35的aclblasCherk接口 Co-authored-by: eternityk<taoyikun@huawei.com> # message auto-generated for no-merge-commit merge: !320 merge aclblasCherk into master Feat: 新增面向arch35的aclblasCherk接口 Created-by: eternityk Commit-by: eternityk Merged-by: cann-robot Description: ## 描述 BLAS Level 3 标准接口中的 HERK(Hermitian Rank-k Update)算子用于计算复数 Hermitian 矩阵的秩-k 更新: C = alpha·A·A^H + beta·C。当前 ops-blas 仓缺少该算子的 arch35 实现,需要新增 aclblasCherk 接口以补全 BLAS Level 3 复数算子覆盖范围。 ## 关联的Issue [#345](https://gitcode.com/cann/ops-blas/issues/345) ## 测试  ## 文档更新 <!--如果这个PR包含文档的更新,请在这里指出。例如:更新了README.md文件。--> ## 类型标签 <!-- [x] 表示选中 --> - [ ] Bug修复 - [x] 新特性 - [ ] 性能优化 - [ ] 文档更新 - [ ] 其他,请描述: See merge request: cann/ops-blas!320 | 30 天前 |
| 文件 | 最后提交记录 | 最后更新时间 |
|---|---|---|
| 1 个月前 | ||
| 1 个月前 | ||
| 1 个月前 | ||
| 1 个月前 | ||
| 1 个月前 | ||
| 1 个月前 | ||
| 1 个月前 | ||
| 1 个月前 | ||
| 1 个月前 | ||
| 28 天前 | ||
| 1 个月前 | ||
| 1 个月前 | ||
| 1 个月前 | ||
| 1 个月前 | ||
| 1 个月前 | ||
| 1 个月前 | ||
| 1 个月前 | ||
| 1 个月前 | ||
| 1 个月前 | ||
| 1 个月前 | ||
| 1 个月前 | ||
| 1 个月前 | ||
| 1 个月前 | ||
| 1 个月前 | ||
| 1 个月前 | ||
| 1 个月前 | ||
| 1 个月前 | ||
| 1 个月前 | ||
| 30 天前 | ||
| 1 个月前 | ||
| 1 个月前 | ||
| 1 个月前 | ||
| 1 个月前 | ||
| 1 个月前 | ||
| 2 个月前 | ||
| 1 个月前 | ||
| 1 个月前 | ||
| 1 个月前 | ||
| 1 个月前 | ||
| 1 个月前 | ||
| 1 个月前 | ||
| 1 个月前 | ||
| 1 个月前 | ||
| 1 个月前 | ||
| 1 个月前 | ||
| 1 个月前 | ||
| 1 个月前 | ||
| 1 个月前 | ||
| 1 个月前 | ||
| 1 个月前 | ||
| 1 个月前 | ||
| 1 个月前 | ||
| 30 天前 | ||
| 1 个月前 | ||
| 1 个月前 | ||
| 1 个月前 | ||
| 1 个月前 | ||
| 1 个月前 | ||
| 1 个月前 | ||
| 1 个月前 | ||
| 1 个月前 | ||
| 1 个月前 | ||
| 1 个月前 | ||
| 30 天前 |