论文部分内容阅读
CUDA编程模型的引入大大地推动了GPGPU在通用计算领域的发展,异构CPU和GPU协同工作,在程序运行过程中,两者存在着大量的数据交互。为了提高双方的数据交换的效率,早期的研究者们提出在CPU和GPU之间设立共享最后一级cache,LLC。实验中我们发现,很多GPGPU程序的访存模式呈流式模式,对于此类程序,LLC的性能会很差。我们测试了Rodinia和CUDA sdk中的部分程序,发现除了数据集较小的个别程序,其他的LLC miss率均达到30%以上,个别甚至超过99%。另外我们利用功能模拟调节程序中的LLC miss率后发现,随着LLC的hit率的提升,整个系统的IPC具有较大程度的提高。 预取手段和其他缓存优化手段相比可以较大程度地提升LLC的hit率,其效果主要由预取的准确度决定。GPGPU中同一kernel下的所有线程均共享同一套指令,线程中的访存地址仅由kernel中的访存基址和线程号决定,因此GPU上的对访存地址的预测仅需预测将要被调度到的线程的线程号,这比在CMP上的预取要精确得多。现有对GPGPU的预取主要集中于线程内部的预取以及跨越线程的预取,但GPGPU在运行过程中所有的线程是以warp为单位进行组织和调度的,单以线程为单位进行预取的准确度和效率均不高。 本文提出一种能够适应warp调度特征的预取策略,WAP(Warp AwarePrefetching),以warp为单位进行预取可以在运行时使得预取的地址和程序中warp的地址簇相适应,符合GPGPU程序的访存规律,有效的降低当前的访存处理延迟。本文将预取功能模块分为两大块,其一是在流多处理器,SM端的监测以及预取发起模块;其二是全局的预取仲裁合并模块。 在SM端,首先我们设计了一种线程预处理器,获得kernel程序中的访存点的位置以及访存点间的时间间隔。其次为了能够更好地量化和监测程序运行时warp的状态,我们提出使用当前活动warp比率,CAWR(Current Active Warp Ratio)作为评判访存是否拥挤的标志,并设立阈值确定决定当前的能否发起预取,当访存空闲时发出预取请求,并根据当前的访存处理延时以及预取处理延迟确定预取的目标访存点。最后为了能更好地适应程序的执行环境,我们提出了一种自适应的方式有效地确定当前的预取阈值。 已有对GPGPU预取的工作中发现GPGPU中由于线程数量较为庞大,预取请求极易容易造成访存端口的堵塞。为了避免这种情况,保证预取请求不影响程序的原本访存性能,本文提出在全局设立预取器。全局预取器根据当前访存的繁忙程度控制向访存控制器发出请求的带宽,并使用一种较为公平的预取调度算法,按照尽可能公平的方式调度已有的预取请求。另外对于来自不同SM但相同地址块引用的数据,预取器还具备预取请求归并机制,减少发起预取请求的数量。 为了验证本文的预取策略,本文实现了WAP预取策略,并与当前已有基于多线程的预取方法MAP进行对比。数据表明本文提出的WAP的LLC命中率与MAP相比具有11.8%的性能提升,WAP的IPC与MAP相比具有11.39%的性能提升。而额外引入的硬件模块实现功能具有较为简单的逻辑性,其造成的额外代价均在可接受范围之内。实验证明本文提出的WAP预取策略能够更好地适应GPGPU的程序执行特征,可带来较好的LLC性能提升和系统IPC性能提升。