【cutlass】layout

Iterator A矩阵举例,A是row major, 这里kContiguous =K,kStrided =M, 确实是的,连续数据的长度是k, 对于B矩阵,连续的值长度就是N,这里整明白了后可以看看其他DefaultMmaCore实例化的结果,验证发现是这个意思。这里A矩阵和B矩阵都是row-major,但是我们看到传入PitchLinearShape的尺寸和我们传统的行列顺序不一样,先传入的是列,然后才是行,为啥? 阅读详情

Layouts 和Tensors

Tensors是由内存中数值单元多维阵列来表示的数学类型。这些可以定义可以在其上定义经典线性代数计算的二维矩阵,或者经常用于构造深度学习应用程序和框架所使用的数据的更高维对象。Layout中的函数可以将逻辑地址空间映射到内存中,也可以映射到TensorRef/TensorView等非直接相关tensors。Layouts包含以下属性:

  • size(scalar):一个tensor中的单元数量
  • capacity(scalar):在内存中存储tensor所需的单元数(可能比size大)
  • rank(scalar):描述tensor的逻辑维度数量
  • extent(vector):tensor中每个逻辑维度的尺寸
    layout是以下元素的系统性设计模板:
  • 将逻辑地址空间映射到内存中的物理偏移
  • 将上述计算所需的动态状态存储下来
  • 为其他cutlass组件的部分专用化定义类型系统
    layout是如下定义的:
struct LayoutConcept {
  /// Logical rank of tensor
  static int const kRank;

  /// Rank of stride vector
  static int const kStrideRank;

  /// Index type used for coordinates
  struct Index;

  /// Long index type used for offsets
  struct LongIndex;

  /// Logical coordinate - satisfies Coord<kRank, ..>
  struct TensorCoord;

  /// Stride object - satisfies Coord<kStrideRank, ..>
  struct Stride

  //
  // Methods
  //

  /// Constructor
  CUTLASS_HOST_DEVICE
  LayoutConcept();

  /// Ctor
  CUTLASS_HOST_DEVICE
  LayoutConcept(Stride stride);

  /// Helper returns a layout to a tightly packed tensor
  CUTLASS_HOST_DEVICE
  static LayoutConcept packed(TensorCoord const &extent);

  /// Function call operator returns the offset of a coordinate in linear memory. 
  /// Assumes coordinate has convention (row, column)
  CUTLASS_HOST_DEVICE
  LongIndex operator()(TensorCoord const &coord) const;

  /// Inverse of layout function, mapping linear offset to logical coordinate
  CUTLASS_HOST_DEVICE
  TensorCoord inverse(LongIndex offset) const;

  /// Returns the stride of the layout
  CUTLASS_HOST_DEVICE
  Stride stride() const;

  /// Returns the stride of the layout
  CUTLASS_HOST_DEVICE
  Stride & stride();

  /// Compute the number of contiguous elements needed to store a tensor with the given size
  CUTLASS_HOST_DEVICE
  LongIndex capacity(TensorCoord const &extent) const;
};

_Layout_对象概括了_BLAS_实现中典型的矩阵的前导维数。例如,cuBLAS假设Fortran样式_column-major_矩阵布局,并将其称为矩阵的“前导维度”:

cublasGemmEx(
  ...
  ptr_A,      // pointer to first element of matrix A
  lda,        // leading dimension
  ...
);

他的坐标是(row, column),偏移是row + lda * column,这等价于cutlass的layout::ColumnMajor:

layout::ColumnMajor layout(lda); 
int offset = layout({row, column});     // returns row  + lda * column

如果是row-major则如下实现:

layout::RowMajor layout(lda); 

int offset = layout({row, column});     // returns lda * row + column

在这两种情况下,_logical_坐标(rowcolumn)由同一对象表示。这使得算法能够实现为通用模板,Tensor中的位置总是在逻辑空间中指定_Layout_objects将其映射到内存中的物理偏移。
给定紧束缚Tensor的范围,布局的“::packed()”静态方法可用于构造布局对象。当算法必须定义任意布局的缓冲区时,需要使用此方法。比如

typename ArbitraryLayout::TensorCoord extent = make_Coord(...);
typename ArbitraryLayout::TensorCoord coord;

