【cutlass】cuTe 01 layout
简介
Layout将坐标映射到地址空间,其对阵列单元在内存中如何排布进行抽象,并提供了获取多维阵列的接口。用户可以以正常的方式(不需要做复杂的地址计算)写多维阵列存取代码,对于存取的不同方式可以改变Layout来实现,而不需要改代码。cuTe提供了对Layout的操作算法,这些方式可以组合/拆分以构建更复杂的layout。
Layout和Tensor的关系
Layout的逻辑地址空间表示了数据的逻辑形状,它和data共同组成了Tensor。Layout把逻辑地址映射到了一个index,index是一个偏移量用来索引地址数据。
Contains
一个Layout包含了Shape和Stride,他们都是IntTuple类型。IntTuple是通过一个单独的整数或者一个IntTuple的Tuple递归定义的。这意味着IntTuple可以任意组合到一起,包含了以下运算:
- get(IntTuple):获取IntTuple的第I个单元,如果IntTuple只有一个整数单元那get<0>就是得到这个单元。
- rank(IntTuple):IntTuple中elements的数量,单独的整数rank是1,一个tuple的rank是tuple_size。
- depth(IntTuple):IntTuple的层数。一个单独的整数depth是0,一个tuple是1,一个tuple中含有另一个tuple是2,以此类推。
- size(IntTuple):IntTuple中所有element的乘积
我们用括号写“IntTuple”来表示层次结构。比如6
,(2)
,(4,3)
,(3,(6,2),8)
都是IntTuple。
IntTuple和Layout是可以嵌套使用的,为了方便使用,cutlass定义了一些方便使用的函数,比如get<I0,I1,…,IN>(x) = get(…(get(get(x)))…)。这些函数包括:
- rank<I…>(x) := rank(get<I…>(x)):第I个单元的rank
- depth<I…>(x) := depth(get<I…>(x)):第I个单元的depth
- size<I…>(x) := size(get<I…>(x)):第I个单元的size
例子
- 向量
- shape: (8); stride: (1) 代表了一个8个单元的向量(0,1,2,3,4,5,6,7)。如果stride为(2),则向量变为(0,2,4,6,8,10,12,14); 如果想要代表(0,1,2,3,4,5,6,7)八个数也可以按照 shape:((4,2)) stride:((1,4))放入内存中
- 矩阵
- shape: (4,2);stride: (1,4) 代表
0 4
1 5
2 6
3 7 - 每个矩阵的模式都可以切分成多指数,比如shape: ((2,2),2);stride: ((4,1),2)代表
0 2
4 6
1 3
5 7
- shape: (4,2);stride: (1,4) 代表
c++实现方式
Layout可以通过compile-time int或者 run-time int构建,如下
auto layout_8s = make_layout(Int<8>{});
auto layout_8d = make_layout(8);auto layout_2sx4s = make_layout(make_shape(Int<2>{},Int<4>{}));
auto layout_2sx4d = make_layout(make_shape(Int<2>{},4));auto layout_2x4 = make_layout(make_shape (2, make_shape (2,2)),make_stride(4, make_stride(2,1)));
其中make_layout函数返回一个Layout类型,类似的make_shape和make_stride函数返回一个shape和stride类型。
对Layout的使用是将坐标和索引相关联,比如打印一个Layout
template <class Shape, class Stride>
void print2D(Layout<Shape,Stride> const& layout)
{for (int m = 0; m < size<0>(layout); ++m) {for (int n = 0; n < size<1>(layout); ++n) {printf("%3d ", layout(m,n));}printf("\n");}
}
总结
- layout的shape定义了坐标空间
-
- 每个layout都有一个一维的坐标空间。这个可以用来产生一个“通用colum-major”序列
- 每个layout都有R维坐标空间,其中R是layout的rank。这个空间按照colexicographically(从右到左)排序,对序列的枚举与上面所说的一维类似。
- 每个layout有h维坐标空间,其中h是层级。这个空间也是按照colexicographically排序,对序列的枚举与上面所说的一维类似。
- h维坐标相对于shape都是连续的,这样坐标上的每个element都有相应的shape element
-
- layout的stride将坐标空间映射为地址
- 通常情况,这种映射可以是一个从一维到地址的任意函数
- 在cuTe中,我们使用一个内置推导,他是一个具有stride元素的h维坐标
相关文章:

【cutlass】cuTe 01 layout
简介 Layout将坐标映射到地址空间,其对阵列单元在内存中如何排布进行抽象,并提供了获取多维阵列的接口。用户可以以正常的方式(不需要做复杂的地址计算)写多维阵列存取代码,对于存取的不同方式可以改变Layout来实现&a…...

迁移学习
迁移学习 什么是迁移学习 迁移学习【斯坦福21秋季:实用机器学习中文版】 迁移学习(Transfer Learning)是一种机器学习方法,它通过将一个领域中的知识和经验迁移到另一个相关领域中,来加速和改进新领域的学习和解决问…...

