论文部分内容阅读
在目前的技术条件下,为了追求更高的性能功耗比与性能面积比,商业处理器普遍采用开发线程级并行的多核结构。多线程编程模型是充分发挥多核处理器硬件执行效率和提高性能的关键。然而多线程并行程序中固有的不确定性,使得传统的循环调试技术无法继续使用,导致并行程序难以调试,严重影响了并行软件的生产效率。为了解决多线程并行程序调试难的问题,本文研究了多线程并行程序的确定性重放系统,针对目前系统的不足,提出了硬件辅助的针对用户态并行程序的确定性重放方法,降低系统中存储日志开销的方法,以及在松弛的存储一致性模型下检测并避免重放死锁的机制。具体而言,本文的主要创新点及贡献包括: (1)硬件辅助的重放用户态并行程序的方法 为了解决系统级重放方法不能有效地辅助应用程序员调试多线程并行程序,本文研究了面向用户态多线程并行程序的硬件辅助的确定性重放方法。与实现系统级重放相比,重放用户态并行程序存在两个挑战:第一,在多任务的系统中用户态程序的外部执行环境复杂,硬件检测到的依赖关系可能来自系统程序或其它的任务,对重放被监控的用户态程序而言,这些依赖关系是多余的;第二,除了程序的外部输入与程序内的访存依赖关系,重放用户态并行程序存在由上下文切换与系统调用之间的数据共享产生的依赖关系,本文称之为隐式依赖关系,这类关系与核心态代码有关,监控复杂。 针对用户态程序重放面临的挑战,本文提出了依赖关系过滤机制与隐式依赖关系的检测与记录方法。在依赖关系过滤机制中,根据发生依赖的两个处理器各自的执行任务情况对依赖关系进行分类,并详细讨论每类依赖关系对重放被监控程序的重要性。此外本文提出三类影响重放正确性的隐式依赖关系,并仔细分析了这三种隐式的依赖关系如何影响重放执行,针对不同的隐式依赖提出了具体的记录方法。 (2)基于全局同步逻辑时间的访存依赖约减方法 为了降低日志的存储开销,本文研究了记录过程中的访存依赖关系约减方法,提出了利用逻辑时间内的定序关系约减访存依赖的方法,该方法基于四步优化过程。首先,为了达到最佳的依赖关系约减效果,本项研究建立了全局同步的逻辑时间。然后,为了降低建立全局同步逻辑时间所带来的运行时开销,提出了基于共享通信的逻辑时间同步方法。再然后,为了进一步消除同步产生的时间开销,采用同步日志来取代逻辑时间同步时的执行等待,利用空间开销换取时间开销。最后,为了降低同步日志的存储开销,提出了一种放松的同步检测条件。此外针对本文提出的访存依赖约减方法,分别基于目录的缓存一致性协议与侦听的缓存一致性协议,提出了相应的逻辑时间同步算法。 (3)在松弛的存储一致性模型下的死锁检测与避免机制 目前的确定性重放方法在支持松弛存储一致性模型的商业处理器中执行时,会产生死锁。为了避免这种死锁问题,本文研究了在松弛存储一致性模型下的确定性重放方法,提出了在松弛存储一致性模型下的死锁检测与避免机制。在我们了解的范围内,本文首次分析了松弛存储一致性模型中的弱写原子性如何导致重放的死锁问题,并针对目前的商业处理器中松弛存储一致性模型的特点,提出了死锁检测与避免机制,该机制通过记录处理器端与访存端的乱序行为,重现了真实的执行过程。最后,为了降低记录乱序行为的存储开销,本文将乱序行为分成符合顺序一致性语义与违反顺序一致性语义两类,并针对违反顺序一致性语义的乱序行为提出了检测条件。 通过在Simics+GEMS的模拟平台上评估本文所提出的方法,结果表明系统调用的顺序化与管理存储开销所增加的运行时开销为9%。在顺序一致性模型下,每执行千条指令所记录的访存依赖关系的存储开销为0.11 Bytes,与当前最有效的访存依赖约减方法Timetraveler相比减少了75%。为了支持松弛的存储一致性模型,记录指令乱序执行所增加的存储开销为11%。此外,分别在4核、8核、16核模拟平台上评估本文所提出约减方法的可扩展性,实验结果表明每执行千条指令的平均存储开销分别为0.14、0.15、0.06Bytes,其中最大值是平均值的4倍。