CANN/ops-blas Cgemm算子测试说明
2026/5/9 21:35:32 网站建设 项目流程

Cgemm算子实现

【免费下载链接】ops-blas本项目是CANN提供的高性能线性代数计算以及轻量化GEMM调用算子库。项目地址: https://gitcode.com/cann/ops-blas

概述

BLAS Cgemm算子实现。

Cgemm(Complex General Matrix-Matrix multiplication)算子实现了复数矩阵乘法运算,是BLAS基础线性代数库中的核心算子之一。

该算子实现复数矩阵乘法:C = alpha * op(A) * op(B) + beta * C(支持转置和共轭转置)

支持的产品

  • Atlas A3 训练系列产品/Atlas A3 推理系列产品
  • Atlas A2 训练系列产品/Atlas A2 推理系列产品

目录结构介绍

├── cgemm │ ├── cgemm_kernel.cpp // 算子核函数实现(AIC+AIV混编) │ └── cgemm_host.cpp // 算子Host端实现 ├── test/cgemm │ ├── CMakeLists.txt // 编译工程文件 │ ├── README.md // 说明文档 │ └── cgemm_test.cpp // 算子调用样例

算子描述

  • 算子功能:
    cgemm算子实现了复数矩阵A与矩阵B的乘法运算,并加到矩阵C上。对应的数学表达式为:
C = alpha * op(A) * op(B) + beta * C

其中op(A)可以是:

  • A(不转置,transA=N)
  • A^T(转置,transA=T)
  • A^H(共轭转置,transA=C)

op(B)同理。

复数乘法公式:(a+bi) * (c+di) = (ac-bd) + (ad+bc)i

  • 对应的接口:
int aclblasCgemm(aclblasHandle handle, aclblasOperation transA, aclblasOperation transB, const int64_t m, const int64_t n, const int64_t k, const std::complex<float> &alpha, const std::complex<float> *A, const int64_t lda, const std::complex<float> *B, const int64_t ldb, const std::complex<float> &beta, std::complex<float> *C, const int64_t ldc, void *stream);
参数cgemm 参数说明
参数列表Param.Memoryin/out含义
handlehostinACL流handle,用于传入stream。
transAhostin矩阵A操作类型:N=不转置,T=转置,C=共轭转置。
transBhostin矩阵B操作类型:N=不转置,T=转置,C=共轭转置。
min矩阵A的行数、矩阵C的行数。
nin矩阵B的列数、矩阵C的列数。
kin矩阵A的列数、矩阵B的行数。
alphahostin复数标量alpha。
Adevicein复数矩阵A。
ldain矩阵A的主维长度。
Bdevicein复数矩阵B。
ldbin矩阵B的主维长度。
betahostin复数标量beta。
Cdevicein/out复数矩阵C。
ldcin矩阵C的主维长度。
  • 算子规格:

    算子类型(OpType)Cgemm
    算子输入nameshapedata typeformat
    AM * KcomplexND
    BK * NcomplexND
    算子输出CM * NcomplexND
    核函数名cgemm
  • 算子实现:

    本算子为AIC+AIV混编算子,采用流水线并行设计:

    • AIV端(Vector Core):执行ascblasCgemmPre进行虚实分离,将复数矩阵拆分为实部矩阵和虚部矩阵
    • AIC端(Cube Core):执行4次实矩阵乘法ascblasSmatmul,计算结果的实部和虚部
    • AIV端(Vector Core):执行ascblasCgemmFinal进行虚实合并,组装最终复数结果

    同步机制:

    • 使用FftsCrossCoreSync进行AIC和AIV之间的同步
    • 使用WaitFlagDev等待跨核事件

    使用vreducev2进行虚实分离,使用Gather进行虚实合并。

  • 调用实现
    使用内核调用符<<<>>>调用核函数。

编译运行

在本样例根目录下执行如下步骤,编译并执行算子。

  • 配置环境变量
    请根据当前环境上CANN开发套件包的安装方式,选择对应配置环境变量的命令。

    • 默认路径,root用户安装CANN软件包

      source /usr/local/Ascend/cann/set_env.sh
    • 默认路径,非root用户安装CANN软件包

      source $HOME/Ascend/cann/set_env.sh
    • 指定路径install_path,安装CANN软件包

      source ${install_path}/cann/set_env.sh
  • 样例执行

    bash build.sh --ops=cgemm --run # --ops=<算子名> --run可选参数,执行测试样例

    执行结果如下,说明精度对比成功。

    Testing cgemm: Output: ... Golden: ... [Success] Case accuracy is verification passed. [PASS] cgemm_test

【免费下载链接】ops-blas本项目是CANN提供的高性能线性代数计算以及轻量化GEMM调用算子库。项目地址: https://gitcode.com/cann/ops-blas

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询