
8 月 4 日,2026 夏季 InfiniTensor 训练营 OpenCL 编程第三课《OpenCL 算子的实现与优化》开讲。
上一课讲解 OpenCL 四大抽象模型、NDRange 索引、局部内存同步、树状归约等设备端基础语法,为本节课各类算子落地与性能调优打下底层基础。
本节课围绕大模型推理高频算子展开,完整讲解 Argmax、Softmax、GEMV / GEMM 标准实现,同时系统介绍子组、向量化、量化、访存合并等全套性能优化手段。
核心归约算子实现
Argmax 最大值索引算子
1. 算子作用与业务场景
输入一组数值,输出全局最大值对应的索引;常用于分类输出、大模型 Token 采样筛选。
2. 两种实现方案
(1). 单工作组树状归约

(2). 多工作组分阶段归约

- 多工作组并行计算各组局部最大值+索引,写回全局内存;
- Host 端判断局部结果数量,少量则主机完成最终比较,量大则新开 Kernel 二次归约;
- 优势:充分利用多 CU 计算单元,适配超大数组场景。
Softmax 归一化算子
原始公式易指数溢出,统一先减去维度内最大值再计算指数,缩小数值区间。

1. 一维 Softmax 实现
(1). 小规模(单工作组可容纳):
- 工作组内先归约求全局最大值 → 各线程减最大值计算指数 → 归约求指数总和 → 每个元素除以总和输出。
(2). 大规模多段实现:
- 多工作组分段求局部最大值、局部指数和,Host 汇总全局最值与总和后二次 Kernel 完成归一化。
2. 二维 Softmax 两种轴实现
- Axis = 0(按列归一):每列独立执行 Softmax 流程;

- Axis = 1(按行归一):每行分配一个工作组,每行内完成归约与归一,实现更简洁。
基础矩阵乘法 GEMM


基础实现
1.朴素方法:一个线程计算 C 矩阵一个元素。
2.性能痛点:朴素 GEMM 中,每个线程独立计算一个输出元素,会导致输入矩阵元素被大量重复从全局内存加载,数据复用率低;同时矩阵列方向访问可能造成非连续访存,降低带宽利用率。

GEMV 矩阵向量乘性能优化
子组优化(Subgroup)
1.概念:硬件级线程束(NVIDIA Warp / AMD Wavefront / Intel Subgroup),支持寄存器级低延迟通信。
2.优势:使用 sub_group_reduce_add 等内置指令替代 Local Memory + Barrier,显著降低同步开销。

3.合并内存访问(Coalesced Access):设计让相邻线程访问相邻地址,将多次内存事务合并为单次缓存行读取,对各种 GPU 架构均具有重要优化价值,尤其适用于带宽受限 Kernel。

向量化加载与计算
1.技术:使用 vloadN 及向量类型(如 half8, float4)一次性加载/计算多个元素。

2.收益:向量化加载可以减少访存操作调用次数,并提高数据吞吐。
3.注意:必须保证内存地址对齐,否则会退化为多次访问;需关注寄存器压力,避免溢出到全局内存。

单工作项处理多行数据
1.适用场景:大规模数据下硬件资源已饱和时。
2.原理:减少线程调度开销,利用缓存局部性,提高指令级并行度。

3.权衡:行数过多会导致寄存器消耗线性增长,需防止寄存器溢出导致的性能断崖。
Gemv 量化
量化基础
1.动机:量化通过降低权重表示精度减少存储空间和内存带宽压力。

2.GGUF 量化:
传统量化:QX_Y(X=位宽,0=对称,1=非对称)。Q8-0 为 32 元素一组 + 1个缩放因子。
K 系列:层次化量化,对缩放因子再量化,进一步压缩元数据。

- IQ 系列:引入重要性矩阵(Importance Matrix)指导量化。
GEMV Q8-0 量化实现


Gemv 量化实现——应用纹理内存

- 纹理内存(Image Object):端侧 GPU 专用只读缓存,对二维空间局部性访问有硬件级优化,可以作为 Buffer 之外的一种存储方式。
课程课后作业

加入训练营
📺 完整课程内容,请观看直播或查看课程回放:
InfiniTensor 官网: https://www.infinitensor.com
B 站直播: InfiniTensor 官方直播间
视频号直播: InfiniTensor 视频号预约
答疑交流: 训练营官方社群 ⬇️

关注与交流

