首页 > 其他分享 >GPU | 初识 Triton

GPU | 初识 Triton

时间:2024-07-26 16:57:45浏览次数:8  
标签:Triton function kernel 编程 初识 BLOCK GPU triton SIZE

❗️此坑还没填完,等到后面用到 triton 再补充

既生 CUDA, 何生 triton

CUDA 编程昂贵上手门槛促使 triton 的诞生[1]

  • 语法福利 相比 CUDA C++ like 的设计风格,triton 使用 python。语法回避 C++ 模板编程和指针;环境集成比起 Pytorch-C++-CUDA 少了几层。
  • 简化编程 将许多 GPU 并行编程优化比如 Memory Coalescing、Shared Memory Management 等自动化管理[2]

与 CUDA 通过 NVCC 编译成 PTX(Parallel Thread Execution, GPU 的汇编)类似,Triton 通过 LLVM 最终编译成 PTX。得益于 LLVM,最近也有其他厂商添加自己的 triton backend[3]

Triton 框架图,来自寒武纪

NVIDIA 也有类似 python 管理 GPU 的 python wrap[^wrap],待日后调研学习。

triton 编程模型

GPU 编程最小粒度是线程,而 GPU 硬件上每 32 个线程分为一个 wrap,每次接受相同的指令,硬件调度最小粒度是 32 的 SIMD。编程模型无法直接和硬件模型相对应,NVIDIA 向开发者隐藏了转换的细节,区分 SIMD NVIDIA 将这种范式称作 SIMT。个人理解 SIMT 是软件和硬件共同表现而非纯硬件架构分类[4]NVIDIA底层到底怎么实现的,谁知道呢

CUDA 和 triton 编程都主要包括俩个函数,但编程粒度有所不同

  • 每个子单元执行的计算(kernel function)
  • 调度多个子单元并行计算(helper function / warper function)

参考 triton tutorial 的 vector addition mini example[5],编程 内容概括如下:

  • kernel function
    • 获取标志当前 "program" 的信息(pid)pid = tl.program_id(axis=0)
    • 根据 "program" 信息计算输入输出数据地址范围 block_start = pid * BLOCK_SIZE; offsets = block_start + tl.arange(0, BLOCK_SIZE)
    • 根据指针载入输入数据 x = tl.load(x_ptr + offsets, mask=mask)
    • 调用模块计算 output = x + y
    • 将输出数据写回 tl.store(output_ptr + offsets, output, mask=mask)
  • helper function
    • 根据执行软件计算维度(和硬件规格),划分硬件资源 grid = lambda meta: (triton.cdiv(n_elements, meta['BLOCK_SIZE']), )
    • 调用 kernel function 并行计算 add_kernel[grid](x, y, output, n_elements, BLOCK_SIZE=1024)

CUDA 编程以 grid 和 block 俩个 dim3 参数划分 thread,而每个 kernel function 内部通过设置的 Dim 维度数和 Id 计算当前线程唯一标识符,如果涉及多个 thread 间的交互则需要调用同步方法;而 triton 编程 kernel function 内部本身也带有一定的并行度,体现在 BLOCK_SIZE 通过 tl.arrange() 展开并行计算。

CUDA / triton 编程模型对比

CUDA triton
核函数配置参数 2 个 dim3 维度变量 gridDim, blockDim(最大划分 6 层) 任意数量 program 维度 + 任意数量每个 program 并行粒度 BLOCK_SIZE
传参方式 kernel_function<<<grid, block>>>(*args) kernel_function[dim_func](*args, BLOCK_SIZE_1=,BLOCK_SIZE_2=, ...)
最小粒度 thread program
核函数唯一标识符 通过 gridId, blockId, threadId 和配置参数计算 通过 programId 和 program 维度配置参数计算
获取 id 内建变量 gridId, blockId, threadId tl.program_id(axis=)
核函数内部并行度 无并行度 并行度由 BLOCK_SIZE 定义
跨 kernel 协同方法 调用跨 thread 同步方法 自动完成

使用函数包装配置参数 dim_function(dict)->tuple, 接受 triton config 入参 autotune 输出配置参数。


  1. https://github.com/openai/triton ↩︎

  2. https://openai.com/index/triton/ ↩︎

  3. 寒武纪和微软的 triton-linalg 转换流程 https://github.com/Cambricon/triton-linalg ↩︎

  4. 该结论主要参考《计算机体系架构:量化研究方法》中 GPU 章节以及网上论坛得出 ↩︎

  5. https://triton-lang.org/main/getting-started/tutorials/01-vector-add.html
    https://docs.nvidia.com/cuda/cuda-c-programming-guide/index.html ↩︎

