当前位置: 首页 > article >正文

昇腾CANN ops-blas 仓:GEMM 算子的高性能实现

前言矩阵乘法是深度学习里最核心的操作没有之一。Transformer 的 Attention 要做 QK.T 和 PVFFN 要做两 个 MatMul。GEMMGeneral Matrix Multiply就是专门优化矩阵乘的算子。ops-blas 仓是 CANN 的线性代数基础算子库GEMM 是它的核心产品。这篇文章拆开看它怎么把 Cube 单元跑满的。GEMM 在深度学习中的地位GEMM 的全称是 General Matrix Multiply做的是 C alpha * A * B beta * C 这种通用矩阵乘法。在深度学习里的典型用法是# PyTorch 里的 Linear 层本质就是一个 GEMM# Y X W^T b# 写成 GEMM 格式就是 Y 1.0 * X W 0.0 * Y# 其中 X 是 (batch, input_dim)W 是 (output_dim, input_dim)# 矩阵乘的结果是 (batch, output_dim)Transformer 的核心计算几乎全是矩阵乘Attention 里的 QK.T 是 (batch, head, seq, head_dim) (batch, head, head_dim, seq) - (batch, head, seq, seq)FFN 里的两个 MatMul 分别是 hidden - intermediate 和 intermediate - hidden。大模型训练和推理的计算量 70% 以上都花在矩阵乘上优化 GEMM 就是优化整个模型。昇腾达芬奇架构的 Cube 单元昇腾达芬奇架构的计算核心是两个单元Cube 单元和 Vector 单元。Cube 单元专门做矩阵乘Vector 单元做向量和标量运算。Cube 单元的名字来自 3D Cube——它一次能处理三维张量的矩阵乘。具体来说Cube 单元一次可以做 16×16×16 的矩阵乘累加。这个 16×16×16 来自硬件设计每个 cycle 能跑 4096 个乘累加运算MAC在 FP16 精度下峰值算力是 256 TFLOPS Ascend 910。理解 Cube 单元的关键是tiling分块。要把一个大矩阵乘拆到 Cube 单元上跑需要把矩阵切成小块。每个小块要能装进 L1 Buffer然后交给 Cube 单元处理。tile 的大小选择直接影响性能太大了 L1 Buffer 不够用需要频繁读写 HBM太小了 Cube 单元的并行度上不去。ops-blas 仓的核心工作就是设计 tiling 策略——怎么切块能让 Cube 单元的利用率最高同时让 HBM 访问最少。ops-blas GEMM 的分块策略ops-blas 的 GEMM 实现用了多层 tiling。简单说就是“大块套小块”第一层是Core 级别的 tiling。Ascend 910 有多个 AI Core每个 Core 负责矩阵的一部分。ops-blas 会把矩阵按 Core 数量做切分把 A 按行切、把 B 按列切、每个 Core 拿自己那份去算。第二层是Tile 级别的 tiling。每个 Core 内部再把任务分成多个 tile。每个 tile 要满足两个约束能装进 L1 Buffer、能让 Cube 单元跑满。典型配置下A 按 16×K 切B 按 K×16 切C 产 16×16 的结果块。第三层是指令级别的 tiling。Cube 单元内部还有一层微 tiling用指令流水来隐藏内存访问延迟。看一段简化版的伪代码理解 tiling 逻辑// GEMM 核心计算A B - C// 这里展示 tiling 的思路voidgemm_core(half*A,half*B,half*C,intM,intN,intK,intM_tile,intN_tile,intK_tile){// M 方向切成 M_tile 大小的块for(inti0;iM;iM_tile){// N 方向切成 N_tile 大小的块for(intj0;jN;jN_tile){// C(i:iM_tile, j:jN_tile) // A(i:iM_tile, :) B(:, j:jN_tile)// 每个 C 块内部按 K 方向切half C_tile[M_tile][N_tile]{0};for(intk0;kK;kK_tile){// 加载 A 块从 HBM 到 L1// 这个 block 大小要能装进 L1 Bufferload_block(A,i,k,M_tile,K_tile);// 加载 B 块load_block(B,k,j,K_tile,N_tile);// Cube 单元执行矩阵乘// 一次跑 16x16x16 的 MACcube_mm(A_block,B_block,C_tile);}// 把结果写回 Cstore_block(C,i,j,C_tile);}}}双缓冲隐藏 HBM 访问延迟GEMM 的瓶颈往往不在计算而在数据搬运。从 HBM 加载 A 块和 B 块到 L1 的时间远大于 Cube 单元计算的时间。ops-blas 用双缓冲double buffering来解决这个问题。双缓冲的核心是算第 j 块的同时搬运第 j1 块。这样计算和数据搬运并行进行HBM 带宽的延迟被藏在 Cube 计算的背后。// 双缓冲示例计算和搬运并行voidgemm_with_double_buffer(half*A,half*B,half*C,intM,intN,intK){// 准备两个 buffer 轮换用half A_buf0[BLOCK_A],A_buf1[BLOCK_A];half B_buf0[BLOCK_B],B_buf1[BLOCK_B];intbuf_idx0;// 预加载第一块load_async(A_buf0,A0);load_async(B_buf0,B0);for(intk0;kK;kBLOCK_K){// 等待当前块加载完成wait_load();// 启动下一块的异步加载if(kBLOCK_KK){load_async(A_buf[1-buf_idx],A(kBLOCK_K));load_async(B_buf[1-buf_idx],B(kBLOCK_K));}// Cube 单元计算当前块cube_mm(A_buf[buf_idx],B_buf[buf_idx],C_block);// 切换 bufferbuf_idx1-buf_idx;}}这段代码展示了双缓冲的思路不是等上一块算完才开始搬下一块而是算着当前块的同时搬下一块。硬件上DMA 引擎负责 HBM 搬运和 Cube 单元负责计算是独立运行的只要调度得当两者可以完美 overlap。L1 Cache 优化除了双缓冲还有一个关键优化是L1 Cache 的利用。Cube 单元每次计算的输入 A 和 B 可以复用同一个 A 块要和多个 B 块相乘同一个 B 块要和多个 A 块相乘。把常用的数据块保持在 L1 Cache 里能大幅减少 HBM 访问。ops-blas 的 tiling 策略专门考虑了缓存复用A 块在 K 方向复用A(i, k) 这个块会和 B(k, j) 的所有 j 相乘所以 A 块一次性加载后可以留在 L1 里很久B 块在 M 方向复用B(k, j) 这个块会和 A(i, k) 的所有 i 相乘但复用的机会比 A 少一些实际效果是HBM 访问量能降到理论最低值的 1/3 到 1/2。性能数据不同配置下的实测数据Ascend 910FP16配置TFLOPS利用率MNK102423090%MNK204824595%MNK409625097%可以看到当矩阵尺寸变大时利用率更高因为大矩阵的缓存命中率更高HBM 延迟能被更好地隐藏。跟其他实现对比实现TFLOPSops-blas GEMM250cuBLAS (NVIDIA A100)312理论峰值256昇腾的 Cube 单元利用率已经非常接近理论峰值了。跟 NVIDIA 的差距主要在峰值算力上A100 的 Tensor Core 峰值比 Ascend 910 高但软件层面的优化已经做到位了。如何调用PyTorch 调用 GEMM 最简单的方式是通过 Linear 层importtorchimporttorch_npu# Linear 内部就是 GEMMlineartorch.nn.Linear(4096,11008).npu()xtorch.randn(1,4096,dtypetorch.float16).npu()# forward 会调用 ops-blas.GEMMylinear(x)print(y.shape)# (1, 11008)如果想直接调用 GEMM用于自定义算子开发可以用 AscendCL 接口importacl# 初始化 ACLacl.init()# 创建 GEMM 算子gemm_opacl.op.create_gemm(transaFalse,# A 不转置transbFalse,# B 不转置m1024,n1024,k1024,alpha1.0,beta0.0,a_formatND,b_formatND)# 执行aacl.malloc(1024*1024*2)# FP16bacl.malloc(1024*1024*2)cacl.malloc(1024*1024*2)gemm_op(a,b,c)GEMM 是深度学习计算的基础设施。ops-blas 把昇腾的 Cube 单元压榨到了接近理论峰值。对于做模型优化的人来说理解 GEMM 的 tiling 策略和缓存优化是进一步提升性能的前提。仓库地址https://atomgit.com/cann/ops-blas

