BASIC语言实现CUDA Tile GPU编程

1 阅读3分钟

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!