论文部分内容阅读
随着CPU和GPGPU在各种环境下得到应用,人们逐渐发现这两个处理器各自的独特优势。为了实现优势互补并支持更广泛的场景,由CPU和GPGPU组成的异构多处理器系统受到关注。其中CPU和GPGPU共享最后一级缓存(LLC)的片上紧耦合系统能实现更细粒度的交互。然而简单地将CPU和GPGPU连接到共享LLC时两种处理器在访存行为上的差异性导致数据共享效率受限,并不能充分发挥异构多处理器系统的计算能力。本文首先分析了 CPU和GPGPU使用共享LLC进行数据交换时的访存特征。发现简单的缓存替换策略并不能提供最高的数据交换效率,会产生缓存抖动问题,中间暂存数据被写入内存也会引入不必要的内存事务并浪费了内存带宽。此外传统的交互模式往往造成一方处理器空闲等待对方提供数据,无法有效地实现数据生成和计算的重叠。为了解决这些问题,本文提出使用固定大小的元素作为数据交换单位,并在LLC中实现硬件管理的共享数据队列以支持基于元素的数据共享。进一步提出元素-原子的数据组织方式以移除元素大小限制,配合访问协议支持GPGPU大规模乱序访问。同时还使用后备存储避免死锁同时保持访问低延迟,并在共享数据队列中实现了低代价的全局同步。在使用传统LLC进行数据交换时,本文发现CPU和GPGPU的算法常常偏好不同的最优数据存储布局以满足各自不同的局部性,导致数据存储布局冲突。已有的转换方法会污染转换处理器的缓存、引入额外的转换代码执行或管理代价。本文通过在共享LLC中加入访存地址重映射实现体系结构辅助的自动转换。于是运行在不同处理器上的算法始终可以它们各自的最优数据存储布局访问共享数据,并充分利用各的自私有缓存。由于处理器不再直接进行布局转换,CPU或GPGPU代码中也不再需要加入额外的管理代码。其次,本文使用可编程的重映射控制器实现灵活的数据存储布局转换,移除了对数据大小和只支持特定目标布局的限制。根据GPGPU并行访存的特征,本文指出其访存过程中存在大量的仿射计算,即各线程执行完全相同的内存地址计算,只有作为输入的线程ID有差异。这种冗余计算导致GPGPU的计算资源浪费且不利于对访存统一调度。因此本文提出访存分离计算,由CPU生成仿射计算参数,交由共享LLC计算各线程的实际访存地址,并生成相应的访存请求。LLC最终将数据经过访存融合后推送给GPGPU的各线程。因此访存分离计算移除了GPGPU代码中大部分的访存地址计算和访存操作本身,将更多GPGPU的计算资源保留给实际工作,提高了系统效率。最后,本文使用模拟器环境验证提出的优化方法。其中共享数据队列相比传统的数据交换方法加速了 48%,而CPU和GPGPU的平均全局同步时间分别缩短到21%和38%。使用共享数据存储布局重映射后,测试程序的平均执行时间降低到69%;相比于使用CPU和GPGPU进行数据存储布局转换,使用本文的方法的平均转换时间分别减少到58%和46%。访存分离计算则将运行时间平均降低到48%,GPGPU平均执行的指令数下降到84%。实验表明,本文提出的优化方法从不同角度提升了 CPU和GPGPU在共享LLC架构下的数据共享性能。