0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

在Python中借助NVIDIA CUDA Tile简化GPU编程

NVIDIA英伟达企业解决方案 来源:NVIDIA英伟达企业解决方案 2025-12-13 10:12 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

NVIDIA CUDA 13.1 版本新增了基于 Tile 的GPU 编程模式。它是自 CUDA 发明以来 GPU 编程最核心的更新之一。借助 GPU tile kernels,可以用比 SIMT 模型更高的层级来实现算法。至于如何将计算任务拆分到各个线程,完全由编译器和运行时在底层自动处理。不仅如此,tile kernels 还能够屏蔽 Tensor Core 等专用硬件的细节,写出的代码还能兼容未来的 GPU 架构。借助 NVIDIA cuTile Python开发者可以直接用 Python 编写 tile kernels。

什么是cuTile Python?

cuTile Python 是 CUDA Tile 编程模型在 Python 中的实现,基于 CUDA Tile IR 规范开发。它支持用 Python 编写 tile kernels,以 tile-based 模型来定义 GPU kernels——既可以作为 SIMT 模型的替代,也能作为 SIMT 模型的补充。

SIMT 编程要求明确指定每个 GPU 执行线程的任务。理论上,每个线程都能独立运行,执行和其他线程不同的代码路径。但实际应用中,要充分发挥 GPU 性能,通常会采用单线程对不同数据执行相同操作的算法设计思路。

SIMT 模型的优势是灵活性高、可定制性强,但要达到顶级性能,往往需要大量手动调优。而 tile model 能够帮助屏蔽部分硬件底层细节,而聚焦于更高层级的算法设计。至于 tile 算法如何拆分为线程、如何调度到 GPU 上执行,这些工作都由 NVIDIA CUDA 编译器和运行时自动完成。

cuTile 是专为 NVIDIA GPU 设计的并行 kernels 编程模型,核心规则有四条:

数组是最核心的数据结构;

Tiles 是 kernels 操作的数组子集;

Kernels 是由多个 Block 并行执行的函数;

Block 是 GPU 计算资源的子集,tiles 的操作会在各个 block 之间并行开展。

cuTile 能自动处理块级并行、异步执行、内存迁移等 GPU 编程的底层细节。它可以充分利用 NVIDIA 硬件的高级特性,比如 Tensor Cores、共享内存、Tensor 内存加速器,而且不需要手动编写相关代码。更重要的是,cuTile 能跨不同 NVIDIA GPU 架构迁移,不用重写代码,就能使用最新的硬件功能。

cuTile适合哪些人使用?

cuTile 面向的是需要编写通用数据并行 GPU kernels 的开发者。目前我们重点针对 AI/ML 应用中常见的计算类型优化 cuTile,后续还会持续迭代——新增功能和性能特性,让它能优化更多类型的工作负载。

你可能会疑惑:CUDA C++ 和 CUDA Python 一直很好用,为什么还要用 cuTile 写 kernels?关于这一点,我们在另一篇介绍 CUDA tile model 的文章里有详细说明。简单来说,现在 GPU 硬件架构越来越复杂,我们提供这样一层合理的抽象,就是为了能让开发者更专注于算法本身,不用再花大量精力把算法手动适配到特定硬件上。

用 tile 模式写代码,既能利用 Tensor Cores 的性能,又能保证代码兼容未来的 GPU 架构。就像 PTX 是 SIMT 模型的底层虚拟指令集架构(ISA),CUDA Tile IR 就是 tile-based 编程的虚拟指令集架构。它支持用更高层级表达算法,软件和硬件会在底层自动把这种表达映射到 Tensor Cores,助力实现峰值性能。

cuTilePython代码示例

cuTile Python 代码长什么样?如果你学过 CUDA C++,一定接触过经典的向量加法 kernels。假设数据已经从主机端拷贝到设备端,CUDA SIMT 实现的向量加法 kernels 如下——它接收两个向量,逐元素相加后生成第三个向量,是最基础的 CUDA kernels 之一。

__global__ void vecAdd(float* A, float* B, float* C, int vectorLength)

{

/* calculate my thread index */

int workIndex = threadIdx.x + blockIdx.x*blockDim.x;

if(workIndex < vectorLength)

{

/* perform the vector addition */

C[workIndex] = A[workIndex] + B[workIndex];

}

}在这个 kernel 里,每个线程的任务都要明确指定。而且你启动 kernel 时,还得手动选择要启动的 blocks 和线程数。

再看等效的 cuTile Python 实现:不用指定每个线程的操作,只需把数据拆成 tiles,定义好每个 tile 的数学运算就行,剩下的工作全由 cuTile 自动处理。

cuTile Python kernel 代码如下:

import cuda.tile as ct

@ct.kernel

def vector_add(a, b, c, tile_size: ct.Constant[int]):

# Get the 1D pid

pid = ct.bid(0)

# Load input tiles

