共享内存并行计算方案比较

计算科学 并行计算 高性能计算 图书馆 语言
2021-12-01 00:38:12

截至 2015 年,有哪些共享内存并行计算解决方案可用?

对于高性能科学计算中出现的各种用例,每种方法的优缺点是什么?

我主要对使用 C 或 C++ 的东西感兴趣,类似于 OpenMP 或线程构建块;或者可能是其他可以合理替代 C++ 用于科学计算的低级语言(例如 Fortran 或为并行科学计算设计的一些新语言,如Chapel,尽管我不确定这些语言中是否有任何一种已经达到可用质量已经)。

我正在寻找一个简短的高级概述,它可能对初学者决定他/她的特定用例遵循哪个方向有用。

1个回答

你有两个基本的选择,第三个是遥远的。在我看来,其他一切都不是真正可取的。如果您想自己完成 100% 的工作,您可以使用 Pthreads(和 Boost::Thread)。您将不得不编写自己的障碍和缩减,生成线程本地存储,并且通常会完成所有繁重的工作。通过所有这些工作,您可以获得所有您想要的控制。

OpenMP 通过隐藏大部分细节来消除大部分这些问题。如果您需要同时进行任务并行和工作共享,则需要更现代的实现。GCC 正在出现,但我很长时间没有将它的完整性或性能与 Intel 编译器进行比较。英特尔编译器的 OpenMP 实现传统上非常好。使用 OpenMP,您可以免费获得并行循环、任务、原子/主/单个区域,这似乎涵盖了 99% 的科学计算需求(这意味着 PDE 和 ODE 模拟以及线性代数)。有许多库(如英特尔 MKL)使用/与 OpenMP 合作,所以这也是一个优势。使用 OpenMP 4.0,您可以卸载加速器,但我认为英特尔是唯一支持该加速器的,并且仅适用于 Xeon Phi。

TBB 虽然现在是开源的,但使用较少且未标准化。话虽如此,它非常强大,具有许多类似 OpenMP 的结构,并且非常 C++y。但是,如果您尝试与任何人共享您的 TBB 代码,他们可能无法帮助您,因为它不太熟悉。

我能想到的所有其他东西的采用率都较低,不够健壮,可编程性较差,或者性能较差。我的清单包括 OpenCL(在 CPU 而非 GPU 上)、Haskell、Julia、Chapel、X10、UPC、Co-Array Fortran、Python 多处理等。

除非您是一个喜欢探索新语言以获得乐趣的语言书呆子,否则我不建议您编写一个科学应用程序,该应用程序需要看到曙光,具有性能,并且使用除 C/C++/Fortran 和 OpenMP 之外的任何库用于穿线。对于传统的科学计算,有太多的库期望 C/线程接口浪费您的时间重新发明轮子。