术语表#

以下术语按 cuda-oxide 项目和本书中的用法定义。


ABI 标量化(ABI Scalarization)#

将复合类型分解为宿主端和设备端一致认可的形状的过程。切片在所有调用边界处展平: &[T] 变为 (ptr, len) 对,在函数内部通过 insertvalue/extractvalue 重新构造。 结构体和按值传递的闭包在内部 device-to-device 调用中以同样方式展平,但在 内核边界处,它们作为单个 byval .param 传递(一个宿主数据包槽位) ——这与宿主 launcher 推送的内容匹配,避免了展平的设备声明与单槽宿主数据包之间的不匹配。

块(Block / Thread Block)#

一组在同一 Streaming Multiprocessor 上执行并共享对共享内存访问的线程。 块内线程可通过 sync_threads() 同步。由 blockIdx 标识,由 blockDim 指定大小。

集群(Cluster / Thread Block Cluster)#

Hopper+(sm_90)特性:一组最多 16 个线程块,保证在同一 GPC 上协同调度。 集群中的块可通过分布式共享内存(DSMEM)访问彼此的共享内存, 并通过 cluster_sync() 同步。通过 #[cluster_launch] 配置。

代码生成后端(Codegen Backend)#

rustc_codegen_cuda crate——作为 dylib 加载的自定义 rustc 后端。它在编译期间 拦截 MIR,通过 dialect-mirmem2regdialect-llvm → LLVM IR → PTX 进行降层,并将 PTX 与常规宿主二进制文件一起输出。

cuda-async#

异步执行层。提供 DeviceOperation(惰性 GPU 工作描述)、DeviceFuture (绑定到流的执行)和 DeviceBox<T>(设备端拥有的内存)。通过 zip!and_thenvalue() 组合工作。

cuda-device#

#![no_std] 设备端 crate,提供所有 GPU 内建函数和类型:线程标识、共享内存、 warp 原语、屏障、TMA、张量核心、原子操作和调试设施。

cuda-core#

围绕 CUDA Driver API 的安全 RAII 封装器:CudaContextCudaStreamDeviceBuffer<T> 和模块加载。在宿主端处理 GPU 上下文和内存管理。

DeviceOperation#

惰性、可组合的 GPU 工作描述(分配、内核 launch 或数据传输)。 在调用 .sync().await 之前不会执行。可通过 zip!(并行)和 and_then(顺序)组合。

DisjointSlice<T, IndexSpace>#

用于内核的安全可变输出抽象。仅接受 IndexSpace 与其自身类型参数匹配的 ThreadIndex,提供带边界检查的 Option<&mut T> 返回值。通过构造防止数据竞争 ——每个线程只能写入自己的元素。get_mut_indexed() 快捷方法在一次调用中 生成 witness 并将其解析为可变引用。

分布式共享内存(DSMEM / Distributed Shared Memory)#

Hopper+ 特性,允许集群内的块直接读写彼此的共享内存,无需经过全局内存。 通过 cluster::map_shared_rank() 将本地共享指针转换为远程地址来访问。

网格(Grid)#

内核 launch 中线程的顶层组织。网格是一个 3 维线程块数组,由 gridDim 指定大小。 总线程数为 gridDim × blockDim

HMM(异构内存管理 / Heterogeneous Memory Management)#

Linux 内核(6.1.24+)特性,允许 GPU 通过页错误直接访问宿主内存,无需显式的 cudaMemcpy。cuda-oxide 利用 HMM 实现闭包中的引用捕获 ——GPU 透明地读取宿主地址。也称为统一内存管理(UMM)。

Lane#

warp 内的单个线程。Lane 编号为 0–31,由 warp::lane_id() 标识。 Warp shuffle 和 vote 操作在 lane 之间通信,无需共享内存或屏障。

ManagedBarrier<State, Kind, ID>#

Hopper+ 上用于异步操作的类型状态屏障。在编译期跟踪其生命周期 (Uninit Ready Invalidated)和用途(TmaBarrierMmaBarrierGeneralBarrier)。无效的状态转换是编译错误。

单态化(Monomorphization)#

