论文部分内容阅读
大规模的数值模拟的普遍应用对计算机系统的计算能力提出了很大的挑战,代数多重网格(AMG)作为众多数值模拟应用的核心算法,具有良好的算法可扩展能力和并行扩展性,因此优化AMG的并行效率具有重要的实用价值。随着超级计算机体系结构的发展,大规模多核系统成为主流,在这种新的趋势下,AMG的并行扩展性暴露了新的问题。本文的主要工作即是优化AMG在多核系统上的并行扩展性。
MPI并行程序的线程规模过大将面临可靠性下降的问题,合理的解决方案是使用MPI+OpenMP的多层次并行。但是在NUMA结构的多核系统上使用OpenMP并行扩展,会面临数据集中在主进程所在CPU上,缺乏局部性的弊端。我们通过设计感知NUMA架构的内存分配器,将划分给多个线程的数据分割并绑定到运行对应线程的CPU所属的NUMA存储节点上,从而改善了OpenMP多线程并行的数据局部性,使BoomerAMG程序在大规模多核计算平台上具有更好的并行扩展性。在单节点和小规模机群的测试中,使用NAAlloc分配器分别获得了最高16%和60%的性能提升。
另一方面,原始的BoomerAMG程序只提供了CSR这一种稀疏矩阵存储格式,目前没有考虑加入其他可能具有更高运算效率的矩阵格式。于是我们利用目标应用的系数矩阵具有较强的对角线元素分布的特征,使用DIA稀疏矩阵存储格式部分代替BoomerAMG原有的CSR格式,并且对耗时最多的运算包括SpMV和松弛迭代的底层核心代码进行优化,综合使用了cache分块、循环展开等常用优化手段。测试显示AMG的整体并行求解时间缩短了5%~10%,其中SpMV kernel的性能有较显著的40%以上的提升。