并行数据结构的最新技术

计算科学 Python 并行计算 C++ mpi
2021-11-30 07:38:12

我目前正在评估如何在具有大量节点的并行计算机上实现多种算法,每个节点还配备强大的 GPU。事实证明,对于许多算法来说,“仅仅”拥有一个分布在许多节点上的数据结构,并且您可以在其元素上以 for-each 内核的风格运行一个函数,这将是有用的。

最后,它可以归结为 C++ 的 STL 的分布式实现这也意味着,您可以以熟悉的方式执行算法,并且(大部分)不需要担心并行细节。拥有 Python 绑定也很酷:编写一些高级 Python 代码,低级分布式的东西会神奇地发生。

我对这个方向的现有项目进行了一些研究:

  • 例如STAPL,但我真的找不到更多信息,也没有在我的电子邮件中得到回复。
  • 有诸如 Trilinos 和 PETSc 之类的线性代数包,但它们主要是为线性代数设计的,它们也是巨大的框架,需要大量的努力才能整合到自己的项目中。
  • GPU 支持通常很差(我知道您不能直接将 GPU 用于通用数据结构。)

是否对可用作现有代码并行化基础的分布式通用数据结构进行了认真的努力?我很乐意得到一些参考资料、论文或搜索词。

3个回答

我正在开展一个与您的问题相关的项目,试图通过尽可能多地抽象出特定并行架构和设置的细节来实现并行流程的一种实现,并使其“面向未来”。根据我的研究,似乎没有完全自动化的并行性可以有效地适应任何任意算法或数据类型,但是有一些工具可以帮助并行化现有的串行代码。

对于纯 Python 解决方案,有Anaconda Accelerate包,其中包括与 CUDA 库的 Python 绑定,例如 cuBLAS、cuFFT、cuSPARSE、cuRAND。

Trilinos 中的Kokkos包提供了类似的功能,尽管它是一组 C++ 库,所以可能不是您想要的。只要您注意如何定义内存和执行空间,就可以为各种架构快速编译并行代码,而无需专门针对特定架构。只要您的仿函数和数组被合理定义,从 CUDA 切换到 Pthreads 是微不足道的,尽管您的性能会根据您定义内存和执行空间的巧妙程度而有所不同。这个包特别适合稀疏矩阵运算,并且最常内置于分子动力学模拟中(据我所知)。

如果您的数组很密集,您可以考虑查看Halide语言项目。该语言的目标是将算法与调度分开,因此您可以编写一次算法,然后专注于调整调度以优化各种并行架构。它主要用于图像分析,但也适用于许多其他密集阵列操作。

我最近也有同样的问题。一个有趣的发展是针对异构硬件的HSA 规范,据说是在GCC 6.1中实现的(我还没有尝试过)。听起来这个想法是用一种编程模型来统一跨异构设备的内存访问和浮点操作。

您可能想考虑使用 Julia。使用机器文件在多个节点上使用 Julia 非常简单(我在博客文章中记录了这些文件,但本质上您只需传入您正在使用的节点列表,现在您的并行命令将适用于所有节点)。让它与GPU一起工作也很容易(您可以使用第一篇文章中的并行函数在每台机器上单独完成)和每个节点的多个 GPU

此外,Julia 有分布式数组,它们是数组,其中只有部分数组位于单个节点上。然后,您可以使用 Julia 的奇特迭代语法for i in eachindex(A),它只会对每个节点包含在节点上的索引进行迭代。只要您强制执行类型稳定性,它将编译为与 C/Fortran 代码相同的程序集(您可以使用 进行检查@code_llvm)。

还有一些工作将 Julia 的线程与多进程混合:每个节点 1 个进程,并行命令自动并行到每个节点,每个节点在其核心上线程。这仍然是实验性的,但由于它都是用 Julia 编写的,如果你了解 Julia,那么很容易贡献(或为它制作一个包)。