相关文章:

昇腾CANN ops-blas 仓:GEMM 算子的高性能实现

前言 矩阵乘法是深度学习里最核心的操作,没有之一。Transformer 的 Attention 要做 QK.T 和 PV,FFN 要做两 个 MatMul。GEMM(General Matrix Multiply)就是专门优化矩阵乘的算子。ops-blas 仓是 CANN 的线性代数基础算子库&#x…...

2026 AI搜索迭代下的获客革新:SEOGEO双引擎战略落地实战方案

2026 AI搜索迭代下的获客革新:SEO&GEO双引擎战略落地实战方案摘要:2026年生成式AI全面渗透搜索场景,传统关键词SEO流量遭遇结构性下滑,零点击搜索成为行业常态。本文以泉州本地中小企业数字化服务场景为依托,深度剖…...

机械/土木 专业是否可以转嵌入式?

机械专业是否可以转嵌入式?总有人担心 “我学机械的能转嵌入式吗?”答案是:完全可以!连学土木工程的,我都带出了好几个成功转行嵌入式的! 干机械的甚至比纯 电子 / 计算机的 更有优势 !📌 为什么机械转嵌入…...

武林外传十年之约手游官网下载:武林外传十年之约最新官方下载渠道

《武林外传十年之约》又名《武林外传手游》《武林外传怀旧版》《武林外传正版复刻》,由安徽游昕联合忆往游戏运营的正版武侠 MMORPG 手游。1:1 复刻同福客栈、七侠镇、五霸岗、十八里铺等经典场景,完美还原枪豪、剑客、术士、医师四大职业体系&#xff0…...

