最小数据并行排序:MPI Comm split 的高效解决方案
1. 并行排序需求背景
自 2002 年以来,单核性能停滞不前,随着摩尔定律推动硬件并行性呈指数级增长,应用程序自然需要并行排序解决方案。假设每个进程有唯一的排名编号(0 到 p - 1),最优并行解决方案的必要条件是 n 个数据项全部分布在所有进程上,即进程 i 持有 ni 个不同的数据项,且 n = Σ(ni)(i 从 0 到 p - 1)。本文研究极端情况,即每个进程仅持有一个数据项(ni = 1,n = p)。
并行排序问题可以表述为顺序排序问题的扩展:
- 输入 :分布在 p 个进程上的项序列 (x0, x1, …, xp - 1),进程 i 持有项 xi,以及关系运算符 ≤。
- 输出 :输入序列的分布式排列 (y0, y1, …, yp - 1),进程 i 持有项 yi,且 y0 ≤ y1 ≤ … ≤ yp - 1。
消息传递接口中的 MPI Comm split 需要高效的最小数据并行排序解决方案。现有的 MPICH 和 Open MPI 实现需要 O(p) 的内存和 O(p log p) 的时间来完成排序任务。本文提出三种新颖的并行排序算法:
1. 一种资源复杂度呈线性的算法,类似于 Sack 和 Gropp 的方法,但更简单,适用于最多 100,000 个进程的 MPI Comm split 实现。
2. 对第一种算法的改进,将 O(p) 的内存复杂度降至 O(1),但会牺牲一些运行时间。
3. 一种可扩展算法,实现了最小内存复杂度 O(1),并将时间复杂度降至 O(log