详细内容或原文请订阅后点击阅览
一次学习 Triton 一个内核:矩阵乘法
平铺 GEMM、GPU 内存、合并等等!学习 Triton 一次一个内核:矩阵乘法一文首先出现在《走向数据科学》上。
来源:走向数据科学乘法无疑是 GPU 执行的最常见的运算。它是线性代数的基本构建模块,广泛应用于图形、物理模拟和科学计算等不同领域,同时在机器学习中也无处不在。
在今天的文章中,我们将分解通用矩阵-矩阵乘法 (GEMM) 的概念实现,同时介绍一些优化概念,例如平铺和内存合并。最后,我们将在 Triton 中实现 GEMM!
本文是 Triton 和 GPU 内核系列文章的第二篇,如果您不熟悉 Triton 或需要复习 GPU 基础知识,请查看上一篇文章!本文中展示的所有代码都可以在 GitHub 上找到。
本文是 Triton 和 GPU 内核系列文章的第二篇,如果您不熟悉 Triton 或需要复习 GPU 基础知识,请查看上一篇文章! 本文中展示的所有代码均可在 GitHub 上获取。 GitHub免责声明:除特别说明外,以下所有图形和动画均由作者制作。
朴素的 GEMM
让我们从简单的开始:我们想要将两个矩阵 X 和 Y 分别与形状 (M,N) 和 (N,K) 相乘。因此,输出矩阵 Z=X@Y 将具有形状 (M,K)。
X
Y
(M,N)
(N,K)
Z=X@Y
(M,K)
此操作涉及分别计算 X 和 Y 中所有行和列对的点积。一个简单的 NumPy 实现可能看起来像这样:
虽然易于编写、阅读和理解,但这种实现在内存访问和缓存方面效率非常低。正如本系列第一篇文章中提到的,GPU 优化的一个基本方面是最大限度地减少数据传输。
最大限度地减少数据传输然而,我们当前的实现首先从 X 加载一行,迭代加载 Y 的所有 K 列,计算它们的点积,并对 X 中的每一行重复该过程。这导致总共 M(K+1) 次加载操作。
K
M(K+1)
中号
