1.数据本地化
常量内存与全局内存读取数据相比,从常量内存读取相同的数据可以节约带宽,因为对常量内存的单次读操作可以广播到同一线程块内的其他线程。由于La-place的模板矩阵较小且重用率高,所以完全可以放入常量内存中。
将图像划分为多个块,一个线程块加载一个图像块到共享内存中,再进行滤波处理。线程块中,一个线程将共享内存相应位置处的图像元素与模板矩阵进行9点差分运算,计算得出一个输出像素。由于调入共享内存中的图像矩阵与模板矩阵进行计算时,会出现依赖不存在共享内存的图像像素,所以需要对边界进行处理。
在Laplace算法中,边界元素的计算需要根据不同边界类型加载不同的计算元素,于是产生了条件分支。由于要消除条件分支,需要在共享内存中根据边界类型对矩阵进行填充,消除边界元素。不过,除此之外还可使用?:语句来代替判断语句。当?:语句中没有访存指令时,该语句会编译成一条指令。在本小节中,我们使用第一种方法。
本文是通过将原始像素矩阵的三行像素读入共享内存中,再通过模板矩阵对读入数据进行处理,通过向量化,一个线程处理4个数据。(www.daowen.com)
2.向量化
GPU的每个SM(流多处理器)有32768个寄存器。一个SM可以看作是一个多线程的CPU核,在TK1上只有一个SM。虽然开普勒架构上的SM数量比早期的一些设备要少,但是开普勒架构设备上SM具有更多的SP(流处理器),对于TK1来说其拥有192个cuda core。寄存器是NVIDIA GPU存储器空间中访存性能最高的存储器,但是GPU上寄存器的数量有限,所以向量化时应避免寄存器的过度使用。本节使用向量化长度为4,即每个线程处理四个元素,可大大提高访存带宽利用率。
就大多数程序而言,影响性能的因素主要来自设备获取输入数据和写回输出数据的I/O速度。片外访存带宽是CPU kernel,特别是访存密集型的算法的主要影响因素。通过最大限度地将计算数据从片外转移到片上的寄存器上,实现数据的共享,从而减少对访存带宽的依赖,是缓解这种限制因素的主要方法。
由于Laplace算法是连续访存的,且是数据访存密集型算法,提高访存效率,隐藏访存延迟,对提高程序的性能有很大的帮助,所以本小节用此算法来实现向量化的对程序的性能提升。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。