本文介绍 PTX:一种用于并行线程执行(Parallel Thread Execution)的低层次虚拟机及指令集架构(Instruction Set Architecture,ISA)。PTX 将 GPU 呈现为一个可进行数据并行计算的设备。
1.1. 利用 GPU 实现可扩展的数据并行计算#
在市场对实时、高清 3D 图形的持续需求推动下,可编程 GPU 已发展为一种高度并行、支持多线程的众核处理器,拥有强大的计算能力和极高的内存带宽。GPU 尤其适合处理既能表达为数据并行计算、又具有较高算术强度(arithmetic intensity)的问题。数据并行计算是指在多个数据元素上并行执行同一个程序;这里的算术强度是指算术运算次数与内存操作次数之比。由于每个数据元素都执行相同的程序,对复杂流程控制的需求较低;同时,大量数据元素上的计算与较高的算术强度,使得内存访问延迟可以通过计算来隐藏,而不必依赖大型数据缓存。
数据并行处理将数据元素映射到并行执行的线程。许多处理大规模数据集的应用都可以采用数据并行编程模型来加速计算。在 3D 渲染中,大量像素和顶点被映射到并行线程。类似地,图像与媒体处理应用,例如渲染图像的后处理、视频编码与解码、图像缩放、立体视觉和模式识别,也可以将图像块与像素映射到并行处理线程。事实上,数据并行处理所加速的算法远不限于图像渲染和处理领域,还包括通用信号处理、物理仿真、计算金融和计算生物学等。
PTX 为通用并行线程执行定义了虚拟机和指令集架构。PTX 程序在安装时被转换为目标硬件的指令集。PTX 到 GPU 的转换器与驱动程序,使 NVIDIA GPU 能够作为可编程的并行计算机使用。
1.2. PTX 的设计目标#
PTX 为通用并行编程提供稳定的编程模型和指令集。它旨在高效运行于支持 NVIDIA Tesla 架构所定义计算特性的 NVIDIA GPU。CUDA 和 C/C++ 等高级语言的编译器生成 PTX 指令,随后针对目标架构对这些指令进行优化,并将其转换为该架构的原生指令。
PTX 的设计目标包括:
- 提供跨越多代 GPU 的稳定指令集架构。
- 使编译后的应用程序获得与 GPU 原生代码相当的性能。
- 提供与具体机器无关的指令集架构,作为 C/C++ 等编译器的目标。
- 为应用程序和中间件开发者提供用于代码分发的指令集架构。
- 为优化型代码生成器和转换器提供通用的源代码级指令集架构,由这些工具将 PTX 映射到具体的目标机器。
- 便于手工编写库、高性能计算内核(kernel)和架构测试。
- 提供可扩展的编程模型,覆盖从单个计算单元到多个并行计算单元的不同 GPU 规模。
1.3. PTX ISA 9.4 版本#
PTX ISA 9.4 版本引入了以下新特性:
- 新增对
sm_107目标架构的支持。 - 新增对
sm_107f目标的支持,该目标支持架构家族特定特性(family-specific features)。 - 新增对
sm_107a目标的支持,该目标支持架构特定特性(architecture-specific features)。 - 为
set指令新增.u8x4、.s8x4、.u16x2、.s16x2指令类型支持。 - 为
cvt指令新增.pzo限定符支持。 - 当
cvt指令的目标类型为.e4m3x2、.e5m2x2、.e2m3x2、.e3m2x2、.e2m1x2时,新增.rz舍入模式支持。 - 为
mbarrier.expect_tx、mbarrier.complete_tx、mbarrier.arrive、mbarrier.arrive_drop、cp.async.bulk、cp.async.bulk.tensor和tcgen05.commit指令新增.multicast::cluster::32b限定符支持。 - 为
tcgen05.commit指令新增.sync_restrict::shared::read::mma::a限定符支持。 - 为
cp.async.bulk.prefetch和cp.async.bulk.prefetch.tensor指令新增.level::eviction_priority限定符支持。 - 新增
applypriority.async.bulk和applypriority.async.bulk.tensor指令支持。 - 为
cp.async.bulk.tensor、cp.reduce.async.bulk.tensor、cp.async.bulk.prefetch.tensor指令新增.override::global_address和.override_attribute限定符支持。 - 为
cp.async.bulk.tensor和cp.reduce.async.bulk.tensor指令新增.im2col_no_offs::w限定符支持。 - 为
tcgen05.ld和tcgen05.ld.red指令新增.spcompress限定符支持。 - 新增
spcompress和spdecompress指令支持。 - 为
cvt指令新增.ue5m3x2指令类型支持。 - 为
cvt指令新增.scaled::n1::ue8m0限定符支持。 - 为
tcgen05.mma和tcgen05.mma.sp指令新增UE5M3缩放因子类型。 - 为
tcgen05.mma、tcgen05.mma.sp、tcgen05.mma.ws、tcgen05.mma.ws.sp指令新增.kind::ti16限定符支持。 - 新增
add、sub、mul和fma指令对.f16x2/.bf16x2/.f32x2类型的支持。 - 新增
add、sub、mul和fma指令对 FP8/FP6/FP4 x4 打包类型的支持。 - 为
tcgen05.alloc和tcgen05.dealloc指令新增.exclusive限定符支持。 - 为
mbarrier.test_wait和mbarrier.try_wait指令新增.phase_type::*限定符支持。 - 为
mbarrier.test_wait和mbarrier.try_wait指令新增reportPredicate和reportValue操作数支持。 - 为 mbarrier 指令新增
.layout限定符支持,并新增mbarrier.check_layout指令支持。 - 为
cp.async.bulk和cp.async.bulk.tensor指令新增.report_mechanism限定符支持。 - 为
tcgen05.mma指令新增.decompress::lut::b限定符支持。 - 为
tcgen05.mma指令新增.collector::b::*限定符支持。 - 新增
.loc_intermediate指示符和.nv_intermediate_source_section结构支持,用于中间表示(IR)的源代码位置映射。 - 为
prefetch指令新增.valid_addr和.L1::32B限定符支持。 - 为
atom、red、cp.reduce.async.bulk和multimem.cp.reduce.async.bulk指令新增.f32类型下的.noftz限定符支持。 - 为
ld指令新增.proxy::readonly限定符支持。 - 新增
.minperctamemory指示符,以及%perctamemoryoffset、%perctamemorysize特殊寄存器支持,用于每个 CTA(协作线程数组)的全局内存。 - 为
ldmatrix指令新增.m8n16形状下的.s8.s4类型支持。 - 为
fence.proxy.async::generic指令新增.sync_restrict::shared::cluster::read限定符支持。 - 为
fence.proxy指令新增.acquire、.release限定符与.alias限定符配合使用的支持。 - 新增
fabric.try_get.async.tensor、fabric.try_put.async.tensor和fabric.try_red.async.tensor指令支持。 - 新增
fabric.try_atom指令支持。 - 新增
createpolicy.range.fabric指令支持。 - 为
fabric.try_get、fabric.try_put和fabric.try_red指令新增.level::cache_hint限定符支持。
1.4. 文档结构#
本文档的信息按以下章节组织:
- 编程模型(Programming Model):概述编程模型。
- PTX 机器模型(PTX Machine Model):概述 PTX 虚拟机模型。
- 语法(Syntax):介绍 PTX 语言的基本语法。
- 状态空间、类型与变量(State Spaces, Types, and Variables):介绍状态空间、类型和变量声明。
- 指令操作数(Instruction Operands):介绍指令操作数。
- ABI 抽象(Abstracting the ABI):介绍函数与调用语法、调用约定,以及 PTX 对应用程序二进制接口(Application Binary Interface,ABI)抽象的支持。
- 指令集(Instruction Set):介绍指令集。
- 特殊寄存器(Special Registers):列出特殊寄存器。
- 汇编指示符(Directives):列出 PTX 支持的汇编指示符。
- 版本说明(Release Notes):提供 PTX ISA 2.x 及后续版本的发布说明。
参考文献
- 754-2008 IEEE Standard for Floating-Point Arithmetic ↗(IEEE 浮点算术标准)。ISBN 978-0-7381-5752-8,2008 年。
- The OpenCL Specification ↗(OpenCL 规范),版本 1.1,文档修订号 44,2011 年 6 月 1 日。
- CUDA Programming Guide ↗(CUDA 编程指南)。
- CUDA Dynamic Parallelism Programming Guide ↗(CUDA 动态并行编程指南)。
- CUDA Atomicity Requirements ↗(CUDA 原子性要求)。
- PTX Writers Guide to Interoperability ↗(PTX 编写者互操作性指南)。