中EN
概念页

GPU 计算调度与占用率

GPU Compute Scheduling & Occupancy

GPU 用大量统一的 ALU 以 SIMD/SIMT 方式锁步执行着色程序,ALU 与寄存器文件、L1、本地数据存储、纹理单元等组成多处理器 (MP),由硬件 warp 调度器零开销地切换 warp 以隐藏纹理和内存访问的长延迟。能同时驻留的 warp 数受寄存器等资源限制,用占用率衡量;占用率低会妨碍延迟隐藏,但过高也可能抖动缓存。本页还讨论像素按 quad 调度和 GPU→CPU 回读延迟。

统一 ALU 与多处理器(23.2 节)

  • 一个 ALU(也叫 SIMD lane)为一个实体(顶点或片元)执行程序,主要包含浮点单元(遵循 IEEE 754,最复杂的指令之一是融合乘加 FMA)和整数单元,以及移动/比较、加载/存储、分支和超越函数(某些架构把超越函数等不常用操作放到少量共享的特殊单元 SU 中服务更多 ALU)。
  • ALU 采用少量流水级(如 4~10 级):n 级流水理想上吞吐提高 n 倍(流水并行),每级硬件更少也允许更高时钟频率。
  • 与 CPU 核心不同,没有分支预测、寄存器重命名、深流水等,芯片面积主要用于复制 ALU 和加大寄存器文件以便切换 warp。例如 GTX 1080 Ti 有 3584 个 ALU。
  • ALU 按如 32 个一组锁步执行构成 SIMD 引擎,加上调度器、L1、本地数据存储 (LDS)、纹理单元 (TX)、SU 组成多处理器(NVIDIA 称流式多处理器,Intel 称执行单元,AMD 称计算单元)。NVIDIA 称 warp,AMD 称 wave/wavefront。
  • 利用的并行性:线程级(顶点、片元相互独立)、数据级(一条指令作用于所有 lane)、指令级(独立指令同时执行)。

warp 调度

warp 调度器接收大块工作,分成 warp 分配给 MP、为线程分配寄存器并排定优先级。通常下游工作优先于上游(像素着色优先于顶点着色),因为管线末端的阶段不太会阻塞前面的阶段,可避免停顿。MP 可驻留成百上千个线程;当前 warp 执行预期长延迟的纹理加载时,专用硬件调度器可零开销换入另一个就绪 warp。

像素按 quad 调度:warp 宽 32 时一次调度 8 个 quad。设计取舍:整个 warp 锁定于一个三角形(实现简单,但小三角形效率低),或允许每个 quad 来自不同三角形(更复杂,但小三角形更高效)。更高一级还有全局调度器把工作分给各 warp 调度器。

延迟与占用率(23.3 节)

纹理单元返回过滤颜色可能要数百甚至上千个时钟周期,不隐藏就会让内存访问主导执行时间。定义

o=wactivewmaxo=\frac{w_{active}}{w_{max}}

wmaxw_{max} 是 MP 允许的最大 warp 数,wactivew_{active} 是当前活跃 warp 数,受寄存器、纹理采样器、L1、插值量等影响。例:wmax=32w_{max}=32,寄存器 256 kB,SIMD 宽 32,若只受寄存器限制:

每线程寄存器数(32 位)wactivew_{active}占用率
27256⋅102427⋅4⋅32≈75.85\frac{256\cdot1024}{27\cdot4\cdot32}\approx75.85(超过 32)1,理想
150256⋅1024150⋅4⋅32≈13.65\frac{256\cdot1024}{150\cdot4\cdot32}\approx13.65≈0.43\approx0.43,可能妨碍延迟隐藏

取舍:

  • 一般原则是追求高占用率;低占用率时着色器请求纹理时更可能没有别的 warp 可切换。
  • 占用率过高而着色器内存访问很多时可能抖动缓存。
  • 另一种隐藏方式是发出内存请求后继续执行同一 warp 中不依赖结果的指令;循环展开能产生更长的独立指令链(提高指令级并行),但用更多临时寄存器——有时低占用率反而更高效。
  • 架构设计要平衡最大 warp 数、寄存器数和其他共享资源。

CPU-GPU 回读延迟

把 GPU 与 CPU 看作异步工作的两台计算机,通信需要代价;改变信息流方向会严重伤害性能:从 GPU 读回数据前可能要冲刷管线,CPU 只能等待。Intel GEN 这类 CPU 与 GPU 同片、共享内存模型的架构中,低级缓存共享(高级缓存不共享),这种延迟大大降低,例如光线可在 GPU 与 CPU 核心之间零成本往返以加速光线追踪。不会造成 CPU 停顿的回读机制例子是遮挡查询:发出查询后偶尔检查结果是否可用,期间 CPU 和 GPU 都继续做别的工作。

flowchart LR
  A["warp A 发出纹理请求"] --> B["调度器零开销换入就绪 warp B"]
  B --> C["warp B 执行 ALU 指令"]
  C --> D["纹理数据返回, warp A 再次就绪"]
  D --> E["按优先级: warp 类型, 指令类型, 公平性 选择下一个"]

如上图,足够多的活跃 warp 是隐藏延迟的前提。

  1. realtime_rendering_4ed.pdf 第 23 章 Graphics Hardware

相关页面

