
CuTe 快速上手指南CUTLASS 3.x 中面向高性能线性代数的 C CUDA 模板库【免费下载链接】cutlassCUDA Templates and Python DSLs for High-Performance Linear Algebra项目地址: https://gitcode.com/GitHub_Trending/cu/cutlassCuTe 是 CUTLASS 3.x 内置的一套 C CUDA 模板抽象库专门用于定义和操作线程与数据的分层多维布局hierarchically multidimensional layouts。本文基于仓库中的 media/docs/cpp/cute/00_quickstart.md 展开介绍 CuTe 的核心抽象、系统要求、目录组织、构建测试/示例的方法以及开发中最常用的调试打印技巧。读完本文你将掌握 CuTe 的库结构脉络能够快速定位 include/cute 中的头文件并熟练使用print、print_layout、thread0()等工具进行内核调试为深入研读 GEMM 教程 media/docs/cpp/cute/0x_gemm_tutorial.md 打好基础。CuTe 是什么Layout 与 Tensor 两大核心抽象CuTe 是一组面向 CUDA 的 C 模板抽象其设计目标是定义并操作线程与数据的分层多维布局。它提供Layout与Tensor两类对象将数据的**类型type、形状shape、存储空间memory space与布局layout**紧凑地打包在一起并替用户完成复杂的索引计算。LayoutCuTe 的核心抽象描述坐标到内存偏移的映射关系。布局的表示能力足够强大几乎可以表达实现高效稠密线性代数所需的全部内容矩阵分块、线程到数据的映射、共享内存 swizzle 等。Tensor将Layout与一段数据数组组合而成的多维数组抽象。布局可以借助**函数复合functional composition**进行组合与变换CuTe 在此之上构建了平铺tiling、切分partitioning等一大批常用操作。因此程序员可以把精力集中在算法的逻辑描述上把机械的簿记工作bookkeeping交给 CuTe从而快速设计、实现与修改各类稠密线性代数运算。从源码看include/cute/layout.hpp 定义了Shape、Stride、Step、Coord、Tile等别名并提供了make_shape、make_stride、make_step等constexpr工厂函数见 include/cute/layout.hpp#L47-L79。这些类型全部基于cute::tuple构建意味着多维形状与步长在编译期即被完整描述为后续的模板元编程与算子融合打下基础。系统要求与知识前置软件与硬件要求CuTe 与 CUTLASS 3.x 共享同一套软件要求需要NVCC编译器宿主端编译器需支持C172017 年发布的 C 标准修订版CuTe 是纯头文件header-only库无需要单独编译的源文件。前置知识CuTe 教程假定读者具备以下能力中级 C 经验能够阅读和编写模板函数与模板类能使用auto关键字推导函数返回类型中级 CUDA 经验清楚设备端device与宿主端host代码的区别知道如何启动 kernel。构建测试与示例CuTe 的单元测试与示例会作为 CUTLASS 正常构建流程的一部分被编译和运行。单元测试位于仓库的 test/unit/cute 子目录按架构与主题分组例如core/布局代数、tuple 运算等基础测试、layout/、ampere/、hopper/、volta/、turing/等。仅core目录就包含composition.cpp布局复合、coalesce.cpp、logical_divide.cpp逻辑切分、inverse_left.cpp/inverse_right.cpp布局求逆、swizzle_layout.cpp、tensor_algs.cpp等二十余个测试文件覆盖了布局代数与张量算法的绝大部分操作见 test/unit/cute/core。示例代码位于仓库的 examples/cute 子目录其中 examples/cute/tutorial 下包含sgemm_1.cu、sgemm_2.cu、sgemm_sm70.cu、sgemm_sm80.cu、tiled_copy.cu、tiled_copy_if.cu以及hopper/、blackwell/等架构子目录。其构建配置见 examples/cute/tutorial/CMakeLists.txt通过cutlass_example_add_executable注册为cute_tutorial_sgemm_1、cute_tutorial_sgemm_2、cute_tutorial_tiled_copy等可执行目标可直接参与 CUTLASS 的标准 CMake 构建。库组织结构CuTe 是纯头文件库所有头文件集中在顶层目录 include/cute 中并按语义划分为若干子目录目录内容include/cute顶层每个头文件对应 CuTe 的一个基础构建块例如 layout.hpp布局与 tensor.hpp张量。其余顶层头文件还包括int_tuple.hpp、stride.hpp、swizzle.hpp、swizzle_layout.hpp、pointer.hpp、underscore.hpp等。include/cute/containerSTL 风格对象的实现如 tuple、array、aligned array。include/cute/numeric基础数值类型包括非标准浮点类型、非标准整数类型、复数与整数序列integer sequence。include/cute/algorithmcopy、fill、clear 等工具算法的实现若目标架构可用会自动利用架构特性指令。include/cute/arch架构相关的矩阵乘法与拷贝指令的封装wrapper。include/cute/atom针对arch中指令的元信息meta-information以及分区partitioning与平铺tiling等工具。此外include/cute/util 存放调试与日志工具其中 debug.hpp 是下文快速技巧部分的核心依赖。教程文件导航本仓库的 media/docs/cpp/cute 目录存放完整的 CuTe Markdown 教程index.rst见 media/docs/cpp/cute/index.rst将其组织为一张 toctree。各文件主题如下文件主题media/docs/cpp/cute/0x_gemm_tutorial.md使用 CuTe 组件实现稠密矩阵乘法GEMM对 CuTe 给出全景概览建议作为入门首选。media/docs/cpp/cute/01_layout.md介绍LayoutCuTe 的核心抽象。media/docs/cpp/cute/02_layout_algebra.md更高级的Layout操作与 CuTe 布局代数。media/docs/cpp/cute/03_tensor.md介绍Tensor将Layout与数据数组组合而成的多维数组抽象。media/docs/cpp/cute/04_algorithms.md总结 CuTe 中作用于Tensor的通用算法。media/docs/cpp/cute/0t_mma_atom.md演示 CuTe 对 GPU 架构相关矩阵乘累加MMA指令的元信息与接口。media/docs/cpp/cute/0y_predication.md讲解平铺tiling无法整除矩阵时如何处理谓词化。media/docs/cpp/cute/0z_tma_tensors.md介绍 CuTe 用于支持 TMA 加载/存储的高级Tensor类型。建议的阅读路径先读0x_gemm_tutorial.md建立整体认识再按需深入01_layout.md→02_layout_algebra.md→03_tensor.md→04_algorithms.md最后结合具体硬件需求阅读0t_mma_atom.md、0y_predication.md与0z_tma_tensors.md。快速技巧如何打印 CuTe 对象通用打印函数printcute::print函数为几乎所有 CuTe 类型提供了重载包括指针Pointers、整数Integers、步长Strides、形状Shapes、布局Layouts与张量Tensors。拿不准某个对象是什么时直接对它调用print即可。CuTe 的打印函数在宿主端与设备端均可工作。但请注意在设备端打印非常昂贵——即使只是把打印代码留在设备端而从未真正执行例如打印语句位于运行期不会进入的if分支中也可能生成更慢的代码。因此调试完成后务必移除设备端的打印代码。只在全局线程 0 上打印多线程环境下每个线程都打印会刷屏且难以阅读。thread0()函数只在 kernel 的全局线程 0即 threadblock 0 的 thread 0上返回true。常见的打印惯用法如下if (thread0()) { print(some_cute_object); }按指定线程/线程块打印某些算法依赖特定的线程或线程块因此可能需要在线程 0 之外的其他线程上打印。头文件 include/cute/util/debug.hpp 提供了一系列辅助函数。从源码实现看见 include/cute/util/debug.hpp#L121-L162这些函数在宿主端恒返回true仅在设备端__CUDA_ARCH__已定义时做真实的坐标匹配bool block(int bid)运行在线程块bid上时返回true对blockIdx.x blockIdx.y * gridDim.x blockIdx.z * gridDim.x * gridDim.y与bid做比较bool thread(int tid, int bid)运行在线程tid且线程块bid上时返回truebool thread(int tid)等价于thread(tid, 0)bool thread0()等价于thread(0, 0)bool block0()等价于block(0)。例如只在线程块 3 的线程 0 上打印if (thread(0, 3)) { print(some_cute_object); }其他输出格式部分 CuTe 类型带有使用不同输出格式的专用打印函数cute::print_layout以纯文本表格形式显示任意**秩 2rank-2**布局非常适合可视化坐标 → 索引的映射关系。cute::print_tensor以纯文本多维表格显示秩 1 至秩 4的张量打印张量元素值便于在拷贝操作后核对数据分块是否符合预期。cute::print_latex输出 LaTeX 命令可通过pdflatex生成格式良好、带颜色的表格。适用于Layout、TiledCopy与TiledMMA对理解 CuTe 内部的布局模式与分区模式非常有帮助。其他调试宏同一份 include/cute/util/debug.hpp 还提供了一组日志与错误检查宏见 include/cute/util/debug.hpp#L52-L98CUTE_LOG(format, ...)向 stdout 打印消息在设备端会自动附加[block (bx,by,bz), thread (tx,ty,tz)]前缀CUTE_LOG_DEBUG(format, ...)仅在定义了DEBUG宏时打印CUTE_ERROR_EXIT(e)对 CUDA 错误码做检查出错时打印文件名、行号、错误名与错误描述并exit(1)CUTE_CHECK_LAST()等价于依次执行cudaPeekAtLastError()与cudaDeviceSynchronize()的错误检查print_typeT...()通过故意触发编译失败的static_assert来打印一个模板类型是调试模板类型的实用技巧。小结CuTe 通过Layout与Tensor两个核心抽象把线程与数据的分层多维布局这一高性能线性代数中最繁琐的部分封装成可组合、可推理的模板组件。快速上手的关键路径是确认编译环境满足 C17 NVCC与 CUTLASS 3.x 相同按 test/unit/cute 与 examples/cute 的结构了解测试与示例的组织方式依据 include/cute 的目录语义快速定位所需头文件布局、张量、算法、架构指令、原子元信息遵循 media/docs/cpp/cute 的教程顺序从0x_gemm_tutorial.md入门开发调试中善用print/print_layout/print_tensor/print_latex并借助thread0()、thread(tid, bid)控制输出范围调试后务必清理设备端打印代码。【免费下载链接】cutlassCUDA Templates and Python DSLs for High-Performance Linear Algebra项目地址: https://gitcode.com/GitHub_Trending/cu/cutlass创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考