我正在寻找一个库,以在使用分层八叉树网格的 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 对这种事情的适合程度?