| 文件 | 最后提交记录 | 最后更新时间 |
|---|---|---|
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 | 27 天前 | |
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 | 28 天前 |
| 文件 | 最后提交记录 | 最后更新时间 |
|---|---|---|
| 27 天前 | ||
| 28 天前 |