0%

《全局光照》读书笔记(五)

第二章GPU并行架构部分

GPU产生原因

CPU在大规模并行运算的限制来源于针对串行运算的优化的缓存系统。高速缓存的高成本和操作数从主存到ALU之间的传输的高能耗,导致缓存处理器系统很难扩展到大规模并行计算。

所以,GPU为了满足大规模并行运算使用了新的思路来代替缓存系统。

GPU内存结构

GPU使用的是程序托管的内存模型,即数据的存放地点由程序员决定。上图为一个GPU的内存结构,其中流处理器族(stream multiprocessor,SM)相当于一个CPU核,每个SM内部有多个流处理器(stream processor,SP),每个SP相当于用于执行并行计算中的一个独立的线程。

全局内存

GPU是计算机系统的附属设备,需要借助CPU才能发挥作用。通常一个GPU的应用程序包含一个CPU宿主程序以及一些GPU内核函数。当程序运行时,宿主程序将这些GPU内核函数指令以及相关的数据分发到GPU设备上,然后从GPU内存中取回计算结果。

GPU中的内存称为全局内存,CPU和GPU都能对它进行写操作。宿主程序想要在GPU上执行计算时,CPU首先将指令和数据通过PCI-E总线传输到GPU的全局内存上,接着GPU中各个内核线程从全局内存中读取数据并执行计算,然后把结果写回全局内存,最后宿主程序再从全局内存中取回数据到CPU。

常量/纹理内存

常量/纹理内存只是全局内存的一种虚拟地址形式,但常量/纹理内存有高速缓存并且都是只读内存。如上图所示,常量内存可以缓存到常量内存缓存存储器上,纹理内存可以缓存到纹理内存缓存存储器上,这些缓存都是L1级缓存。由于缓存都会有缓存丢失问题,对于那些数据不集中或数据利用率不高的内存访问就尽量不要使用常量内存。此外,对于纹理内存,它提供硬件上的线性插值功能使得渲染管线中贴图可以高速处理。

共享缓存

共享缓存为了提供更大的带宽,采用了基于存储器切换的架构(bank-switched architecture),它将共享缓存内部平均分成多个相同尺寸的模块称为存储体(bank),这些存储体可以被同时使用。任何对共享缓存的读或者是写操作可以均分到n个不同的存储体地址,每个存储体地址都可以被同时访问,使其可以提供相对于单个存储模块的n倍带宽。

此外,多个线程同时访问同一个存储体时会导致存储体冲突,而且这个冲突并不会引发延迟隐藏机制。

寄存器

GPU的每个SM通常拥有上千个寄存器,这些寄存器平均分配到每个SP上,根据线程数量,每个线程可以使用几个到几十个寄存器。使用数量庞大的寄存器的原因其一是延迟隐藏机制,其二是GPU寄存器特征。GPU寄存器会将写入的数据一直保存直至线程完毕退出或是新的数据写入。