论文部分内容阅读
多核平台的普及使得并行软件渗入到计算领域的方方面面,由于软件并行度的提高,多线程之间的数据竞争检测为软件调试带来巨大挑战。数据竞争检测是一种通过分析并行程序的源代码或者运行时信息来识别数据竞争的调试方法,广泛应用于并行软件调试。然而,随着并行软件复杂度的提高,现有的检测方法或者检测精度极低,或者检测开销太高,并且没有充分利用多核硬件资源。 基于同步关系的并行动态数据竞争检测方法采用在线跟踪加离线检测的两阶段检测方式,针对并行程序的并行结构特点,充分利用多核硬件的并行计算能力提高检测的效率。在线跟踪通过过滤和合并内存访问,有效地降低了实际记录的数据量,使得后期对记录数据进行快速的离线分析成为可能。离线分析阶段利用传统的向量时钟决定内存访问的先后发生关系(Happens-before Relation),避免检测具有先后发生关系的内存访问,对可能产生数据竞争的内存访问采用优化的区间重叠算法找出造成竞争的内存访问对。此外,检测阶段充分利用检测算法内在的并行性,将检测任务分割成多个小的任务并分配到多个工作者线程中,以此实现检测阶段的加速。 根据上述原理,基于Linux操作系统和Pin二进制插桩框架,采用C++语言实现了一个针对OpenMP并行程序的数据竞争检测工具。与现有的开源工具相比,该工具能够检测到内存密集型OpenMP程序中所有实际发生的数据竞争和一部分潜在竞争,并且不会产生误报。试验结果显示,基于上述原理实现的原型系统的检测精度与商业检测工具 Inspector接近,并且至少比其快35%。经过并行化之后,能够实现30%左右的加速,并且具有轻易扩展到众核甚至分布式平台的能力。