第一届九坤并行程序优化大赛总结

本文最后更新于:6 个月前

背景

2021 年 9 月,量化头部公司九坤举办了其第一届并行程序优化大赛,相关介绍可参考 推送。赛题如下:

赛题是 C/C++ 的 codebase,然而我与一起组队的两位同学基本都对 C/C++ 不太熟悉,于是我们起名叫做了”只会 JAVA 队”。作为三个在体系结构几乎一窍不通的小白,在一个多月断断续续的不到 10 次线下沟通中,我们逐渐对体系结构入了门,在 192 个队伍脱颖而出,并在决赛取得了第 4 名的成绩(PS:离苹果周边只差一步真的好可惜),具体可以参考 总结推送

这里简单做一总结,贴一些当前的资料和想法,以备之后回忆和反思。

赛题

第一题

在深度学习中,卷积操作在神经网络中扮演了重要的作用。2015 年,Andrew Lavin 等人提出了快速计算卷积的算法 Winograd,通过降低计算复杂度,相比直接卷积的算法提升 4 倍效率,成为了深度学习中非常重要的一个算法。本次比赛的第一题就是优化 Winograd 算法。各参赛队的通过优化比赛方给出的 Winograd 算法代码,缩短其运行时间,提升该算法时间的每秒浮点计算次数(FLOPS)。

第二题

金融数据是真正的“大数据”。每天市场上的交易会产生海量的数据,这些数据对于预测未来市场走势只非常重要。因此负责高速储存、读取这些数据的 IO 系统成为了行业内重要的一环。目前金融数据中常用 HDF5 文件系统库进行大规模的数据存储。本次比赛第二题要求各参赛队探索 HDF5 文件系统,通过一个跑分程序 h5bench 来完成 IO 系统的性能研究和调优。

代码 & 文档

从赛题可以看到,此两题能够检验选手最大化压榨 CPU 和 IO 性能的能力。

有关赛题的代码和文档均已开源,可移步 此处 查看。欢迎交流~

总结

就 CPU 题目而言,我们此次尝试了以下优化和工具:

  • 算法优化:winograd4x3-3D
  • 指令级并行:循环展开,分支预测
  • 数据级并行:AVX128,256,512
  • 线程级并行:OPENMP
  • 编译器:尝试 gcc 不同版本,对比 llvm
  • 内存排布:36*STRIDE
  • 冒险尝试:merge_array
  • Profiling:perf

其实这里有好多思想都已经在数据库领域存在了。比如向量化引擎,比如 codegen 的 llvm 优化,比如对 cache 友好的 push 查询引擎等等。

个人认为,数据库做到极致便是对硬件性能的一种体现。因此,一个优秀的数据库工程师应该对体系结构具有一定的了解,这样才有可能进一步压榨硬件性能,从而达到更好的数据库性能。

一直以来,我希望分布式数据库能够成为自己的一个标签。通过这次比赛,我意识到高性能计算也是一个很有趣且硬核的方向,其不仅能够给企业迅速带来真金白银的收益(节约成本),而且也是很多领域做到极致的一种出路。

希望未来还能有契机去进一步深挖此方向吧。