图形学GPU 并行架构GPU Parallel ArchitectureGPU 为吞吐量而设计:芯片大部分面积是成千上万个着色器核心,而不是缓存和控制逻辑。它靠在大量线程组 (warp/wavefront) 之间快速切换来隐藏访存延迟,用 SIMD 让一组线程锁步执行同一条指令。理解占用率和线程分歧,是写出高效着色器的关键。图形学硬件光栅化与透视校正插值Hardware Rasterization & Perspective-Correct InterpolationGPU 光栅化由三角形设置与三角形遍历组成。硬件用每条边一个边函数判断采样点是否在三角形内,利用其增量性质按瓦片分层遍历,用左上规则决定恰好落在边上的像素归属,用保护带避免大多数裁剪。边函数的值恰好是子三角形面积的两倍,因此遍历顺带得到重心坐标;透视投影下需要线性插值 a/w 与 1/w 再逐像素相除,得到透视校正插值。本页还介绍 2×2 quad 与辅助像素、保守光栅化。图形学GPU 架构案例GPU Architecture Case StudiesRTR4 第 23.10 节剖析三种架构:面向移动设备、以能效为先的 sort-middle 分块架构 ARM Mali G71 Bifrost;NVIDIA Pascal(GTX 1080)的 SM/TPC/GPC 层级与介于 sort-middle 和 sort-last fragment 之间的 tiled caching;AMD GCN Vega 的计算单元、异步计算引擎、DSBR 与 HBCC。硬件厂商通过对尚未制造的 GPU 做大量参数化仿真来决定 MP 数量、缓存、光栅引擎、ROP 数等——各种单元数量的原因归根结底是"这样效果最好"。图形学遮挡剔除Occlusion Culling遮挡剔除尽早剔除被其他物体挡住的物体,避免它们在 z-buffer 中被光栅化、深度比较甚至着色。本页覆盖遮挡剔除的分类与通用框架、GPU 遮挡查询、层次 Z 缓冲 (HZB) 及其在现代引擎中的简化变体(含两遍法、软件光栅化遮挡),以及在 CPU/GPU 上按物体—簇—三角形多粒度组合剔除并用间接绘制提交的剔除系统。图形学像素与帧缓冲优化Pixel & Framebuffer Optimization需要着色的像素通常远多于顶点,所以像素处理优化往往最划算。核心手段:保证占用率以隐藏纹理延迟、按距离切换着色器 LOD、利用 early-z 并通过从前往后排序或 z-prepass 减少过度绘制、缩小帧缓冲每像素存储(色度子采样、YCoCg 棋盘),以及只在需要时开启混合、避免 GPU 回读。几何与光栅化阶段的常用优化也一并列出。图形学计算着色器Compute Shader计算着色器是 DirectX 11 引入的一种 GPU 计算方式:它不固定在图形管线的某个位置,但由图形 API 调用,和其他着色器共用统一着色器核心。它暴露了线程组和组内共享内存,最大的优势是能直接处理 GPU 上生成的数据,不用来回传给 CPU。综合帧时间预算与渲染性能Frame Budget & Rendering Performance本页把 wiki 中分散在 RTR4 第 18~23 章的性能知识串成一条线:一帧的时间预算由最慢的管线阶段决定,先用毫秒帧时间度量并定位瓶颈,再按瓶颈所在位置——CPU/驱动、几何、像素、带宽/内存——选用对应手段;最后从 GPU 硬件机制(占用率、HiZ/early-z、压缩、分块架构)理解这些手段为何有效。各结论的细节与出处见所链接的概念页。游戏开发 · UE5UE5 性能分析UE5 ProfilingUE5 性能分析的基本流程是:先用 stat unit 判断瓶颈在游戏线程、渲染线程还是 GPU,再用对应的 stat 组、profilegpu/GPU 统计或 Unreal Insights 的 Timing/Memory 等视图向下钻取;渲染特性(RDG、VSM、TSR)各自提供作用域和可视化。测量时要避开会扭曲数据的设置(调试构建、异步计算、可视化模式)。图形学GPGPU 编程入门Introduction to GPGPU ProgrammingGEA 把 GPGPU 讲成「SIMD 向量化推到极致」:GPU 结合 SIMD(向量化 ALU)与 MIMD(一种抢占式多线程),即 NVIDIA 所说的 SIMT。适合 GPU 的任务必须是数据并行的——每个元素的计算不依赖其他元素的结果。写法与 CPU 向量化相反:不把循环硬编码成每次 4/8/16 个,而是保留单通道的循环体,抽成计算核函数 (compute kernel),由 GPU 替我们「跑循环」。一个「GPU 线程」其实就是一条 SIMD 通道。游戏开发 · UE5Niagara 粒子系统Niagara VFX SystemNiagara 是 UE5 的 VFX 系统,由系统 (System) → 发射器 (Emitter) → 模块 (Module) 的栈式结构组成:发射器按 Emitter Spawn/Update、Particle Spawn/Update、Event、Render 分组,模块是自上而下执行、基于 HLSL 的「读-算-写」单元。继承、动态输入、事件和数据接口 (Data Interface) 提供复用与外部数据访问;发射器可选 CPU 或 GPU 计算着色器模拟。官方 5.8 文档未找到 CPU/GPU 对比页,相关取舍按通识标注。图形学波前路径追踪Wavefront Path Tracing波前 (wavefront) 架构把路径追踪拆成一串独立的 GPU 内核(生成相机光线、采样、求交、介质采样、逃逸光线、命中发光体、按材质分开的着色、阴影光线、写胶片),内核之间用工作队列传递数据;每个内核开始时线程都在做同一件事,执行是收敛的。代价是每个内核都要从显存读入、再写回全部状态,因此更受带宽限制。pbrt 4e 的 GPU 渲染路径 WavefrontPathIntegrator 就是这种结构,算法与 CPU 上的 VolPathIntegrator 完全相同(见 参与介质与体积散射),只改变计算的组织方式和数据布局。注意术语:这里的"波前"指整批光线按深度推进的处理方式,与 AM

输入关键词开始搜索

滚轮或双指缩放 · 拖动平移 · 双击放大 / 还原