CUDA 13.1引入了CUDA Tile,这是一种基于分块的下一代GPU编程范式,旨在使细粒度并行更易用、更灵活。其关键优势之一是语言开放性:任何编程语言都可以针对CUDA Tile进行编程,使开发者能够将基于分块的GPU加速引入各种生态系统。
为了响应各地资深开发者的强烈需求,发布了用于GPU的cuTile BASIC,将该CUDA Tile编程带入了这种长期被忽视的语言。
什么是cuTile BASIC?
cuTile BASIC是BASIC语言中CUDA Tile编程模型的实现,构建于CUDA Tile IR规范之上。它允许使用基于分块的模型在BASIC中编写分块核函数,这对于像BASIC这样早于多线程编程的语言来说非常自然。
cuTile BASIC完美结合了GPU的强大性能与BASIC编程语言的过时魅力和语法简洁性。
cuTile BASIC 的目标用户是谁?
BASIC是最古老的编程语言之一,因此受到整整一代开发者的推崇。对许多开发者来说,BASIC是他们接触计算机编程的入门语言。
现在,那些脑海中仍留有BASIC记忆的开发者可以首次将遗留应用程序带到某机构的GPU加速计算中。这释放了BASIC编程语言以前无法想象的性能和功能。
环境搭建
首先,使用PIP安装cuTile BASIC:
pip install git+https://github.com/nvidia/cuda-tile.git@basic-experimental
运行cuTile BASIC的完整硬件和软件要求列于本文末尾(建议64KB或更多RAM)。
cuTile BASIC 示例
以下是在cuTile BASIC中编写的向量加法核函数:
10 REM 向量加法: C = A + B
20 INPUT N, A(), B()
30 DIM A(N), B(N), C(N)
40 TILE A(128), B(128), C(128)
50 LET C(BID) = A(BID) + B(BID)
60 OUTPUT C
70 END
此示例使用标准BASIC语法,增加了三个额外内容:
- 对数组进行索引会返回一个分块,即数组的一个子集。
BID是一个内置变量,用于指定分块索引。TILE指定数组应被划分成的分块大小。
注意,除了加法操作外不需要指定任何其他内容,其余都由cuTile BASIC处理。
运行示例
如果安装了正确版本的CUDA Toolkit和Python,并从GitHub下载了cuTile BASIC仓库,可以执行以下命令:
$ python examples/vector_add.py
[1/2] 编译为cubin ...
数组: ['A', 'B', 'C'],分块形状={'A': [128], 'B': [128], 'C': [128]},网格大小=8
[2/2] 在GPU上启动核函数 ...
结果(显示1024个中的5个样本):
C[ 0] = 0.0 (预期 0.0)
C[ 1] = 3.0 (预期 3.0)
C[ 511] = 1533.0 (预期 1533.0)
C[ 512] = 1536.0 (预期 1536.0)
C[1023] = 3069.0 (预期 3069.0)
验证通过 (max_diff=0.000000, 1024个元素)
BASIC 矩阵乘法
以下是在BASIC中编写的矩阵乘法(GEMM)核函数:
10 REM GEMM: C(M,N) = A(M,K) * B(K,N)
15 INPUT M, N, K, A(), B()
20 DIM A(M, K), B(K, N), C(M, N)
30 TILE A(128, 32), B(32, 128), C(128, 128), ACC(128, 128)
40 LET TILEM = INT(BID / INT(N / 128))
50 LET TILEN = BID MOD INT(N / 128)
60 LET ACC = 0.0
70 FOR KI = 0 TO INT(K / 32) - 1
80 LET ACC = MMA(A(TILEM, KI), B(KI, TILEN), ACC)
90 NEXT KI
100 LET C(TILEM, TILEN) = ACC
110 OUTPUT C
120 END
在此核函数中,TILE指定了A、B和C的分块方式以及累加器分块ACC的大小。MMA是矩阵乘加的函数调用。
运行示例输出如下:
$ python examples/gemm.py
[1/2] 编译为cubin ...
M=512, N=512, K=512,分块形状={'A': [128, 32], 'B': [32, 128], 'C': [128, 128]},网格大小=16
[2/2] 在GPU上启动核函数 ...
结果(显示512x512=262144个元素中的5个样本):
C[0,0] = -0.1199 (预期 -0.1199)
C[0,1] = -14.4456 (预期 -14.4456)
C[256,0] = -15.8891 (预期 -15.8891)
C[256,1] = -2.8646 (预期 -2.8646)
C[511,511] = 11.4724 (预期 11.4724)
验证通过 (max_diff=0.000012, tol=0.005120)
如何获取cuTile
运行cuTile BASIC程序需要以下环境:
- 计算能力为8.x、10.x、11.x或12.x的GPU
- 某机构驱动程序R580或更高版本
- CUDA Toolkit 13.1或更高版本
- Python 3.10或更高版本
- cuTile BASIC包
开始使用
获取所有软件后,可以查阅完整的cuTile BASIC文档,尝试GitHub上的所有示例程序,并立即开始使用cuTile BASIC进行编程。
虽然BASIC可能不是开发者进行高性能并行计算的首选语言,但它有力地证明了:由于CUDA软件栈的设计,CUDA Tile几乎可以从任何编程语言中使用。通过编译为CUDA Tile IR格式,CUDA Tile可以移植到几乎任何语言……甚至BASIC!