【Cute】MMA抽象代码理解 c2d9bff3d88846eb8c523fb722166bc9

【Cute】MMA抽象代码理解

导读:

  1. cute 之 Layout
  2. cute Layout 的代数和几何解释
  3. cute 之 Tensor
  4. cute 之 MMA抽象
  5. cute 之 简单GEMM实现

阅读本文前建议先读上面reed大神的数篇文章,文本逻辑主要是针对具体的代码,记录一下自己学习过程中的理解与注释。

code

reference: https://github.com/reed-lau/cute-gemm/blob/main/gemm-simple.cu#L80-L86

  using mma_op = SM80_16x8x16_F16F16F16F16_TN;using mma_traits = MMA_Traits<mma_op>;using mma_atom = MMA_Atom<mma_traits>;using MMA = decltype(make_tiled_mma(mma_atom{}, make_layout(Shape<_2, _2, _1>{}), make_layout(Shape<_1, _2, _1>{})));

mma_op

请添加图片描述

这是一个示例图,但是有点区别,它的A是F32的;tid(logical thread id), vid(logical value id);

这是矩阵乘法的一个最小原子,内部是怎么计算以后再说,先搞清楚,这一个原子它解决A:(16,8),B:(8,8)的计算,最后输出C:(16,8);

对应到上面给出的代码,就是A:(16,16),B:(16,8),C:(16,8);通常矩阵大这个原子也会设的大一点,会让每个并行的计算量多一点。

请添加图片描述

tile

MMA_Traits和MMA_Atom根据MMA_op补全部分计算的属性。具体的涉及一些概念可以参考之前的文章。

这里主要讲一下atom tile和value tile,在之前的cutlass定义中atom tile又叫thr_layout,value tile叫val_layout。

atom tile主要是指上述的op原子计算在M和N方向上各自拓展多少次,在tensor core中,每个op都是一个warp,即有32个线程;M和N方向各拓展两次,就有4个warp,128个线程,所以也叫thr_layout;

value tile主要是指拓展后的atom,在M和N方向上继续重复多少次计算,因为是重复,内部是loop操作,所以不会占用更多的线程,只会扩大处理的矩阵大小。

请添加图片描述

最下面就是最小的tensor core指令—-MMA_Atom(16816),小框是元素级别的计算(这个可以先不关注,或者结合最上面的图来看,实际上是线程计算过程中的图示)。

中间就是刚才说到的拓展,实线是atom的warp级拓展,即M轴拓展2次,N轴拓展2次,一共4个,每个warp固定32个线程,一共128个;虚线是value layout级别的重复计算,不会增大线程数。在这个基础上就可以定义出TiledMMA,每个TiledMMA处理 A:(32,16),B(16, 32),C:(32,32)的大小。

最后虽然我们抽象定义的是block层面的计算,但cuda在每次执行时都是到thread层面的,所以要通过下面的代码去把当前thread对应计算所需要的元素抠出来,也就是最上面的图示

  TiledMMA tiled_mma;auto thr_mma = tiled_mma.get_slice(threadIdx.x);auto tAgA = thr_mma.partition_A(gA);  // (MMA, MMA_M, MMA_K, num_tile_k)auto tBgB = thr_mma.partition_B(gB);  // (MMA, MMA_N, MMA_K, num_tile_k)auto tCgC = thr_mma.partition_C(gC);  // (MMA, MMA_M, MMA_N)

到这里基本应该清楚了MMA的整个计算逻辑和流程,下面这幅图更清晰的阐述了每个thread的计算

请添加图片描述

在slice-k模式下,k维度的计算就是通过循环完成的,循环是在同一个thread内部做的。

reference:https://github.com/reed-lau/cute-gemm/blob/main/gemm-simple.cu#L40-L49

  int num_tile_k = size<2>(gA);
#pragma unroll 1for(int itile = 0; itile < num_tile_k; ++itile) {cute::copy(tAgA(_, _, _, itile), tArA);cute::copy(tBgB(_, _, _, itile), tBrB);cute::gemm(tiled_mma, tCrC, tArA, tBrB, tCrC);}

不断累加即可。

cutlass3.4