ArbitraryLayout layout = ArbitraryLayout::packed(extent);

int offset = layout({coord});

layout::capacity()计算表示张量所需的内存中的位置数。这在分配内存时很有用,因为可能需要比完全压缩的张量需要更多的存储:

int lda = columns + padding;
MatrixCoord extent{rows, columns};

layout::RowMajor layout(lda);

auto capacity = layout.capacity(extent);    // returns rows * (columns + padding) 

利用tensor来获取一个单元

  1. TensorRef
    TensorRef<class T, class Layout>包含了Tensor的首地址和layout,可以用来获取其中的单元。用它来获取对象非常方便,当stride元素的数量很多时,可以将其传递给函数以限制参数的爆炸。
int4_t *ptr = ...;
int ldm = ...;

int row = ...;
int column = ...;

layout::ColumnMajor layout(ldm);
TensorRef<int4_t, layout::ColumnMajor> ref(ptr, layout);

int4_t x = ref.at({row, column});     // loads a 4-bit signed integer from the tensor

ref.at({row, column}) = x * 2_s4;     // transforms this quantity and stores it back
  1. TensorView
    线性代数计算中使用的矩阵和张量总是有限的。TensorView<class T, class Layout>衍生自TensorRef<>并添加了extent向量来描述tensor或者matrix的逻辑尺寸。
int4_t *ptr = ...;
int ldm = ...;
MatrixCoord extent = ...;

int row = ...;
int column = ...;

layout::ColumnMajor layout(ldm);
TensorView<int4_t, layout::ColumnMajor> view(ptr, layout, extent);

MatrixCoord coord = {row, column};

if (view.contains(coord)) {     // verify coordinate is in bounds before performing access
  int4_t x = ref.at(coord);  
  ref.at({row, column}) = x * 2_s4;
}

“TensorView<>”可以由“TensorRef<>”构造:

layout::ColumnMajor layout(ldm);
TensorRef<int4_t, layout::ColumnMajor> ref(ptr, layout);
TensorView<int4_t, layout::ColumnMajor> view(ref, extent);    // construct TensorView from TensorRef and extent

通过接受单个问题大小组件和每个操作数的“TensorRef”对象,其范围隐含为算子的先决条件,计算可以避免分配过多内存。 通过避免扩展区数量的冗余存储,CUTLASS 最大限度地减少了宝贵资源(如常量内存)的容量利用率,这与 BLAS 的规则一致。

现有的layout类型

- `PitchLinear`: data layout defined by _contiguous_ and _strided_ dimensions. _contiguous_ refers to consecutive elements in memory, where as _strided_ refers to data separated by a uniform stride
-- Rank: 2
-- TensorCoord type: `PitchLinearCoord`
-- Shape type: `PitchLinearShape`
-- Stride rank: 1

- `ColumnMajor`: data layout defined by _rows_ and _columns_ dimensions. Can be mapped to `PitchLinear` by: (_contiguous_ = _rows_, _strided_ = _columns_)
-- Rank: 2
-- TensorCoord type: `MatrixCoord`
-- Shape type: `MatrixShape`
-- Stride rank: 1

- `RowMajor`: data layout defined by _rows_ and _columns_ dimensions. Can be mapped to `PitchLinear` by: (_contiguous_ = _columns_, _strided_ = _rows_)
-- Rank: 2
-- TensorCoord type: `MatrixCoord`
-- Shape type: `MatrixShape`
-- Stride rank: 1

- `ColumnMajorInterleaved<k>`: data layout defined by _rows_ and _columns_ dimensions. Data is packed into a 'column-major' arrangement of row vectors of fixed length.
-- Rank: 2
-- TensorCoord type: `MatrixCoord`
-- Shape type: `MatrixShape`
-- Stride rank: 1

- `RowMajorInterleaved<k>`: data layout defined by _rows_ and _columns_ dimensions. Data is packed into a 'row-major' arrangement of column vectors of fixed length.
-- Rank: 2
-- TensorCoord type: `MatrixCoord`
-- Shape type: `MatrixShape`
-- Stride rank: 1

Tensor layouts:
- `TensorNHWC`:

