在单个异构计算节点中利用并行性

计算科学 并行计算 C++ mpi
2021-12-19 16:11:05

我正在寻找一个库,以在使用分层八叉树网格的 C++ FV/DG 代码中利用单个异构计算节点(可能使用 Xeon Phi 或 nVidia 的 GPGPU 等加速器)内的并行性。这应该

  • 支持多个后端(例如 OpenCL、CUDA、OpenMP、OpenACC,...)
  • 希望足够通用以支持未来的后端,
  • 易于安装/配置,
  • 易于使用。

线性代数会很好,但该库至少应该能够在计算设备上使用用户定义的内核进行简单的转换:

auto vd = device_vector<double>{ 11., 22., 33., 44. };
transform(vd, begin(vd), [](double vd_i){ return 2. * vd_i; });
host_vector<double> vh = vd;  // no-op if the device is the CPU
for (auto vh_i&& : vh) { cout << vh_i << "\n"; } // 22, 44, 66, 88

我看过 Intel TBB、openMP、openACC、AMD 的 bolt 和 nVidia 的 Thrust。

推力似乎最适合我的应用,因为:

  • 它提供不同的后端:CUDA、TBB 和 OpenMP(无 OpenCL),
  • 它有一个熟悉的类似 STL 的接口:主机/设备容器、迭代器和算法,
  • 文档看起来不错。

但是,我完全没有构建混合 MPI-Thrust 应用程序的经验(也不知道有谁)。

所以对于我的问题:

  • 还有其他值得研究的图书馆可能更适合我的需求吗?
  • 有没有人有混合 MPI-Thrust 应用程序的经验,可以评论 Thrust 对这种事情的适合程度?
1个回答

我建议你看看ViennaCL它是用 编写的c++,利用模板元编程,并支持 OpenCL、CUDA 和 OpenMP 作为后端。就像它一样Thrust,它具有设备和主机容器的抽象层,并实现了几种算法,主要是在线性代数领域。虽然,设备整数容器从 1.4.2 版本开始丢失(显然它们将包含在 1.5.0 中)

此外,我喜欢它的地方在于它很好地包裹了 OpenCL API 并简化了编写自定义 OpenCL 内核的任务。我没有在混合环境中使用 ViennaCL 或 Thrust,所以我无法对此发表评论。但是,我知道PETSc有接口ViennaCL并支持混合 mpi-viennacl vec 类型。这应该会简化混合方法——它实际上是我未来利用此功能的项目之一。

总而言之,我建议你看看他们的网页。哦,我几乎忘了提到这ViennaCL是非常好的记录:)。