论文部分内容阅读
随着多核处理器的发展,并行编程成为目前软件设计的主流。然而,由于并行程序本身具有不确定性,程序中并发错误的触发也不确定,这给程序设计人员的开发和调试工作带来巨大的困难和挑战。另外,隐藏在已发布的软件产品中的并发错误可能给实际日常生活造成严重伤害事故、大量经济损失以及安全隐患。 确定性重放技术能够提供重现并行程序执行的功能,使得程序设计人员能够利用循环调试技术,像调试传统串行程序那样调试并行程序。确定性重放技术的核心是如何高效地记录并行程序对共享内存的访问顺序。现有的方法或者需要细粒度插桩所有访存指令,或者需要操作系统的特殊支持,或者需要修改现有处理器结构,存在运行时开销大与安全隐患等问题。为了减轻程序设计人员调试并行程序的负担,本文从记录和重放两个方面对确定性重放技术展开深入的研究。本文的主要研究工作和创新点包括: (1)提出一种适用于商用系统环境的确定性重放方法UPLAY,同时支持Pthreads和OpenMP两种并行编程模型。该方法利用进程的私有页表属性,将并行程序中的线程变为进程,从而不同的线程能够为同一共享页面设置不同的访问权限。基于页保护机制,UPLAY记录每个共享页面的访问权限在不同线程间的转移顺序,来直接反映并行程序访问共享内存的顺序。与已有的确定性重放方法相比,UPLAY有效的利用程序的时间局部性和空间局部性,减少了记录阶段需要记录的不确定性事件的数量以及同步操作的数量,既不依赖特殊硬件的支持,也不需要修改操作系统内核或编译器。 (2)深入地性能分析与优化探讨。为了进一步降低确定性重放方法的记录开销,本文以UPLAY为例,采用PARSEC测试集进行性能统计,首次从锁、按需释放记录、同步变量、数据伪共享、完全释放、页面释放同步点、线程变进程等方面深入分析了页保护机制下确定性重放方法的性能开销。针对由按需释放记录、同步变量、数据伪共享、完全释放、页面释放同步点引入的开销分别提出位图快照记录、同步变量映射、私有堆、主动抢占、自适应释放等优化策略,分别获得12.6%、3.08%、5.86%、16.13%、18.72%、7.53%的性能提升,并采用私有锁、进程复用等机制来降低全局锁、进程创建与回收带来的性能开销。其中,私有堆与自适应释放这两种优化策略可以有效的解决页保护机制下数据伪共享引入的性能下降问题。在上述优化策略基础上测试UPLAY的最终性能,4线程、8线程下记录阶段并行程序的平均运行时间分别是原程序执行的4.85X、7.91X。另外,这项性能分析与优化工作对今后的确定性重放技术研究也有一定的借鉴。 (3)提出一种基于依赖对的并行重放方法FaPlay。该方法离线分析记录阶段生成的日志文件,单独提取具有依赖关系的日志项,并将原先具有全局逻辑序的日志文件单独分割为线程独立日志文件,并在上述日志项的合适位置添加相应的等待-唤醒类同步操作维护依赖关系。在重放阶段,每个线程读取各自的日志文件,仅在执行具有依赖关系的后继日志项时等待前驱日志项的执行结束,从而提高重放执行的速度。实验结果表明,这种并行重放方法能够实现快速重放。