super1 发表于 2021-12-26 13:28

016.GPU运行架构

GPU运行架构;




GPU、GPC、SM

先进行一些名字的解释;
GPU称作Graphics Processing Unit;
GPU中包含多个GPC;
GPC称作Graphics Processing Cluster;
GPC中有一个(RE光栅化引擎)RasterEngine;
GPC中有多个SM(Stream Multiprocessor);
GPC中有Crossbar负责连接其他GPC;
Shader运行在SM上;
SM包含多个WS(Wrap Scheduler);
WS对应一个DU(DispatchUnit分配单元);
一个WS管理这32个线程,称作Wrap(线程束Wrap);
Wrap指令转移到DU,DU给到core上执行;
SM;

上面说到,SM主要包含Wrap;
SM还包含多个加载和存储单元;
SM还包含多个特别数学运算单元;少于core;负责三角函数、log、幂次等运算;SFU(Special function units)
SM还包含多个寄存器;
SM还包含指令缓存;
SM还包含纹理读取单元和纹理缓存单元;
SM还包含通用缓存单元;
SM还包含一个顶点处理单元,负责曲面细分顶点处理,视口变换,属性设置,输出,重心坐标插值等;
CPU内存系统的简单介绍;

能够保存数据的一般有以下几种:
寄存器,L1缓存,L2L3缓存,主存(例如内存),
从左到右,速度依次变慢,容量依次变大;
说明:
寄存器,物理上靠近CPU;1个CPU时钟;1KB;单核独享使用;
L1缓存,3个CPU时钟;32KB;单核独享使用;
L2缓存,30个CPU时钟;256KB;单核独享使用;
主存,200个CPU时钟;GB为单位的大小;所有核心使用;
现代图形处理器内存系统的简单介绍;

GPU的内存;
寄存器,共享内存,常量内存,纹理内存,全局内存;
寄存器,1个时钟;8TB/s;
共享内存,32个时钟;2TB/s;SM独享;
常量和纹理缓存,32个时钟;2TB/s;SM独享;
全局内存,600个时钟;200MB/s;
常量内存,600个时钟;200MB/s;只读;
纹理内存,600个时钟;200MB/s;只读;

GPU全局内存;
CPU可以访问GPU的全局内存;
CPU通过PCI-E总线(8GB/s);传送数据和指令到GPU全局内存;
GPU内核函数将中间结果存放在共享内存,只将最终结果存放在后全局内存中;

GPU全局内存的内存对齐与访问合并;
由于GPU数据的一致性,能够给予我们更高的吞吐量;
也就是内存合并访问技术;
Wrap中一般是32个线程,这32个线程请求数据不会产生32次请求;而是合并成一次;
一次请求,返回Wrap所需要的全部数据;



线程地址对齐图

这就要求请求的内存数据分成32块,内存大小一致,因为内存的不整齐也需要内存对齐;
注意,这里不是C++的内存对齐;
一般以1,2,4个字节为单位对齐;支持8,16个字节;
struct ___align___(16){}                //强制16字节对齐

共享内存;
SM独享;32个线程同时访问共享内存,其访问的存储体是内存分割的,每个线程独立访问;32个线程可以在一个周期内访问完成;

寄存器;
SM中一般有非常多的寄存器;一个SM寄存器大小总量可以达到32KB;上千个;
他们被分配给线程使用;
每个线程的每个本地变量都会占用一个寄存器;寄存器只有线程结束后,才将最终结果给到全局内存,从而减少数据流通;

开普勒GK110/210;
15个SM;
每个SM(SMX),有192个SP(Stream Processor);
每个SP可以同时执行192个线程;
SIMD;SPMD;SIMT;

SIMD(Single Instruction Multiple Data)单指令多数据技术,可以直接运算float4 + float4;而不需要xyzw依次运算;英伟达称作SPMD(Single Program Multiple Data)单程序多数据;

SIMT(Single Instruction Multiple Threads)单指令多线程技术,可以使SM中的多个core同时处理一个指令,且使用的数据可以不同;

so-issue技术,在SIMD中,合并1维3维或2维和2维指令;提高逻辑运算单元的利用率;
条件分支if/for;

Wrap,线程束,一般有32个线程,获取的是同一个指令,但数据不同;
如果线程执行的指令是分支的话,不论分支得到的数据是真是假,这个线程的结束不取决于分支;而取决于整个Wrap的结束;否则会一直激活占用,空转;
总结来说,SIMT技术,会使core空转;必须等到最长的那个结束;for循环也是,即使有break,也要等到最长的那个结束,才能够执行下一组指令;
GPU调度概述;

概述;
GPU是程序托管的内存模型;数据的存放由程序控制;
CPU是硬件托管的内存模型;寄存器、缓存与内存的数据交换是硬件自动处理的;包括指令附近的数据的加载、更新,都是硬件自动处理;
GPU程序需要由CPU宿主程序,通过GPU内核函数指令及数据,对GPU进行调度,管理;
图形API的drawcall指令会推送到驱动程序;驱动程序通过后,推送到GPU中;
GPU通过指令接口HostInterface接收;
概述2;
内存数据拷贝到显存中;
CPU指令驱动GPU;
GPU使用显存中的数据;
GPU输出结果到显存中,并拷贝到内存;
顶点;
顶点中的三角形会被分为多个批次,同时提交给多个GPC;
GPC中的顶点处理单元负责处理这些顶点;
Wrap完成顶点着色器的任务后,准备光栅化;使用(贡献内存)L1L2缓存,进行通讯;
三角形;
三角形也将被分批,推送到多个GPC中;
GPC中的光栅化引擎处理这些数据;并进行背面剔除,Early-Z;
然后Wrap执行像素着色器(片元着色器),完成颜色、深度等计算;
将结果输出给ROP;
ROP(Render output unit)渲染输出单元;
Overdraw问题;

像素是2*2一组,4个core一组,进行渲染的,不可分割;
本来只需要处理8个像素,但这8个像素分处4组像素组,因此需要处理全部4组16个像素;


垂直同步;

过于复杂;略;
同步CPU和GPU工作帧,否则画面撕裂;
同步的原因在于存储的分级;

fwalker 发表于 2021-12-26 13:30

SM 包含 warp [思考]
页: [1]
查看完整版本: 016.GPU运行架构