a_tile = ct.load(a, index=(pid,) , shape=(tile_size, ) )

b_tile = ct.load(b, index=(pid,) , shape=(tile_size, ) )

# Perform elementwise addition

result = a_tile + b_tile

# Store result

ct.store(c, index=(pid, ), tile=result)

ct.bid(0) 是用于获取(本例中)第 0 维度块 ID 的函数,例如,它的作用相当于 SIMT kernels 开发者使用 blockIdx.x 与 threadIdx.x。ct.load() 函数则用于从设备内存中加载指定索引和形状的 tile 数据,数据加载到 tiles 后,即可用于计算,所有计算完成后,ct.store() 会将 tiled 数据写回 GPU 设备内存。

完整实现代码

接下来,我们将展示如何在 Python 中调用这个 vector_add kernels,并提供一份你可直接运行的完整 Python 脚本。以下是包含 kernels 定义与主函数的完整代码。

"""

Example demonstrating simple vector addition.

Shows how to perform elementwise operations on vectors.

"""

from math import ceil

import cupy as cp

import numpy as np

import cuda.tile as ct

@ct.kernel

def vector_add(a, b, c, tile_size: ct.Constant[int]):

# Get the 1D pid

pid = ct.bid(0)

# Load input tiles

a_tile = ct.load(a, index=(pid,) , shape=(tile_size, ) )

b_tile = ct.load(b, index=(pid,) , shape=(tile_size, ) )

# Perform elementwise addition

result = a_tile + b_tile

# Store result

ct.store(c, index=(pid, ), tile=result)

def test():

# Create input data

vector_size = 2**12

tile_size = 2**4

grid = (ceil(vector_size / tile_size),1,1)

a = cp.random.uniform(-1, 1, vector_size)

b = cp.random.uniform(-1, 1, vector_size)

c = cp.zeros_like(a)

# Launch kernel

ct.launch(cp.cuda.get_current_stream(),

grid, # 1D grid of processors

vector_add,

(a, b, c, tile_size))

# Copy to host only to compare

a_np = cp.asnumpy(a)

b_np = cp.asnumpy(b)

c_np = cp.asnumpy(c)

# Verify results

expected = a_np + b_np

np.testing.assert_array_almost_equal(c_np, expected)

print("✓ vector_add_example passed!")

if __name__ == "__main__":

test()

如果已经安装好 cuTile Python、CuPy 等必要软件,运行代码很简单,直接执行以下命令即可:

$ python3 VectorAdd_quickstart.py

✓ vector_add_example passed!

恭喜!你已经成功运行了第一个 cuTile Python 程序。

开发者工具支持

[]()cuTile kernels 的性能分析可以用 NVIDIA Nsight Compute,操作方式和 SIMT kernels 完全一样。

$ ncu -o VecAddProfile --set detailed python3 VectorAdd_quickstart.py

生成性能分析文件后,用 Nsight Compute 图形界面打开,按以下步骤操作:

● 选中 vector_add kernel;

● 选择“Details”标签页;

● 展开“Tile Statistics”报告板块。

此时你会看到类似图 1 的界面。

wKgZPGk8y7uAAO91AABgR8uzZEI228.jpg

图 1. Nsight Compute生成的性能分析报告,展示vector_add kernel的tile 统计信息

请注意,Tile Statistics 板块包含了指定的 tile 数量、大小(由编译器自动选择),以及其他 tile 专属信息。

源码页面同样支持 cuTile kernels,还能查看源码行级别的性能指标——这和 CUDA C kernels 的支持方式完全一致。

如何获取 cuTile ?

运行 cuTile Python 程序,需要满足以下环境要求:

GPU 计算能力需为 10.x 或 12.x(后续 CUDA 版本会支持更多 GPU 架构);

NVIDIA 驱动版本需为 R580 及以上(若要使用 tile 专属开发者工具,需升级到 R590);

安装 CUDA Toolkit 13.1 及以上版本;

Python 版本需为 3.10 及以上;

安装 cuTile Python 包:执行 pip install cuda-tile 命令即可完成安装。

关于作者

Jonathan Bentz 领导 NVIDIA 的 CUDA 技术营销工程团队,其团队专注于创建和提供引人入胜的内容,并与 CUDA 开发者建立联系。Jonathan 拥有爱荷华州立大学化学博士学位和计算机科学硕士学位。

Tony Scudiero 是 CUDA 平台的技术营销工程师。他致力于将 CUDA 带给各种类型和能力的开发者。在 NVIDIA 任职期间,他曾使用过大型 HPC 系统和应用、实时声学模拟 (VRWorks Audio) 和 Omniverse RTX 渲染器。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • NVIDIA
    +关注

    关注

    14

    文章

    5508

    浏览量

    109121
  • gpu
    gpu
    +关注

    关注

    28

    文章

    5105

    浏览量

    134489
  • 编程
    +关注

    关注

    90

    文章

    3709

    浏览量

    96788
  • python
    +关注

    关注

    57

    文章

    4859

    浏览量

    89618

