CANN/asc-devkit GEMV矩阵向量计算
# GEMV【免费下载链接】asc-devkit本项目是CANN 推出的昇腾AI处理器专用的算子程序开发语言原生支持C和C标准规范主要由类库和语言扩展层构成提供多层级API满足多维场景算子开发诉求。项目地址: https://gitcode.com/cann/asc-devkit特性说明Gemv的核心功能体现为当矩阵A的维度M取值为1时接口会自动启用Gemv功能该操作退化为1×K维度的行向量与K×N维度矩阵之间的乘法运算。针对Ascend 950PR/Ascend 950DT产品可以通过设置MmadParams的disableGemv参数为true将该功能关闭。特性约束1×K矩阵A需满足512B地址对齐K个数据连续存储以half类型为例当K256时软件侧可视作16*16分块配置m1后硬件解析为1*256向量可通过LoadData接口将256个half数据从L1 Buffer搬至L0A Buffer。C矩阵是一个1*N的向量当1×N向量被划分为多个1×16子向量时每个子向量在L0C Buffer中占用1024Bu8/s8/f162f32。但实际有效数据仅占最低32B或64B。例如当N50时共划分4个1*16子向量占用4*512B 2048Bf162f16其中有效数据仅为4*32B 128B。图1GEMV模式矩阵乘示意图 ![GEMV模式-矩阵乘示意图](https://raw.gitcode.com/cann/asc-devkit/raw/53dc4118ba3145bede6cae97046a6ac4b1d500e4/docs/api/figures/mmad_gemv.png GEMV模式-矩阵乘示意图?utm_sourcegitcode_repo_files)使用优势M1时自动开启GEMV模式则矩阵乘法将M方向作为非对齐场景进行处理。GEMV模式相较于非对齐处理方式搬运数据量更少性能更好。下面以M1K256N32左右矩阵数据类型为half的矩阵乘示例说明。GEMV模式将A矩阵从L1 BufferTPosition:A1搬运到L0A BufferTPosition:A2时1*256的向量被当作16*16的矩阵进行处理调用LoadData接口一次完成16*16分形大小的矩阵搬运。B矩阵的搬运以及矩阵乘计算跟基础场景相同如下图所示。图2GEMV模式M1的矩阵乘计算示意图 ![GEMV模式M1的矩阵乘计算示意图](https://raw.gitcode.com/cann/asc-devkit/raw/53dc4118ba3145bede6cae97046a6ac4b1d500e4/docs/api/figures/mmad_gemv_compare.png GEMV模式M1的矩阵乘计算示意图?utm_sourcegitcode_repo_files)非GEMV模式将A矩阵从L1 BufferTPosition:A1搬运到L0A BufferTPosition:A2时1*256的向量被当作非对齐矩阵数据进行处理将M方向对齐到32字节后进行搬运。调用LoadData接口每次搬运16*16分形大小的矩阵一共搬运K/1616次导致搬运数据量增加性能相较于GEMV模式差如下图所示。图3非GEMV模式M!1的矩阵乘计算示意图 ![非GEMV模式M1的矩阵乘计算示意图](https://raw.gitcode.com/cann/asc-devkit/raw/53dc4118ba3145bede6cae97046a6ac4b1d500e4/docs/api/figures/mmad_nongemv_compare.png 非GEMV模式M1的矩阵乘计算示意图?utm_sourcegitcode_repo_files)使用示例表1示例配置说明矩阵维度大小数据类型A1 * 4096halfB4096 * 256halfC1 * 256floatA矩阵为1* 4096的向量从软件侧可以视为64*64的针对Ascend 950PR/Ascend 950DT产品为NZ分型数据通过LoadData搬运到L0A Buffer上C矩阵为1* 256的向量共可以划分为16个1 * 16的子向量占用16 * 1024B 16384B(f162f32)其中有效数据仅仅为16 * 64B 1024B图4GEMV模式矩阵乘示意图 ![GEMV模式-矩阵乘示意图-demo](https://raw.gitcode.com/cann/asc-devkit/raw/53dc4118ba3145bede6cae97046a6ac4b1d500e4/docs/api/figures/mmad_gemv_demo.png GEMV模式-矩阵乘示意图-demo?utm_sourcegitcode_repo_files)GEMV功能的完整示例GEMV样例。AscendC::MmadParams mmadParams; // 设置m 1自动使能GEMV能力 mmadParams.m 1; mmadParams.n n; mmadParams.k k; AscendC::Mmad(c, a, b, mmadParams);针对Ascend 950PR/Ascend 950DT产品可以通过设置MmadParams的disableGemv参数为true将该功能关闭示例如下AscendC::MmadParams mmadParams; // 设置m 1自动使能GEMV能力 mmadParams.m 1; mmadParams.n n; mmadParams.k k; // 关闭GEMV mmadParams.disableGemv true; AscendC::Mmad(c, a, b, mmadParams);【免费下载链接】asc-devkit本项目是CANN 推出的昇腾AI处理器专用的算子程序开发语言原生支持C和C标准规范主要由类库和语言扩展层构成提供多层级API满足多维场景算子开发诉求。项目地址: https://gitcode.com/cann/asc-devkit创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