基于session实现共享登录
基于session实现登录 1.发送短信验证码 Override public Result sendCode(String phone, HttpSession session) {//1.校验手机号是否合规if (RegexUtils.isPhoneInvalid(phone)) {//2.不合规直接返回 错误信息return Result.fail("手机号错误");}//3.如果合规生成验…...

Hudi学习笔记1
使用注意 从 0.10.0 版本开始,primaryKey 为必须的,不再支持没有主键的表。 primaryKey、primaryKey 和 type 均大小写敏感。 对于 MOR 类型的表,preCombineField 为必须的。 当设置 primaryKey、primaryKey 或 type 等 hudi 配置时&#…...

嚯——ChatGPT是很强,但也会胡说八道。。。
现在的ChatGPT确实强,但是也会一本正经的胡说八道,例如它回答“nineteen”中有12个字母、或是旗鱼是哺乳动物…… 尽管ChatGPT可以生成流畅甚至优雅的散文,轻松通过困扰了AI领域超过70年的图灵测试基准,但它也可能看起来非常愚蠢…...

Springboot常用注解总结
目录 一、什么是Spring Boot二、Spring常用注解三、Spring Boot常用注解1、SpringBootApplication2、ImportAutoConfiguration3、SpringBootConfiguration4、ImportResource5、PropertySource6、PropertySources7、Role8、Scope9、Lazy11、Profile12、DependsOn13、PostConstru…...

让chatGPT给我写一个CSS,我太蠢了
前言 CSS这东西,让AI写的确有点难度,毕竟它写出来的东西,没办法直接预览,这是其次。重要的是CSS这东西怎么描述,不好描述啊,比如我让他给我制作一个这样的效果出来,没办法描述,所以…...

华为OD题目:分奖金
分奖金 知识点栈时间限制: 1s 空间限制: 256MB 限定语言: 不限 题目描述: 公司老板做了一笔大生意,想要给每位员工分配一些奖金,想通过游戏的方式来决定每个人分多少钱。 按照员工的工号顺序,每个人随机抽取一个数字。按照工号的顺序往后排列…...

【算法题】2401. 最长优雅子数组
插: 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。 坚持不懈,越努力越幸运,大家一起学习鸭~~~ 题目: 给你一个由 正 整数组成的数组 num…...

【Vue】Vue快速入门
Vue快速入门 Vue.js的引入 要先有一个vue.js文件,可以在vue官网下载,将其复制到项目中并在html页面中进行引入: 在head标签内引入,src内是vue的路径 <!-- 引入vue.js--><script language"JavaScript" s…...

二本菜鸡,颓废两年的自我救赎
大家好,我是帅地。 随着校招的结束,帅地的星球里也有不少小伙伴前来报喜,今天这篇,是星球一个颓废两年同学的自我救赎之路,我觉得他的经历和很多人一样,前两年可能就颓废了,后面才后知后觉&…...

Spring boot 常用注解
SpringBootApplication:用于启动Spring Boot应用程序的主类上,组合了Configuration、EnableAutoConfiguration和ComponentScan三个注解。 RestController :修饰类,使用RestController注解的Controller中的方法默认返回值都会以JS…...

mysql从零开始(05)----锁
全局锁 使用 # 启用全局锁 flush tables with read lock # 释放全局锁 unlock tables开启全局锁后,整个数据库就处于只读状态了,这种状态下,对数据的增删改操作、对表结构的更改操作都会被阻塞。 另外,当会话断开,全…...

《Linux 内核设计与实现》03. 进程管理
文章目录 进程描述符及任务结构分配进程描述符进程描述符的存放进程状态设置当前进程状态进程上下文进程家族树 进程创建线程在 Linux 中的实现创建线程内核线程 进程终结删除进程描述符孤儿进程 进程描述符及任务结构 内核把进程存放在任务队列(task list…...

深入探究HDFS:高可靠、高可扩展、高吞吐量的分布式文件系统【上进小菜猪大数据系列】
上进小菜猪,沈工大软件工程专业,爱好敲代码,持续输出干货。 引言 在当今数据时代,数据的存储和处理已经成为了各行各业的一个关键问题。尤其是在大数据领域,海量数据的存储和处理已经成为了一个不可避免的问题。为了应…...

GIMP制作艺术字技巧
GIMP下载官网 https://www.gimp.org/downloads/ 我使用的版本 2.10.32 字体下载 https://ziyouziti.com/index-index-all.html 下载解压之后会有otf、ttf等字体文件,需要拷贝到gimp当前用户目录 C:\Users\用户名\AppData\Roaming\GIMP\2.10\fonts GIMP绘制字…...

Redis 布隆过滤器总结
Redis 布隆过滤器总结 适用场景 大数据判断是否存在来实现去重:这就可以实现出上述的去重功能,如果你的服务器内存足够大的话,那么使用 HashMap 可能是一个不错的解决方案,理论上时间复杂度可以达到 O(1) 的级别,但是…...

云基础设施安全:7个保护敏感数据的最佳实践
导语:云端安全防护进行时! 您的组织可能会利用云计算的实际优势:灵活性、快速部署、成本效益、可扩展性和存储容量。但是,您是否投入了足够的精力来确保云基础设施的网络安全? 您应该这样做,因为数据泄露、…...

centos7安装nginx
1.配置环境 1).gcc yum install -y gcc2).安装第三方库 pcre-devel yum install -y pcre pcre-devel3).安装第三方库 zlib yum install -y zlib zlib-devel2.下载安装包并解压 nginx官网下载:http://nginx.org/en/download.html 或者 使用wget命令进行下载 wg…...