reference: https://github.com/reed-lau/cute-gemm/blob/main/gemm-multi-stage.cu#L244-L262

  using mma_op = SM80_16x8x16_F16F16F16F16_TN;using mma_traits = MMA_Traits<mma_op>;using mma_atom = MMA_Atom<mma_traits>;static constexpr int kMmaEURepeatM = 2;static constexpr int kMmaEURepeatN = 2;static constexpr int kMmaEURepeatK = 1;using mma_atom_shape = mma_traits::Shape_MNK;static constexpr int kMmaPM = 1 * kMmaEURepeatM * get<0>(mma_atom_shape{});static constexpr int kMmaPN = 2 * kMmaEURepeatN * get<1>(mma_atom_shape{});static constexpr int kMmaPK = 1 * kMmaEURepeatK * get<2>(mma_atom_shape{});using MMA_EU_RepeatT = decltype(make_layout(make_shape(Int<kMmaEURepeatM>{}, Int<kMmaEURepeatN>{}, Int<kMmaEURepeatK>{})));using MMA_P_T = Tile<Int<kMmaPM>, Int<kMmaPN>, Int<kMmaPK>>;using MMA = decltype(make_tiled_mma(mma_atom{}, MMA_EU_RepeatT{}, MMA_P_T{}));

在cutlass3.4版本中,对上面所述的value layout的输入进行了一定的更新;

在这里MMA_P_T和之前<_1,_2,_1>的功能是完全一致的。之前是定义重复逻辑,现在直接定义最终布局,并且还可以指定更精细的布局方式。

具体可以参见:

https://github.com/NVIDIA/cutlass/discussions/1345

简单来讲就是又拓展了布局的能力,新的布局不仅支持之前的value layout,还支持通过更精细的布局控制,以使tv划分模式更易于管理/直观,并有效地交错各个mma(不过现在原子级的tv我还没怎么搞明白。。)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/751268.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Atlas200板卡部署车道线

本博客包含推理的准备和部署代码&#xff0c;一步步实现部署。 这个运行时生成的一个batch的数据&#xff0c;NCHW,就是输入的N&#xff0c;单图片推理就是1&#xff0c;把里面的数量改成1&#xff0c;但是你可以多生成一些bin图片放到校准文件夹中&#xff0c;更改输出文件名…

“城市绿肺诊断:集成GIS、RS、VORS模型、CCDM模型、geodetecto、GWR模型技术深入解析生态系统与城镇化协调发展“

基于GIS、RS、VORS模型、CCDM模型、geodetecto、GWR模型集成的生态系统健康的耦合协调分析 城市群是一国经济发展水平的象征&#xff0c;也是一国经济发展到一定阶段的标志&#xff0c;我国城市群建设体量不断增加&#xff0c;将成为全球经济的核心&#xff0c;中国城市群的建…

MyFileServer

靶场下载地址 https://download.vulnhub.com/myfileserver/My_file_server_1.ova 信息收集 # nmap -sn 192.168.56.0/24 -oN live.nmap Starting Nmap 7.94 ( https://nmap.org ) at 2024-02-24 22:07 CST Nmap scan report for 192.168.56.2 (192.168.56.2) Host is up (0.…

HarmonyOS NEXT应用开发—状态栏显隐变化

介绍 本示例介绍使用Scroll组件的滚动事件 onScroll 实现状态栏显隐变化。该场景多用于各种软件的首页、我的等页面中。 效果预览图 使用说明 加载完成后显示状态栏显隐变化页面&#xff0c;上下拖动屏幕&#xff0c;顶端状态栏出现显隐变化。 实现思路 在置顶位置使用sta…

文件夹秒变应用程序?别慌,数据恢复有妙招!

在日常使用电脑的过程中&#xff0c;我们有时会遇到一个令人头疼的问题&#xff1a;原本好好的文件夹突然变成了应用程序的图标&#xff0c;点击也无法正常打开。这种“文件夹变应用程序”的现象不仅让人感到困惑&#xff0c;还可能导致重要文件的丢失或损坏。那么&#xff0c;…

vite ts vue 项目提示 . Projects must list all files or use an include pattern.

vite ts vue 项目提示 . Projects must list all files or use an include pattern. 在引用一个 ts 的时候&#xff0c;提示如下&#xff1a; 需要在 tsconfig.node.json 文件中添加&#xff1a; {"compilerOptions": {"composite": true,"skipLibC…

变量命名之函数命名

变量命名: 变量命名和函数名命名 方式一:camel命名 因相骆驼脊背形象命名 大骆驼法:当变量名或函数名由一个或多个单词连接在一起的,从第一个单词首字母也大写了,后面每个单词都大写. 例子: HI_S32 HI_MPI_VI_SetDevAttr(VI_DEV ViDev,const VI_DEV_ATTR_S* pstDevAttr);HI_S…

Vue2(四):Vue监测数据的原理