Rust 编译器为每个使用的具体类型生成泛型函数特化副本的过程。cuda-oxide 完全支持设备端的单态化——scale::<f32>scale::<f64> 各生成独立的 PTX 函数。

Pliron#

用 Rust 编写的 IR 框架,受 MLIR 启发,用作 cuda-oxide 编译管线中的中间表示。 MIR 被导入到 Pliron IR 中,通过方言 pass 进行转换,并导出为 LLVM IR。

PTX(并行线程执行 / Parallel Thread Execution)#

NVIDIA 的 GPU 内核底层虚拟 ISA。cuda-oxide 编译器生成 PTX 作为主要输出, CUDA 驱动在加载时将其 JIT 编译为原生 GPU 机器码(SASS)。

SharedArray<T, N, ALIGN>#

编译期固定大小、块级作用域的共享内存数组。在内核函数中声明为 static mut。 可选对齐参数(TMA 目标使用 ALIGN=128)。访问需要 unsafe,因为共享内存是 !Sync

SM(流式多处理器 / Streaming Multiprocessor)#

NVIDIA GPU 上的主要处理单元。每个 SM 拥有自己的寄存器、共享内存、warp 调度器和执行管线(包括张量核心)。线程块由硬件调度器调度到 SM 上。

sync_threads()#

块级屏障:线程块中的所有线程必须到达此处后,任何线程才能继续执行。 等价于 CUDA C++ 中的 __syncthreads()。降层为 llvm.nvvm.barrier0()

张量核心(Tensor Cores)#

专用的矩阵乘加硬件单元。WGMMA(Hopper, sm_90)以 warpgroup 粒度从共享内存 操作。tcgen05(Blackwell, sm_100+)使用单线程发起和专用张量内存(TMEM)。

ThreadIndex<'kernel, IndexSpace>#

不透明 witness,只能由受信任的索引函数构造。三种形式:

  • thread::index_1d() -> ThreadIndex<'_, Index1D>。始终返回 witness; 每个线程无条件唯一(threadIdx.x < blockDim.x 由硬件保证)。

  • thread::index_2d::<S>() -> Option<ThreadIndex<'_, Index2D<S>>>。 行步长是 const 泛型,因此 DisjointSlice<T, Index2D<S>> 只接受具有匹配 S 的 witness——混合步长是类型错误。

  • unsafe thread::index_2d_runtime(s) -> Option<ThreadIndex<'_, Runtime2DIndex>>。 当步长仅在 launch 时可知时的紧急出口。unsafe 是契约:每个将 Runtime2DIndex 送入同一个 DisjointSlice 的线程必须使用相同的 s

Witness 是 !Send + !Sync + !Copy + !Clone'kernel 作用域限定, 因此线程无法通过共享内存传递它,也不能在内核体之后继续存活。

TMA(张量内存加速器 / Tensor Memory Accelerator)#

Hopper+ 硬件单元,用于全局内存和共享内存之间的异步批量拷贝。通过 TmaDescriptor(在宿主端构建的 128 字节不透明描述符)和 cp_async_bulk_tensor_* 内建函数操作。完成情况由 ManagedBarrier 跟踪。

TmemGuard<State, N_COLS>#

Blackwell 张量内存(TMEM)的类型状态封装器——用于 tcgen05 MMA 操作的专用累加器 存储。管理 TMEM 生命周期:TmemUninit TmemReady TmemDeallocated。 无效转换是编译错误。

Warp#

一组 32 个线程,在 SM 上以锁步方式执行指令。Warp 是最小调度单元。 Warp 级别操作(shuffle、vote)在约 1 个周期内在 lane 之间交换数据, 无需共享内存或同步屏障。

Warpgroup#

四个连续的 warp(128 线程),在 Hopper 上为 WGMMA 操作协同运行。 Warpgroup 是 warpgroup 级别矩阵乘加的发起单元。

WGMMA(Warpgroup 矩阵乘加 / Warpgroup Matrix Multiply-Accumulate)#

Hopper(sm_90)的张量核心指令集。四个 warp 协同从共享内存操作数向寄存器 累加器发起 MMA。通过 ManagedBarrier 进行异步执行和 commit/wait。