@matthewjgunton: NVIDIA 软件栈中有 3 个基本层级:CUDA C++、PTX 和 SASS。理解全部 3 个层级有助于你明白为什么 CU…

X AI KOLs Timeline 新闻

摘要

一条教育性推文,解释了 NVIDIA 软件栈的三个层级(CUDA C++、PTX、SASS),以及 CUDA 的抽象如何构建护城河,同时提到 Luminal 的自动编译器搜索。

NVIDIA 软件栈中有 3 个基本层级 CUDA C++、PTX 和 SASS 理解全部 3 个层级可以帮助你明白为什么 CUDA 建立起万亿美元级的护城河 CUDA C++ - 它为你提供 NVIDIA 的编程模型(线程、块、共享内存、同步),而无需你针对具体 GPU 架构编写指令。事实上,一个好的 CUDA 内核往往能在多代 NVIDIA 硬件上使用。这意味着新芯片在发布第一天就有现成的实用软件可用 CUDA C++ 会被降级为 PTX PTX(并行线程执行,Parallel Thread Execution)- 这是一种虚拟指令集。由于它们是虚拟机指令,因此允许同一个 CUDA 内核无需重写即可在不同 NVIDIA 设备上运行。话虽如此,当我们想在芯片的特定部分使用特定命令(例如 WGMMA)时,我们会在 PTX 中明确指定,以便在编译过程中对我们要使用的指令没有任何歧义。当然,这种选择会带来可移植性方面的权衡。一旦我们精确指定了想要的硬件组件,就无法将该内核移植到没有该组件的 NVIDIA 设备上 PTX 会被降级为 SASS SASS - NVIDIA 的原生机器码。这是旅途的终点。我们将虚拟指令集转换为将在我们特定机器上运行的确切可执行代码。这是可移植性最差的代码版本,但当然也是最完整的。在这个层级编码非常痛苦,所以很少人在这里工作 CUDA 的巨大优势在于,你可以将在 Ampere 上编写的内核在 Hopper 发布当天就迁移过去。这让 NVIDIA 的软件栈得以不断累积优势 挑战在于抽象层。由于有了这层距离,你在很大程度上依赖 NVIDIA 编译器来为你的代码在不同硬件上找到快速运行的方式 实际上,开发者会尝试许多不同的策略来找到最快运行其内核的方式 换句话说,你必须进行手动搜索 在 Luminal,我们正在创建一个编译器,它将完全自动且确定性地处理这种搜索
查看原文
查看缓存全文

缓存时间: 2026/08/07 16:54

NVIDIA 软件栈有 3 个基本层次 CUDA C++、PTX 和 SASS 理解全部三层,你就会明白 CUDA 为何能构建起万亿美元的护城河

CUDA C++ - 它为你提供 NVIDIA 的编程模型(线程、块、共享内存、同步),而无需你为特定的 GPU 架构编写指令。事实上,一个优秀的 CUDA 内核常常能跨多代 NVIDIA 硬件使用。这意味着新芯片发布第一天就有现成的实用软件可用

CUDA C++ 会被转换为 PTX

PTX(并行线程执行)- 这是一个虚拟指令集。由于它们是虚拟机指令,所以可以让一个 CUDA 内核无须重写即可在不同的 NVIDIA 设备上运行。话虽如此,当我们想要在芯片的某个特定部分使用特定指令(如 WGMMA)时,我们会用 PTX 来指定,这样编译期间就不会对我们想用的是什么产生歧义。当然,这种选择会带来可移植性上的权衡。一旦我们明确指定了想要的硬件组件,就无法将该内核移植到没有该组件的 NVIDIA 设备上

PTX 会被转换为 SASS

SASS - NVIDIA 的原生机器码。这是旅途的终点。我们把虚拟指令集转换为能在特定机器上运行的确切可执行代码。这是代码可移植性最差的版本,但当然也是最完整的。在这个层面上编码非常痛苦,所以极少有人涉足

CUDA 的一大优势是,你可以把为 Ampere 编写的内核在 Hopper 发布当天迁移到 Hopper 上。这让 NVIDIA 的软件栈产生了复利效应

挑战在于抽象。由于有了这种距离,你严重依赖 NVIDIA 的编译器来寻找在不同硬件上运行代码的快速方式

在实践中,开发者会尝试许多不同的策略,来找到运行其内核的最快方式 换句话说,你必须进行手动搜索

在 Luminal,我们正在构建一个编译器,它将完全自动且确定性地处理这种搜索。

相似文章