理论教育 数据本地化:访存密集型GPU程序的首要方法

数据本地化:访存密集型GPU程序的首要方法

时间:2023-06-23 理论教育 版权反馈
【摘要】:数据本地化的实质是软件工程师们要充分尊重和理解底层硬件的限制,并且用各种手段规避问题,最大化利用手里的硬件资源。GPU一共提供了三种机制来实现数据本地化。在GPU程序优化过程中,特别是针对访存密集型kernel,如果始终不能达到理想的性能,则通过数据本地化提高计算密度是首要的优化方法。

数据本地化:访存密集型GPU程序的首要方法

数据本地化的实质是软件工程师们要充分尊重和理解底层硬件的限制,并且用各种手段规避问题,最大化利用手里的硬件资源。GPU提供了本地内存、cache等片上资源,具有较高的访存带宽和较低的访存延迟。充分利用这些片上资源实现数据的共享和重用,减少对片外资源的访存次数,是提高GPU程序性能的主要方法。

片外访存带宽是GPU kernel,特别是访存密集型kernel性能的主要限制因素。最大限度地将计算数据从片外转移到片上,并实现数据的共享,减少对访存带宽的依赖,是缓解这个限制因素的主要方法。GPU一共提供了三种机制来实现数据本地化。

1.本地内存(CUDA称为共享内存机制

本地内存是程序员可控的一块片上存储资源,具有比全局内存更高的访存带宽和更低的访存延迟。此外,本地内存还提供了位于同一work-group内的work-i-tem通信和数据共享功能以及对高性能原子操作的支持。当GPU kernel中存在数据重用或work-group内的work-item间需要通信时,使用本地内存有明显的优势,可有效减小对片外访存带宽的依赖,提升kernel的性能。

2.寄存器机制

本地内存虽然可很好地实现数据本地化,然而,仅仅依靠本地内存,并不能满足计算单元所需要的数据量。如AMD HD5850GPU每个SC(Streaming Core)每个时钟周期可产生两个4B的本地内存请求,而SC在每个时钟周期内最多可并行执行5条指令,大约需要10~15个操作数。两次本地内存请求并不能为计算指令提供足够的计算数据。所以,充分利用寄存器也是实现数据本地化的重要方法。(www.daowen.com)

寄存器拥有比本地内存更高的访存带宽和更低的访存延迟。然而,寄存器只对某一线程可见,并不能实现线程间的相互通信。而且,寄存器是一种有限资源,如AMD HD5850 GPU为每个CU提供了256K的寄存器,NVIDIA Tesla C2050提供了32K的寄存器。过度使用寄存器会减少同时并发执行的线程数量,造成GPU程序性能的降低。因此,在寄存器的使用上,一方面我们要充分利用寄存器实现数据本地化,另一方面不要因为过度使用寄存器而造成程序性能的降低。

3.cache机制

GPU提供了简单的cache机制,可实现对只读数据的cache功能,以降低访存延迟。然而,cache的使用并不能由应用程序开发人员控制。其主要使用方式为在GPU kernel代码中显示表明内存数据的只读特性,便于编译器的编译优化

从优化角度讲,数据本地化可提高算法的计算密度。同访存带宽和计算峰值限制GPU程序性能的原理一样,计算密度会像一堵墙一样限制GPU程序性能的提升,我们称这座墙为计算密度墙。在GPU程序优化过程中,特别是针对访存密集型kernel,如果始终不能达到理想的性能,则通过数据本地化提高计算密度是首要的优化方法。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