一、先来看一个问题 添加一个按钮点击更新马冬梅的信息&#xff1a; <button click"gengxin">点击更新马冬梅的信息</button> methods:{gengxin(){this.person[1].name马老师,this.person[1].age50,this.person[1].sex男}} 下面这种方式就不能奏效&a…

【前端】-css的详解

&#x1f496;作者&#xff1a;小树苗渴望变成参天大树&#x1f388; &#x1f389;作者宣言&#xff1a;认真写好每一篇博客&#x1f4a4; &#x1f38a;作者gitee:gitee✨ &#x1f49e;作者专栏&#xff1a;C语言,数据结构初阶,Linux,C 动态规划算法&#x1f384; 如 果 你 …

信号(Linux)

信号 前言1. 引入2. 概念3. 初步认识ctrlc信号4. 硬件中断 一、信号的产生1. 键盘组合键2. kill命令3. 系统调用①kill②raise③ abort 4. 异常①异常产生信号②原理 5. 软件条件6. 小结 二、信号的保存1. 引入2. 原理3. 接口①信号集——sigset_t②sigprocmask③sigpending④使…

spring注解驱动系列--AOP探究一

一、AOP--动态代理 指在程序运行期间动态的将某段代码切入到指定方法指定位置进行运行的编程方式 二、使用栗子 一、导入aop模块 <dependency><groupId>org.springframework</groupId><artifactId>spring-aspects</artifactId><version>4…

虚拟机开机字体变大,进入系统后字体模糊

问题 虚拟机开机字体变大&#xff0c;进入系统后字体模糊。 原因 虚拟机配置问题。 解决办法 修改配置为如下:

资深老鸟经验,性能测试-性能指标分析总结,一篇策底概全...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 性能测试指标 1、…

leetcode代码记录(不同路径

目录 1. 题目&#xff1a;2. 我的代码&#xff1a;小结&#xff1a; 1. 题目&#xff1a; 一个机器人位于一个 m x n 网格的左上角 &#xff08;起始点在下图中标记为 “Start” &#xff09;。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角&#xff08;在…

Python实现24点游戏

24点游戏是一种数学益智游戏&#xff0c;它的目标是通过使用加法、减法、乘法和除法这四种基本算术运算&#xff0c;使得四个数字的结果等于24。这个游戏不仅能锻炼玩家的数学计算能力&#xff0c;还能提高逻辑思维和快速反应能力。 游戏规则非常简单&#xff1a; 游戏通常使…

如何使用ArcGIS Pro生成带计曲线等高线

等高线作为常见的地图要素经常会被使用到&#xff0c;一般情况下生成的等高线是不带计曲线的&#xff0c;在某些情况下我们需要带计曲线的等高线&#xff0c;这里为大家介绍一下ArcGIS Pro生成带计曲线等高线的方法&#xff0c;希望能对你有所帮助。 数据来源 教程所使用的数…

Node.js 文件夹遍历技巧:实现高效的文件管理

在 Node.js 开发中&#xff0c;经常需要对文件系统进行操作&#xff0c;包括遍历文件夹以获取文件列表。本文将讨论使用 Node.js 遍历文件夹的几种常用方法&#xff0c;并通过一个实际案例来演示如何实现。 基本概念 在开始之前&#xff0c;让我们了解一些基本的概念&#xff…

关 于 重 燃 学 习 的 热 情

3月1日是我回学校的第一天。经历了长达8个月在家的昏暗时刻&#xff0c;我这10天的感觉和在家的感觉发生了翻天覆地的变化&#xff0c;最明显的莫过于学习状态的改变。 倒不是说在家学的不好&#xff0c;而是说在学校&#xff0c;我对学习的整体感觉&#xff0c;以及专注程度&…

微信小程序Skyline模式自定义tab组件胶囊与原生胶囊平齐,安卓和ios均自适应

进入下面小程序可以体验效果&#xff1a; 至于原理的话&#xff0c;解释起来毕竟麻烦&#xff0c;各位可以看源码自己分析。其实很简单&#xff0c;就算计算布局。很多网上公布的布局&#xff0c;都不能正常自适应。在下这个是完美可以的 1、WXML <view class"weui…

Kubernetes operator系列:kubebuilder 实战演练 之 开发多版本CronJob

云原生学习路线导航页&#xff08;持续更新中&#xff09; 本文是 Kubernetes operator学习 系列文章&#xff0c;本节会在上一篇开发的Cronjob基础上&#xff0c;进行 多版本Operator 开发的实战 本文的所有代码&#xff0c;都存储于github代码库&#xff1a;https://github.c…