2. Intel GPU架构与执行模型
Intel 数据中心 GPU(如 Flex 系列、Max 系列)的算力并不是“一个整体”,而是由大量可独立调度的执行单元(EU,Execution Unit)按层级组织起来的。理解这套层级结构,是判断一段工业负载能否被 GPU 高效执行的前提。本节从最底层的 EU 出发,逐层向上梳理 Subslice、Slice 的组织方式,再说明线程调度与 SIMD 执行模型,最后落到工业负载如何映射到这些硬件资源上。
一、从 EU 到 Slice:算力的层级组织
EU 是 Intel GPU 中最小的通用执行单元,内部包含多个 SIMD 通道、通用寄存器堆、指令发射与分支控制逻辑。一个 EU 可以同时持有多个硬件线程(Hardware Thread),通过线程级并行来掩盖内存访问和指令延迟。EU 之上是 Subslice(子切片),一个 Subslice 通常包含若干个 EU、一组采样器/纹理单元、共享的指令缓存与本地存储。再往上是 Slice(切片),一个 Slice 由多个 Subslice 组成,并配有共享的 L2 缓存分区、光栅/媒体等固定功能单元。多个 Slice 加上显存控制器、显示/媒体引擎等,构成完整的 GPU。
这种层级的意义在于:同一 Subslice 内的 EU 共享本地资源,跨 Subslice 的通信需要经过更高层缓存。因此,一个工作组(Work-group)如果被调度到同一 Subslice,其内部数据交换和同步成本明显低于跨 Subslice 的情况。工业负载中常见的局部滤波、卷积、点云邻域计算,都应尽量让协作线程落在同一 Subslice 内。
二、线程调度:从 Work-item 到硬件线程
在编程模型侧,我们写的是 Kernel,由大量 Work-item 组成,Work-item 按 Work-group 分组。在硬件侧,调度器把 Work-group 分配到某个 Subslice 上执行,Work-group 内的 Work-item 被组织成若干 SIMD 通道同时执行。一个 EU 可以驻留多个硬件线程,当某个线程因等待显存或长延迟指令而停顿时,调度器切换到另一个就绪线程,从而保持 EU 的流水线利用率。
这里有两个关键参数需要关注:占用率(Occupancy)和寄存器压力。每个 EU 的寄存器堆容量固定,若单个线程使用的寄存器过多,能同时驻留的硬件线程数就会下降,延迟掩盖能力随之减弱。工业负载中常见的做法是:先按经验给出一个工作组大小(如 64、128、256),再通过 Intel VTune Profiler 或 NEO 的性能计数器观察 EU 活跃度、线程驻留数和内存等待占比,据此调整。
三、SIMD 执行模型与分支发散
Intel GPU 的 EU 以 SIMD 方式执行:一条指令同时作用于多个数据通道。若同一 SIMD 通道内的 Work-item 走了不同的分支路径,硬件只能串行执行各分支,这就是分支发散。发散越严重,有效吞吐越低。工业视觉中的逐像素阈值判断、点云中的条件筛选,都是容易发散的场景。
降低发散的基本手段是让同一 SIMD 通道内的数据具有相同控制流。例如把“按类别分支”改为“查表 + 统一计算”,或把数据按类别预排序后再分批处理。另一个手段是使用 SIMD 友好的数据类型,如 uchar4、half8,让一次加载/计算覆盖更多元素。
四、工业负载到硬件资源的映射策略
把工业负载映射到上述结构时,可以按以下思路判断:
- 数据并行度高、控制流一致(如卷积、矩阵乘、图像滤波):优先增大工作组,让多个 Subslice 同时工作,重点优化内存访问合并与 SIMD 宽度利用。
- 局部协作强(如邻域统计、直方图局部聚合):把协作线程放在同一 Work-group,利用 Subslice 内共享的本地存储,减少跨 Slice 通信。
- 分支复杂、数据相关性强(如条件筛选、稀疏处理):先做数据重排或分类,降低发散;必要时改用更小的 SIMD 宽度或标量路径。
- 延迟敏感、访存密集:提高占用率,让更多硬件线程驻留以掩盖延迟,同时用
svm或共享本地内存减少全局访存。
五、一个可参考的调优检查表
| 检查项 | 观察指标 | 调整方向 |
|---|---|---|
| 工作组大小 | EU 活跃度、线程驻留数 | 64/128/256 逐档测试,取占用率与发散折中 |
| 寄存器使用 | 每线程寄存器数、占用率 | 减少临时变量,必要时限制寄存器上限 |
| 分支发散 | SIMD 分支计数、有效通道率 | 数据重排、查表替代分支 |
| 内存访问 | L2 命中率、全局访存等待 | 合并访问、使用本地内存暂存 |
| 跨 Slice 通信 | L2 流量、同步开销 | 把协作线程收敛到同一 Subslice |
需要强调的是,上述参数和阈值属于工程经验范围,具体数值随 GPU 型号、驱动版本和 Kernel 特征变化。实际调优应以目标硬件上的性能计数器为准,而不是套用固定值。理解 EU、Subslice、Slice 的层级关系与 SIMD 执行特性,才能在面对新的工业负载时,快速判断瓶颈出在并行度、访存还是控制流,并给出有针对性的优化方向。