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 内。

Intel GPU 执行层级与工业负载映射 GPU(多 Slice) Slice 0 共享 L2 分区 / 固定功能单元 Subslice 0.0 共享指令缓存 / 采样器 / 本地存储 EU SIMD8/16 EU SIMD8/16 EU SIMD8/16 EU SIMD8/16 Subslice 0.1 共享指令缓存 / 采样器 / 本地存储 EU SIMD8/16 EU SIMD8/16 EU SIMD8/16 EU SIMD8/16 Slice 1 共享 L2 分区 / 固定功能单元 Subslice 1.0 共享指令缓存 / 采样器 / 本地存储 EU SIMD8/16 EU SIMD8/16 EU SIMD8/16 EU SIMD8/16 Subslice 1.1 共享指令缓存 / 采样器 / 本地存储 EU SIMD8/16 EU SIMD8/16 EU SIMD8/16 EU SIMD8/16 工业负载映射:工作组 → Subslice(局部协作) | 多工作组 → 多 Slice(吞吐扩展) | 跨 Slice 通信经 L2

二、线程调度:从 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 活跃度是否接近饱和、内存等待占比是否过高、分支发散计数是否异常。三者中任一明显偏离,都说明当前工作组大小或数据布局需要调整。

五、一个可参考的调优检查表

检查项观察指标调整方向
工作组大小EU 活跃度、线程驻留数64/128/256 逐档测试,取占用率与发散折中
寄存器使用每线程寄存器数、占用率减少临时变量,必要时限制寄存器上限
分支发散SIMD 分支计数、有效通道率数据重排、查表替代分支
内存访问L2 命中率、全局访存等待合并访问、使用本地内存暂存
跨 Slice 通信L2 流量、同步开销把协作线程收敛到同一 Subslice

需要强调的是,上述参数和阈值属于工程经验范围,具体数值随 GPU 型号、驱动版本和 Kernel 特征变化。实际调优应以目标硬件上的性能计数器为准,而不是套用固定值。理解 EU、Subslice、Slice 的层级关系与 SIMD 执行特性,才能在面对新的工业负载时,快速判断瓶颈出在并行度、访存还是控制流,并给出有针对性的优化方向。