Permuted Shared Memory Layouts:
- `TensorOpCongruous<ElementSize>`
- `TensorOpCrosswise<ElementSize>`
cutlass】cuTe layout操作 cuTe提供了对Layout操作的算法,可以混合执行来构建更复杂的Layout操作,比如在其他layout之间切分和平铺layout上述打印示例中的“for”循环显示了CuTe如何用逻辑2-D坐标的column-major layout识别1-D坐标。从“i=0”到“size(Layout)”(即6)进行迭代,并用单个整数坐标“i”索引到我们的Layout中,以column-major 的方式遍历Layout,即使这是row-major的Layout 阅读详情

相关推荐

cutlass】cuTe 01 layout

Layout将坐标映射到地址空间,其对阵列单元在内存中如何排布进行抽象,并提供了获取多维阵列的接口。用户可以以正常的方式(不需要做复杂的地址计算)写多维阵列存取代码,对于存取的不同方式可以改变Layout来实现,而不需要改代码。cuTe提供了对Layout的操作算法,这些方式可以组合/拆分以构建更复杂的layoutlayout的shape定义了坐标空间每个layout都有一个一维的坐标空间。这个可以用来产生一个“通用colum-major”序列。

qq_33146555的博客 2143

cute & cutlass学习

CuTe与CUTLASS核心概念摘要 CuTe和CUTLASS是NVIDIA推出的高性能计算库,用于优化张量计算。CuTe通过Shape/Layout/Tensor描述数据结构和线程划分(如make_tensor创建视图),提供切块分区功能(如local_tile切分数据块)。CUTLASS则关注计算流水线(PipelineTmaAsync)、同步机制(Barrier)和核函数启动。 关键操作包括: 计算:使用WGMMA/GMMA指令(ss_op_selector选择指令类型) 数据传输:TMA(SM90_

AlgoCraft 15

cutlass之基础类型

矩阵的layout, 其实就是把coord包装一下,主要看看两者的区别, 其实layout中主要就是包含上面说的一个stride, 也确实,一旦固定是行优先还是列优先后,只要定了stride后就固定了格式。W], 至于为啥是这个顺序我也不知道,估计是约定俗成的。理解步长其实就是在内存中,N0距离N1的长度是C。不是很明白为啥RowMajor是class, 而其他类型是struct?真是让我强迫症犯了。

feng__shuai的博客 855

Tegra_Multimedia API 例程学习之7--07_video_convert

视频转换概述编译和运行流程关键点 概述 这个例子展示了: 如何使用libv4l2 时行视频的缩放和颜色格式的转化 编译和运行 编译和以前一样,进入目录直接make即可。 运行程序 $ ./video_convert <in-file> <in-width> <in-height> <in-format> <out-file> <...

一米阳光 2525

CUTLASS代码解读-02 示例03_visualize_layout

这是一个是一个可视化工具,用于展示 CUTLASS 中各种内存布局 (Memory Layout) 的工作原理。Layout是逻辑坐标到内存偏移的映射,常见的布局有这些工具基本使用会打印16x16的表格,大致如下。

qq_43491590的博客 192

使用cutlass实现多种精度的GEMM,支持cuda core与tensor core

使用cutlass实现多种精度的GEMM,附有完整代码与cmakelist

weixin_42764932的博客 3481

[CUTLASS笔记2]host端工具类