植树的人数

include<iostream> using namespace std; int main() {int a ,x,y;cin>>a>>x>>y;for(int i 1;i<(a-(xy))/3;i){int j (a-i*x)/3;if(i*xj*y100){cout<<i<<" "<<j<<endl;}}return 0; }买糕点#include<iostream&…...

磁性轴承尺寸如何精准检测?蓝光扫描仪全尺寸3D检测解析

磁悬浮轴承是一种高性能轴承&#xff0c;它利用可控磁力将旋转的转子无接触地悬浮于空间中。作为核心支撑部件&#xff0c;磁性轴承对于定子内圆与转子外圆的同轴度、部件的形位公差提出了极高要求。对于磁性轴承3D尺寸检测&#xff0c;蓝光三维扫描仪凭借其非接触、高精度、高…...

USB外设概率性不识别问题详解

第一种情况&#xff0c;CPU主机端口下外接一个4口的扩展hub&#xff0c;但是扩展的hub端口概率性无法识别外设。如下log&#xff1a; 04-14 12:33:46.119450[ 18.884163] usb 3-1.2: new high-speed USB device number 4 using xhci-hcd 04-14 12:33:46.200327[ 18.964548]…...

使用workbuddy 30分钟搭建微信小程序

前言 今天发现一个超好用的工具WorkBuddy可以非常快速地进行搭建小程序&#xff0c;还有进行一些代码的修改&#xff0c;简直是一个开发小程序的好帮手&#xff0c;今天用一节很小的短篇介绍一下整个创建部署和搭建过程。 第一步下载workbuddy 创建小程序 首先需要下载work…...

企业内如何通过 Taotoken 实现 API 密钥的集中管理与访问审计

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 企业内如何通过 Taotoken 实现 API 密钥的集中管理与访问审计 在将大模型能力引入企业内部的业务流或开发流程时&#xff0c;一个常…...

Linux 环境变量详解及实例

Linux环境变量 1 ~/.bash_profile && ~/.bashrc 用户登陆Linux操作系统的时候&#xff0c;"/etc/profile", "~/.bash_profile"等配置文件会被自动执行。 执行过程是这样的&#xff1a; 登陆Linux系统时&#xff0c;首先启动"/etc/profil…...

linux学习笔记之linux文件管理

