先放老胡PPT里面GPGPU的图

结合loonggpu驱动源码和部分猜测,对LG200的一些参数做了一些归纳
2K3000内置的GPGPU有一个GPC(Graphics Process Cluster)
这个GPC中有一个GP(图形管线,每周期16个像素),二个SP(Stream Processor)
备注:每周期16个像素,说明图形管线配置了16个光栅化引擎ROPs,ROPs负责将片段(fragment)写入帧缓冲区
gpu工作频率 x 每周期像素填充个数 = 像素填充率
显卡的实际工作能力,还受到纹理映射、着色器性能以及内存带宽的影响
可以把LG200看作是支持硬件多线程,有8个SIMD核,每个核有16个通道的SIMD处理器?!
20260905 添加:龙芯2K3000_3B6000M处理器用户手册_V1.0.pdf手册里面描述的参数
支持 OpenGL 3.3 3D 图形流水线
- 支持 VS/GS/FS 着色器
- 支持兼容模式
集成独立的 2D 贴图流水线
- 支持单色/模板填充
- 支持源/目标区域重叠
- 支持 90/180/270 旋转
- 支持放大贴图
支持 OpenCL 3.0 计算流水线
- 支持 4 个计算核并发
- 支持 1-3 维任务空间
单个流处理器内集成
- 64 个 32 位 ALU,支持单精度浮点运算
- 4 个 64 位 ALU,支持双精度浮点运算(不含除法)
- 16 个特殊函数单元(SFU),支持三角函数、指数、对数、开方、倒数 // 每个VU里面4个SFU,支持复杂着色程序,提供诸如光照、纹理
- 4 个张量单元(TU),共 2048 个 INT8 乘加部件 // 每个张量单元有512个,也就是 8x8x8
- 4 个纹理单元 // 每个VU里面有1个纹理?待确定
- 128KB 共享存储器
- 16KB 纹理/数据缓存
集成 MMU,支持 40 位虚地址空间,支持 8 个图形/计算进程
2K3000 硬件配置
- 两个流处理器
20260704 添加:和loonggpu驱动代码的对应关系
代码中的CU,对应SP(流处理器)
代码中的SIMD,对应图里面的VU,向量单元
acu_info->simd_per_cu = 4; // 每个SP里面有4个VU
acu_info->max_waves_per_simd = 10; // 每个VU里面最多可以有10个线程,实际/最大=占用率
acu_info->wave_front_size = 32; // 每个线程 32 个字节
acu_info->max_scratch_slots_per_cu = 40; // 每个SP最多线程数 40 个
acu_info->lds_size = 128; // 每个SP里面的高速缓存是 128KB
推算:高速缓存可以容纳 4K 个线程数据
acu_info->number 是活跃的SP个数
if (adev->family_type == CHIP_LG100) // LG100 1个SP
acu_info->number = 1;
else if (adev->family_type == CHIP_LG200) // LG200 2K3000/3B6000M 2个SP
acu_info->number = 2;
else if (adev->family_type == CHIP_LG210) // LG210 应该就是9A1000,8个SP
acu_info->number = 8;
else
DRM_ERROR("%s Illegal Family type %d\n", __FUNCTION__, adev->family_type);
每个SP中,包含有4个VU(Vector Unit)和一个纹理单元(TPU,有纹理采样,坐标变换和过滤插值)
备注:每个sp是可调度的独立的计算单元,提供纹理处理功能,可完成像素计算和着色。图形功能和AI计算都使用SP,同时工作存在资源竞争
VU 是向量单元,有寄存器(堆),支持指令调度(乱序发射),支持单精度、双精度和矩阵计算
- 16个单精度ALU(相当于 CUDA核心),可提供16个通路,完成一次SIMD运算
- 1个张量计算单元,16位/8位两个通路,支持矩阵计算
- 1个双精度ALU,支持计算的一些后处理运算
- 通过寄存器堆,支持乱序发射,提供指令调度功能
SP中实现对一批数据并行执行同样的操作,VU是其调度单元,指定多少VU参加并行计算。
- 图形管线中的着色器,每个节点至少分配一个VU,16个alu
- 图形管线工作时,顶点、几何图元、像素着色等组件并行工作,至少需要5个VU
- 每个SP里面有个共享的纹理单元,负责纹理采样(取坐标颜色)和法线贴图
- 所以两个SP的VU都可参与图形渲染,两个纹理单元也参与像素渲染
SP中的计算单元:
- 每个VU中,都包含一个光线追踪RT单元和一个张量单元,共8个
- 光线追踪单元每周期处理8条相干光线,完成BVH遍历和光线-三角形相交计算
- 张量单元是一个 8x8x8 的乘加ALU脉动网格,组成脉动阵列,alu执行乘加操作,共8个,在一个周期内,两个8x8的二维数组,一下子就算完了
- 特征数据横向加载,权重数据纵向注入,在脉动阵列里,进行连续乘加操作
- 结果保存在64个专用的累加寄存器里,经FP16/INT8量化输出
- 可以利用张量单元对RT单元的输出进行“推理”运算,得到高分辨率的光线追踪数据
数据流动:
- 张量计算,int8 和 bf16 走不同的数据通路
- 张量计算和VU里面的16个alu走不同的数据通路,张量计算有自己的“缓存”
- 根据不同的数据类型,选择不同的路径(fp32,fp64走vu里面的计算单元,int8,bf16走张量单元)
- 权重(Weights)- 模型数据 从左侧逐列“注入”阵列,沿列方向自上而下流动,每个时钟周期下移一行 = 二维矩阵的一行;
- 激活值(Activations)-用户数据 从顶部逐行“注入”,沿行方向自左向右流动,每个时钟周期右移一列;
- 乘积累加(MAC) 在每个ALU节点上持续进行:当一组权重和激活值在某节点相遇,即刻完成一次乘法并累加到局部寄存器中。
那么2K3000的资源算下来:
1个GPC,1个GP,2个SP,8个VU,2个纹理,128个单精度ALU,8个双精度ALU,8个张量单元
- 理论上 LG200 8 x ( 8 x 8 x 8 ) x1Ghz = 8TOPS
- 2k3000 800Mhz = 6.4TOPS
- 3b6000m 900Mhz = 7.2TOPS