中山大学 | 算法优化与硬件利用的实战经验
在今年的PAC大赛中,我有幸参与其中,经过初赛和决赛的两轮激烈角逐,不仅提升了自己的编程和优化技能,也积累了宝贵的经验。整个参赛过程中,我和团队遇到了许多技术上的挑战,但通过不断的思考和尝试,最终成功解决了这些难题。以下,我将分享我们在初赛和决赛中的经历、遇到的困难以及我们最终采用的解决方案和心得。
初赛、决赛的技术挑战与成长
在初赛阶段,我们面对的主要任务是优化CPUBench和Winograd算法。虽然这看似是常见的算法优化问题,但实际上隐藏了许多复杂的技术细节。
首先,在CPUBench优化中,我们遇到了一个棘手的问题:某些子项频繁申请和释放内存,导致性能严重下降。默认的BLAS库也并不能很好的利用上硬件的算力。为了解决这些问题,我们决定更换更高效的malloc实现,并选用了性能更优的BLAS库。在性能上实现了显著提升。这个经历让我深刻体会到,工具和库的选择在优化中起到了至关重要的作用。
接着是Winograd赛题。在这个问题中,我们需要优化小矩阵乘法的效率。然而,随着问题的深入,我们发现传统的矩阵乘法算法在缓存利用率上存在问题,导致小矩阵乘法效率不够高。为了解决这个问题,我们首先研究了不同的数据排布方式,希望通过更合理的内存布局提升缓存的亲和性。同时,我们还尝试了手动编写SVE intrinsics,以期更高效地执行小矩阵乘法内核。在这过程中,虽然直接编写intrinsic代码的复杂度较高,但通过不断调试和优化,我们的矩阵乘法效率得到了显著提升。由此可见,在优化过程中,深入了解底层硬件架构和手动编写底层指令可能是提升性能的一个关键突破口。
进入决赛后,赛题难度进一步升级,比赛内容主要围绕两个多项式计算优化的题目展开。其中的核心挑战是如何高效地进行向量化计算,特别是在需要计算变量x的不同幂次时,如何利用硬件的向量化指令进行优化。
面对这个问题,我们意识到,如果采用传统的逐步计算x的幂次,效率会非常低下。为此,我们决定利用内联汇编来加速计算,并使用向量化指令集对x的不同幂次进行并行计算。通过这种方式,我们成功地缩短了计算时间,大幅度提升了计算效率。
此外,另一个赛题是有关stencil计算的问题,涉及到多个多项式幂次的数据复用。在这里,我们面临的挑战是如何避免重复计算,提高数据复用率。我们仔细分析了每个多项式的结构,设计了一种算法,能够在计算中高效地管理和复用数据,减少了大量不必要的重复计算。通过这个优化,我们提高了运算效率。这让我认识到,优化算法不仅仅是靠硬件性能的提升,更重要的是理解问题本质,从算法设计层面着手解决问题。
硬件理解与算法创新是性能提升的关键要素
通过这次PAC大赛,我积累了许多宝贵的经验。首先,我深刻认识到深入理解硬件架构和工具链的重要性,比如在初赛的CPUBench优化中,我们通过更换高效的内存分配器和BLAS库,大幅提升了性能,证明了选择合适工具的重要性。其次,数据结构与缓存优化在高性能计算中至关重要,在Winograd赛题中,我们调整数据排布,提高了缓存亲和性,显著改善了效率。同时,虽然手动编写SVE指令和内联汇编的复杂度较高,但在处理底层硬件瓶颈时,这些方法能够带来意想不到的优化效果,比如在决赛中通过向量化计算x的幂次取得的提升。最后,比赛让我认识到精巧的算法设计有时比单纯依赖硬件优化更为关键,尤其在决赛的stencil问题中,通过避免重复计算和提升数据复用率,我们实现了更高效的性能优化。
总体而言,这次PAC大赛让我在算法优化和硬件利用方面得到了极大的提升。不仅学到了很多实用的技术,更加深了我对高性能计算的理解。这次参赛经历不仅让我见识到了优化的广度和深度,也让我更加自信地面对未来的技术挑战。
全国并行应用挑战赛(Parallel Application Challenge 简称PAC)2013年创办,由中国计算机学会高性能计算专业委员会、北京并行科技股份有限公司等共同倡导发起,竞赛旨在培养和发掘杰出计算人才,寻找行业最佳应用,践行新发展理念,助力相关产业高质量发展!
官方通知
2024/10/23
2024/10/23
2024/9/30
2024/8/22
10月23