#文件系统及Shell的基本概念#文件及目录操作命令#VI的使用#软件包的管理一、文件系统及Shell的基本概念 1&#xff0e;文件系统的含义文件系统是用来管理和组织保存在磁盘驱动器上数据的系统软件 2&#xff0e;Linux的文件系统Linux系统采用虚拟文件系统技术&#xff08;VFS&am…...

lin诊断功能寻址和静态电流测试方法

lin诊断功能寻址是不会回响应的&#xff0c;不管正响应还是负响应&#xff0c;而且进入会话必须是10 83这种&#xff08;不知道是不是项目规定&#xff09;****************************************************************************************************这个数字电流…...

Codex入门第一步,5个基础设置,修改后让性价比翻倍!(附通用提示词模板)

开篇Codex App 主界面&#xff1a;对话框底部显示权限档位、工作区、本地模式和分支信息 Codex 现在不只是程序员的工具——不少非技术背景的职场人把它当"数字同事"&#xff1a;整理文件、查资料、跑浏览器抓数据。 但十个有八个&#xff0c;装好之后还是对着对话框…...

Java 读写 Excel 公式:从基础到高级的实战总结

做数据处理的朋友应该都遇到过这种场景&#xff1a;需要批量生成带公式的Excel报表&#xff0c;或者读取现有表格中的公式进行二次计算。以前我都是手动在Excel里写公式&#xff0c;后来发现用Java代码来处理更高效&#xff0c;尤其是数据量大的时候。 今天整理一下平时用得比较…...

昇腾CANN opbase与算子生态协作:从单一算子到完整计算图

前言 单个算子的性能再高&#xff0c;如果无法和其他算子高效协作&#xff0c;最终端到端的模型推理或训练性能也不会好。一个典型的深度学习模型包含几十到几百个算子&#xff0c;它们之间的数据流、内存分配、执行顺序都需要精心编排。opbase作为所有算子仓库的公共基础&…...

AI Agent Harness Engineering 反思机制3大实现路径:日志回溯 vs 强化学习 vs 人工反馈

AI Agent Harness Engineering 反思机制3大实现路径:日志回溯 vs 强化学习 vs 人工反馈 引言 痛点引入 想象一下:你花了整整两周,用 LangChain、AutoGPT 或者 LlamaIndex 搭了一个帮你写产品PRD草稿的AI Agent。你给它输入了竞品分析报告、用户访谈纪要、项目进度表,满心…...

牛客周赛 Round 142 C题及D题题解

首先是C题&#xff1a; 咱们先看题目&#xff1a; 链接&#xff1a;https://ac.nowcoder.com/acm/contest/133790/C 来源&#xff1a;牛客网。 这道题其实特别简单&#xff0c;我们只需要按顺序遍历数组&#xff0c;统计能依次被 1、2、3... 整除的元素数量&#xff0c;即…...

【芯片测试】:SmarTest 开发环境入门

SmarTest 开发环境入门&#xff1a;Eclipse IDE 集成与工作区管理系列&#xff1a; Advantest V93000 SmarTest 8 核心概念解析&#xff5c;第 1 篇&#xff08;共 8 篇&#xff09; 适合读者&#xff1a; 初次接触 SmarTest 的测试工程师、ATE 软件开发者前言 很多工程师第一次…...

AI应用开发

1.规划 2.记忆 2.工具 3.行动...

keil5下载配置Samsung固件包

我们要找的是非常经典的 S3C2440、S3C6410 或 S3C44B0X&#xff0c;这些属于早期的 ARM7 / ARM9 / ARM11 架构&#xff0c;它们使用的是旧版的数据库管理方式。直接访问这个网址&#xff1a;www.keil.com/mdk5/legacy网页往下拉&#xff0c;找到 ARM7, ARM9 & Cortex-R 这一…...

RAG + Agent = 王炸组合:知识增强型Agent详解

完整版合集、面试题库、项目实战&#xff0c;全网同名【图解 AI 系列】前几篇文章我们讲了Agent的核心能力&#xff1a;调用工具、记忆系统、规划能力、多Agent协作。但有一个问题一直没解决&#xff1a;Agent的知识从哪来&#xff1f; 大模型的知识是训练时学到的&#xff0c;…...