原文标题:在 Python 中借助 NVIDIA CUDA Tile 简化 GPU 编程

文章出处:【微信号:NVIDIA-Enterprise,微信公众号:NVIDIA英伟达企业解决方案】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    NVIDIA Tesla K40C K40M 高精密并行计算GPU

    ;amp;quot; 21000 三年质保 丽台盒装 现货 Nvidia TeslaK20M &quot;GPU 的数量和类型:1 Kepler GK110CUDA核心数量:2496
    发表于 09-02 21:17

    NVIDIA英伟达】招聘QA Engineer

    Hi,各位工程师们,金三银四,不如现在 —NVIDIA 最新开放职位,“职”为你而来!!没错,作为GPU的发明者,NVIDIA过去一年斩获殊荣无限,这一切皆因我们有一群如你一样为梦想不断奋斗的员工
    发表于 03-03 11:19

    NVIDIA火热招聘GPU高性能计算架构师

    GPU架构设计者提供反馈,以改善和推进未来GPU的架构设计基本要求(其一即可): * 严谨的逻辑思维和分析能力* 有CUDA代码调优经验(或者SIMD等架构的调优经验)* 熟悉矩阵计算的优化和加速* 较强C++
    发表于 09-01 17:22

    NVIDIA英伟达 GPU厂商 招聘软件类职位(上海/深圳)

    Hi, 大家好,全球知名GPU厂商NVIDIA,热招软件测试、测试开发等相关职位。众所周知,目前NV的深度学习、CUDA非常火热,是IT/AI行业最火的企业之一,股价更是一年之类翻了
    发表于 09-06 11:01

    NVIDIA 招聘 软件测试篇(深圳、上海)

    或者Shell3.了解图形开发工具4.测试图形开发工具不同操作系统下的情况5.写测试计划6.英文熟悉CUDA测试分析工程师[上海]1.优秀的解决问题的能力2.精通Linux3.精通Python4.熟悉
    发表于 03-21 16:09

    NVIDIA-SMI:监控GPU的绝佳起点

    nvidia-smi可执行文件位于虚拟机管理程序上。如果在同一部署您选择GPU上使用作为传递,那么GPU正在寻找访客上的
    发表于 09-04 15:18

    用于vGPU的GPU调度程序

    你好。我对NVidia开发人员提出了问题和建议。关于GPU调度程序的真正功能的信息很少。调度程序只是简单的循环法吗?它是可编程的吗?它是从dom0编程的(例如,Dom0
    发表于 09-11 16:37

    CUDA编程教程

    Nvidia CUDA 2.0编程教程
    发表于 03-05 07:30

    linux安装GPU显卡驱动、CUDA和cuDNN库

    搞机器学习也有一段时间了,每次部署GPU开发环境就是一场战争,先记录一下基本步骤,结合网上资料和个人实践整理如下:1、检查BIOS启动项,关闭一些选项 开机启动项的Security选项检查
    发表于 07-09 07:45

    Ubuntu上使用Nvidia GPU训练模型

    问题最近在Ubuntu上使用Nvidia GPU训练模型的时候,没有问题,过一会再训练出现非常卡顿,使用nvidia-smi查看发现,显示GPU的风扇和电源报错:解决方案自动风扇控制
    发表于 01-03 08:24

    探求NVIDIA GPU极限性能的利器

    1、探求 NVIDIA GPU 极限性能的利器  通常的 CUDA 编程,用户主要通过
    发表于 10-11 14:35

    NVIDIA推出适用于Python的VPF,简化开发GPU加速视频编码/解码

    NVIDIA推出了适用于Python的开源视频处理框架“VideoProcessingFramework”(VPF)。据悉,VPF 是一组开源的C ++库和Python绑定,可与其封闭源代码Codec SDK进行交互。该框架的功
    的头像 发表于 12-18 14:25 7688次阅读

    如何使用WarpPython环境编写CUDA内核

      通常,实时物理模拟代码是用低级 CUDA C ++编写的,以获得最佳性能。在这篇文章,我们将介绍 NVIDIA Warp ,这是一个新的 Python 框架,可以轻松地用
    的头像 发表于 04-02 16:15 3418次阅读

    CUDA简介: CUDA编程模型概述

    CUDA 编程模型,线程是进行计算或内存操作的最低抽象级别。 从基于 NVIDIA Ampere
    的头像 发表于 04-20 17:16 3823次阅读
    <b class='flag-5'>CUDA</b>简介: <b class='flag-5'>CUDA</b><b class='flag-5'>编程</b>模型概述

    使用CUDA进行编程的要求有哪些

    CUDANVIDIA的一种用于GPU编程的技术,CUDA核心是GPU上的一组小型计算单元,它们
    的头像 发表于 01-08 09:20 3346次阅读