PyQt5 基础篇(一)-- 安装与环境配置
1 PyQt5 图形界面开发工具 Qt 库是跨平台的 C 库的集合,是最强大的 GUI 库之一,可以实现高级 API 来访问桌面和移动系统的各种服务。PyQt5 是一套 Python 绑定 Digia QT5 应用的框架。PyQt5 实现了一个 Python模块集,有 620 个类,…...

Java—JDK8新特性—函数式接口【内含思维导图】
目录 3.函数式接口 思维导图 3.1 什么是函数式接口 3.2 functionalinterface注解 源码分析 3.3 Lambda表达式和函数式接口关系 3.4 使用函数式接口 3.5 内置函数式接口 四大核的函数式接口区别 3.5.1 Supplier 函数式接口源码分析 3.5.2 Supplier 函数式接口使用 3.…...

【MySQL】外键约束和外键策略
一、什么是外键约束? 外键约束(FOREIGN KEY,缩写FK)是用来实现数据库表的参照完整性的。外键约束可以使两张表紧密的结合起来,特别是针对修改或者删除的级联操作时,会保证数据的完整性。 外键是指表…...

3. SQL底层执行原理详解
一条SQL在MySQL中是如何执行的 1. MySQL的内部组件结构1.1 Server层1.2 Store层 2. 连接器3. 分析器4. 优化器5. 执行器6. bin-log归档 本文是按照自己的理解进行笔记总结,如有不正确的地方,还望大佬多多指点纠正,勿喷。 1. MySQL的内部组件结…...

Bus动态刷新
Bus动态刷新全局广播配置实现 启动 EurekaMain7001ConfigcenterMain3344ConfigclientMain3355ConfigclicntMain3366 运维工程师 修改Gitee上配置文件内容,增加版本号发送POST请求curl -X POST "http://localhost:3344/actuator/bus-refresh" —次发送…...

逆波兰式的写法
一、什么是波兰式,逆波兰式和中缀表达式 6 *(37) -2 将运算数放在数值中间的运算式叫做中缀表达式 - * 6 3 7 2 将运算数放在数值前间的运算式叫做前缀表达式 6 3 7 * 2 - 将运算数放在数值后间的运算式叫做后缀表达式 二、生成逆波兰表达式 6 *(37) -2 生成…...

Linux系统日志介绍
Linux系统日志都是放在“/var/log”目录下面,各个日志文件的功能: /var/log/messages — 包括整体系统信息,其中也包含系统启动期间的日志。此外,mail,cron,daemon,kern和auth等内容也记录在va…...

第三十二章 React路由组件的简单使用
1、NavLink的使用 一个特殊版本的 Link,当它与当前 URL 匹配时,为其渲染元素添加样式属性 <NavLink className"list-group-item" to"/home">Home</NavLink> <NavLink className"list-group-item" to&quo…...

“裸奔”时代下,我们该如何保护网络隐私?
当我们在互联网上进行各种活动时,我们的个人信息和数据可能会被攻击者窃取或盗用。为了保护我们的隐私和数据安全,以下是一些实用的技巧和工具,可以帮助您应对网络攻击、数据泄露和隐私侵犯的问题: 使用强密码:使用独特…...

c#笔记-方法
方法 方法定义 方法可以将一组复杂的代码进行打包。 声明方法的语法是返回类型 方法名 括号 方法体。 void Hello1() {for (int i 0; i < 10; i){Console.WriteLine("Hello");} }调用方法 方法的主要特征就是他的括号。 调用方法的语法是方法名括号。 He…...

054、牛客网算法面试必刷TOP101--堆/栈/队列(230509)
文章目录 前言堆/栈/队列1、BM42 用两个栈实现队列2、BM43 包含min函数的栈3、BM44 有效括号序列4、BM45 滑动窗口的最大值5、BM46 最小的K个数6、BM47 寻找第K大7、BM48 数据流中的中位数8、BM49 表达式求值 其它1、se基础 前言 提示:这里可以添加本文要记录的大概…...