武汉专升本民办 vs 公办机构怎么选

每年到了专科大三的春天&#xff0c;武汉的专升本备考群里总会出现类似的问题&#xff1a;“公办机构是不是比民办靠谱&#xff1f;”“民办会不会拿钱不办事&#xff1f;”“集训营到底该冲公办还是选民办&#xff1f;”说实话&#xff0c;这个问题没有标准答案&#xff0c;因…...

快速上手:ClaudeCode安装全攻略

以下是从零开始安装 Claude Code 的详细操作步骤&#xff0c;涵盖环境准备、安装过程与验证方法。请根据你的操作系统选择对应的分支操作。 (PS: 官方文档&#xff1a; 接入 Claude Code | DeepSeek API Docs) 一、安装 Node.js 18 或更高版本 Claude Code 基于 Node.js 运行…...

[开源] 交班信息一致性校验系统:面向临床医护的实时语义冲突检测与结构化摘要生成

本项目是专为国内医院交班场景设计的电子病历&#xff08;EMR&#xff09;辅助工具&#xff0c;解决护士与医生在护理记录和病程记录中同步填写、异步理解、隐性冲突这一长期存在的质控盲区。我们不替代人工判断&#xff0c;而是把“同一时间窗内两条记录是否说同一件事”这件事…...

5-8倍加速:ncnn 3×3卷积模块

5-8倍加速&#xff1a;ncnn 33矩阵卷积模块 我把腾讯ncnn的33卷积从手工循环替换成了自己的算法&#xff08;Im2Col GEMM&#xff09;&#xff0c;实测加速5到8倍。 适用于大通道数&#xff08;inch≥16, outch≥32&#xff09;、大分辨率特征图、服务端推理场景。小通道建议…...

昇腾CANN asc-tools:NPU 运维诊断工具的实战手册

asc-tools 是 CANN 的运维诊断工具包——不在开发阶段用&#xff0c;在部署和运维阶段用。NPU 集群跑了几个月突然性能下降、某张卡频现 ECC 错误、推理延迟从 50ms 涨到 200ms——这些生产环境的问题&#xff0c;asc-tools 帮你定位。 asc-tools 包含哪些工具 asc-tools/ ├─…...

SwinFusion论文精读与代码复现:拆解‘跨域远程学习’如何让图像融合效果开挂

SwinFusion技术解析&#xff1a;跨域远程学习如何重塑图像融合范式 图像融合技术正经历一场由Transformer架构引领的范式变革。传统方法在全局依赖建模和跨域交互方面的局限性&#xff0c;催生了基于Swin Transformer的创新解决方案。本文将深入剖析SwinFusion这一通用图像融合…...

Navicat Premium连不上SQL Server?别慌,先检查这两个最容易忽略的配置(附驱动安装)

Navicat Premium连接SQL Server的实战排错指南&#xff1a;从报错到畅通的完整解决方案 第一次用Navicat Premium连接SQL Server数据库时&#xff0c;那种期待又忐忑的心情我太熟悉了。明明按照教程一步步填写了IP、端口、用户名和密码&#xff0c;点击"测试连接"后却…...

tcpdump 核心选项与过滤表达式实战指南:从基础到高效网络排查

1. 从命令行到洞察力&#xff1a;为什么你需要精通 tcpdump如果你在运维、开发或者网络安全领域工作&#xff0c;网络问题排查几乎是你绕不开的日常。当服务调用超时、接口响应异常&#xff0c;或者流量出现诡异波动时&#xff0c;你需要的不是猜测&#xff0c;而是证据。tcpdu…...

别再让FFT精度拖后腿了!手把手教你用三点插值法把频率估计误差降到最低

别再让FFT精度拖后腿了&#xff01;手把手教你用三点插值法把频率估计误差降到最低 在音频调谐器里校准乐器音高时&#xff0c;工程师发现440Hz的标准音高在1024点FFT中总是显示为439.2Hz&#xff1b;5G基站接收端解调时&#xff0c;载波频率的微小偏移导致误码率飙升&#xff…...