标签:Triton,function,kernel,编程,初识,BLOCK,GPU,triton,SIZE
From: https://www.cnblogs.com/devil-sx/p/18325732

相关文章

  • 第1章 初识 C 语言
    目录1.1C语言的起源1.2选择C语言的理由1.2.1设计特性1.2.2高效性1.2.3可移植性1.2.4强大而灵活1.2.5面向程序员1.2.6缺点1.3C语言的应用范围1.4计算机能做什么1.5高级计算机语言和编译器1.6语言标准1.6.1第1个ANSI/ISOC标准1.6.2C99标准......
  • Java SE 核心技术——java初识
    一、JDK、JRE和JVM1.JDK、JRE和JVM定义JDK​即Java开发工具包。JDK是用于Java开发的一套工具包,里面包含了Java的编译器javac、Java程序打包工具jar、Java程序运行环境JRE、文档生成工具javadoc以及很多用于开发的工具。JRE​JRE是运行Java程序所需的环境,包括JVM......
  • Java初识
    Java编译和运行的CMD命令1首先在cmd中指定到.Java文件所在文件路径,例D://aaaa2:执行Javac命令,将其编译成.class文件,例hello.java注意添加文件后缀3:路径上生成了以.class结尾的文件,例hello.class,执行java运行命令Java跨平台原理我们写的Java源代码会首先编译生成.class字......
  • java初识
    JAVA初识1.JDK,JRE和JVM1.1JDK(JavaDevelopmentKit,Java开发工具包)Java开发工具包。顾名思义,JDK是用于Java开发的一套工具包,里面包含了Java的编译器javac、Java程序打包工具jar、Java程序运行环境JRE、文档生成工具javadoc以及很多用于开发的工具,如调试工具jdb等。1.2JRE(Java......
  • 【网络流】-初识(最大流)
    @目录基础信息引入一些概念基本性质最大流定义Ford–Fulkerson增广Edmons−Karp算法Dinic算法参考文献基础信息引入假定现在有一个无限放水的自来水厂和一个无限收水的小区,他们之间有多条水管和一些节点构成。每一条水管有三个属性:流向,流量,容量。我们用\((u,v)\)表示一条......
  • 有手就行,轻松本地部署 Llama、Qwen 大模型,无需 GPU
    用CPU也能部署私有化大模型?对,没错,只要你的电脑有个8G内存,你就可以轻松部署Llama、Gemma、Qwen等多种开源大模型。非技术人员,安装Docker、Docker-compose很费劲?不用,这些都不需要安装,就一个要求:有手就行~今天主要为大家分享保姆级教程:如何利用普通个人电脑,本地私有......
  • 后端开发工程师vue2初识的学习
    博客主页:音符犹如代码系列专栏:JavaWeb关注博主,后期持续更新系列文章如果有错误感谢请大家批评指出,及时修改感谢大家点赞......
  • 微软正式推出适用于WSL Linux的D3D12 GPU视频加速技术
    今天,微软正式向WindowsSubsystemforLinux(WSL)用户发布了Direct3D12GPU视频加速支持。在微软通过WSL允许在Linux下使用OpenGL、OpenCL和VulkanAPI进行GPU加速的工程工作之后,他们现在已经准备好提供官方视频加速支持。这项工作是在Mesa中建立起来的,......
  • 数据库入门知识点 1--初识MySQL数据库
    1、数据库(1)json,wps,txt,md,···都是保存文本数据的(数据交互麻烦,数据安全问题)(2)列表,元组,字典,集合,···(保存临时的数据,对数据进行处理的时候保存。)银行卡----存入的钱(不允许随意修改的)游戏的数据-----数据不存档--没有安全保障----第二天就会回到解放前。(3)使用专门的数据库......
  • CPU(中央处理器)和GPU(图像处理器)的区别
    CPU(中央处理器)和GPU(图像处理器)的区别GPU和CPU是什么?CPU:中央处理器(英文CentralProcessingUnit)是一台计算机的运算核心和控制核心。CPU、内部存储器和输入/输出设备是电子计算机三大核心部件。其功能主要是解释计算机指令以及处理计算机软件中的数据。CPUGPU:英文全称Graphi......