PTX (Parallel Thread Execution)

是英伟达设计的一种中间语言,可以看作GPU的一种汇编语言。

以分号作为指令的分隔符。

状态空间

明确变量存储在GPU的哪种内存中。

状态空间关键字描述生命周期
寄存器.reg单个线程私有线程
特殊寄存器.sreg预定义的只读寄存器,如线程/块ID线程/块
共享内存.shared同线程块共享线程块
全局内存.global所有线程块可读写应用程序
本地内存.local单个线程私有,物理上位于全局内存线程
常量内存.const所有线程块只读,由主机初始化应用程序
参数内存.param用于向内核传递参数内核调用

变量和操作数

  • 立即数:普通数值。
  • 标识符:变量名以%开头。
  • 地址:用[]括起来。
  • 向量:支持.v2.v4等,写作{ %f1, %f2, %f3, %f4 }

格式

opcode{.type}{.modifier} d, a, b, c;

部分描述示例
opcode操作码add
.type数据类型.u32
.modifier修饰符.lo
d目标操作数通常是寄存器
a, b, c源操作数可以是寄存器、立即数或地址

基础

寄存器声明

.reg .b32 %r<10>;  // 声明了 10 个 32 位位寄存器,名字是 %r0 到 %r9
.reg .f32 %f<5>;   // 声明了 5 个 32 位浮点寄存器,名字是 %f0 到 %f4
.reg .pred %p<3>;  // 声明了 3 个谓词(布尔)寄存器,用于条件判断

数据搬运

ld.global.f32 %f1, [%r1]; // 从 gmem 加载一个 fp32 到 %f1
st.shared.v2.b32 [%r2], {%r3, %r4}; // 将两个 32 位值存储到 smem

谓词执行

@%p1 add.f32 %f1, %f2, %f3; // 如果布尔寄存器 %p1 为 true,则执行
@!%p1 add.f32 %f1, %f2, %f4; // 如果 %p1 为 false,则执行