if (status!这里大部分的流程都和上一篇一模一样,就不再赘述了。

ouliten的博客 294

[算子学习笔记]cute

最近:学习中见到一种新的张量表示方法。

qq_71640350的博客 248

CUTLASS CuTe核心:层次多维布局操作库

在现代GPU编程中,高效的内存访问模式是性能优化的关键。传统的CUDA编程需要开发者手动计算复杂的内存索引,这不仅容易出错,还难以维护和优化。CUTLASS CuTe(CUDA Template Extensions)应运而生,它提供了一套强大的模板抽象,专门用于描述和操作线程与数据的层次多维布局。 CuTe的核心价值在于:**让开发者专注于算法逻辑,而不是繁琐的内存索引计算**。通过声明式的布...

gitblog_00316的博客 1381

CuTe:用布局代数简化GPU编程,告别繁琐索引计算

在GPU编程中,高效管理多维数据和线程组织是提升计算性能的核心挑战。传统方法需要手动计算复杂的内存索引和线程映射,容易出错且难以维护。CuTe作为NVIDIA CUTLASS库中的抽象层,引入了一套基于C++模板的布局代数系统,将多维数据的形状、步幅和层次化映射关系封装为可组合、可操作的一等公民对象。其技术价值在于通过编译期确定的布局计算,实现零成本的数据视图变换(如转置、切片),并自然表达GPU的层次化内存和线程结构,从而让开发者从底层索引计算中解放出来,专注于算法逻辑本身。这一特性在矩阵乘法、卷积等需要

weixin_30652897的博客 588

CUDA(十一) 周斌 CUDA程序深入优化

存储优化 CPU-GPU数据传输最小化,依赖于PCIe总线 Host&lt;-&gt;Device 数据传输带宽远低于 global memory(GPU内部)         8GB/s(PCIe x16 Gen2)vs 156 GB/s &amp; 515Ginst/s(C2050) 减少传输   中间数据直接在GPU分配、操作、释放。 有时更适合在GPU进行重复计算。现在CPU上计...

fanre的专栏 2242

CUTLASS C++ 快速入门指南

/ A 矩阵的内存访问粒度/对齐(以元素为单位,最多16字节)// B 矩阵的内存访问粒度/对齐(以元素为单位,最多16字节)using KernelSchedule = cutlass::gemm::collective::KernelScheduleAuto;

eloudy的专栏 770

CUTLASS导入使用:CUTLASS导入指南

CUTLASSCUDA Templates for Linear Algebra Subroutines and Solvers)是NVIDIA开发的高性能CUDA C++模板库,专门用于实现矩阵乘法(GEMM)和相关计算。本文将详细介绍如何正确导入和使用CUTLASS库,帮助开发者快速上手这一强大的GPU计算工具。 ## 环境要求 ### 系统要求 - **操作系统**: Ubuntu 1...

gitblog_00467的博客 1223

YUVToRGB(CUDA Conversion)库的学习

YUVToRGB(CUDA Conversion)库的学习

周同学的博客 3738

CUTLASS: Efficient GEMM in CUDA

CUTLASS 实现了 CUTLASS: Fast Linear Algebra in CUDA C++ 和 CUTLASS GTC2018 talk 中描述的分层分块结构。 基本的三重嵌套循环计算矩阵乘法可以应用分块和拼贴,以匹配硬件、内存局部性和并行编程模型中的并发性。CUTLASS 中 GEMM 映射到 NVIDIA GPU 的结构如以下嵌套循环所示。

yiran103的专栏 3718

cutlass2.x源码解读之PitchLinearStripminedThreadMap

TensorCoord:使用layout::PitchLinearCoord作为张量坐标。Shape:使用模板参数Shape_作为tile的形状,kThreads:线程总数,定义为模板参数Threads。kElementsPerAccess:每次访问的元素数,定义为模板参数ElementsPerAccess。ThreadAccessShape:线程访问的形状,使用layout::PitchLinearShape定义。内部实现细节:ShapeVec。

jiangjkd的专栏 755

oneAPI GPU 优化指南 - OpenMP 部署调优指南 - 部署 oneMKL 计算到 GPU

Compile:Run:在特定 GPU 上的性能(无填充)如下(仅 1 堆栈):= 0。

TechVideoGPU的博客 543

通过CUDA10.0 Sample 目录学习CUDA

简介 一般安装好CUDA后会有一个存放示例的文件夹,里面会有一些CUDA的示例可供我们学习。 文件夹目录(默认):C:\ProgramData\NVIDIA Corporation\CUDA Samples\v10.0 目录内容 Simple 基础CUDA示例,适用于初学者, 反映了运用CUDACUDA runtime APIs的一些基本概念. Utilities 演示如何查询设备算例和计算GPU/CPU 带宽的实例程序。 Graphics 图形化示例展现的是 CUDA, OpenGL, Direct

weixin_44132302的博客 4575
上一篇: 【cutlass】cuTe 01 layout
下一篇: 【cutlass】cuTe layout操作
CoCo_DY
博客等级 码龄11年 6粉丝 75原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值