论文部分内容阅读
计算机领域的一个发展趋势是CPU运算速度的提升要大大快于磁盘的数据传输效率的改进,它们之间的差距不断扩大,逐渐成为分布式计算中不可忽视的一个因素。在这个背景下,对并行程序的I/O行为做出准确的性能预测就显得尤其重要,它在发现系统瓶颈、评估程序性能等方面都有着重要意义。本文获取运行日志的方式是利用PMPI接口编写封套函数,在封套函数内截获原始程序的信息,这些封套函数被编译为一个动态库,它们可以在不重新编译原始程序的情况下获得原始程序的运行信息。本文还设计了一系列规整化运行日志的方法,以助于后续的合并、压缩操作。针对原始程序各个进程的运行日志的内容基本一致的特点,本文提出了三种合并算法有效的去除这些冗余信息,并对它们的效果进行了详尽的分析。其中的基本合并算法在实际应用中效率很高,但通用性不佳;基于后缀树的算法具有最好的时间复杂度,但实验表明其效率要低于其他的算法;基于最长公共子序列的合并算法拥有近乎线性的时间复杂度,具有较好的通用性,并在实验中表现了不错的效率,本文最后选用的合并算法是基于最长公共子序列的合并算法。并行程序的运行日志相当于将原始程序中的循环全部展开,导致记录下来的日志十分庞大。日志中的这类循环结构可以由本文的循环收缩算法全部发现并收缩。日志中的循环识别问题可以抽象为字符串中的连续重复子串识别问题,本文的循环收缩算法是基于后缀树的,其最坏时间复杂度为O(nlogn),这一算法的性能要优于以往的日志循环收缩算法,实验表明本文收缩算法的性能是次优算法的5~10倍。本文根据处理后的运行日志可以成功模拟出原始程序的行为,以此自动构建出来的特征程序可用于预测并行任务的性能。我们使用IOR并行I/O标准程序、NPB-BTIO标准程序以及MPI-TILE-IO程序进行了实验,实验结果表明本文构建的特征程序可以较准确的反映原始并行程序的计算特征和I/O特征。