一本关于科学计算的 C++ 并行编程的好书/资源

计算科学 并行计算 C++ 高性能计算
2021-12-07 09:09:50

我是一名机械工程研究生,目前正在从事一个项目,该项目将在新的未来扩大规模,需要相当多的处理能力。我将 C++ 用于我拥有的代码,然后计划编写代码的并行版本以在分布式内存 HPC 系统上运行。我对计算的理论方面没有深入的了解,只知道它的并行方面。

我想向社区寻求关于好的、易于阅读和理解的书籍或非视频互联网资源的建议,这将有助于我开始并行编程。最好是一本书,其中包含大量示例 C++ 代码,适用于它所指示的每个概念。以后我肯定可以为自己找到更高级的书籍,但我想以最小的惯性开始我的项目工作,与我的学习“并行”。

如果您知道此类资源,请告诉我。

3个回答

关于并行编程,您需要了解的第一件事是共享内存多处理器计算机系统和分布式内存集群之间的区别。

共享内存多处理器系统是一种计算机,其中多个处理器内核(可能位于一个、两个或更多集成电路上)共享相同的内存。从程序员的角度来看,程序员创建的多个进程可以在不同的内核上运行并共享对内存的访问。用于共享内存系统上的科学计算的并行程序通常使用专门的语言扩展来编写,例如 OpenMP(具有 C、C++ 和 Fortran 版本)。OpenMP 语言扩展使描述要并行执行的数组上的操作变得容易- 编译器负责将工作分配给多个处理器。

分布式内存集群可以被认为是大量计算机的集合,每台计算机都有自己的内存。为了进行交互,在这些计算机上运行的进程必须明确地相互发送消息。在分布式内存集群上进行科学计算的并行程序最常使用消息传递接口 (MPI) 库编写。使用 MPI 编程比使用 OpenNMP 编程更困难,因为难以决定如何分配工作以及进程如何通过消息传递进行通信。

请注意,使用 MPI 编写的程序可以使用 MPI 库的一个版本在共享内存系统上运行,该版本只是通过共享内存在进程之间传递消息。从这个意义上说,MPI 程序更加灵活——它可以在任何类型的系统上运行。相比之下,您无法在分布式内存集群上有效地运行 OpenMP 程序。

共享内存系统通常受限于处理器内核的数量和可以使用的存储量。在实践中,您很少会在共享内存系统中找到超过 64 个处理器内核或大约 128 GB 的 RAM,而分布式内存集群可能具有数万个处理器内核和 TB 级内存。

对于真正的大规模并行计算,您需要学习 MPI。如果您愿意并且能够在较小的共享内存系统的限制范围内工作,那么学习 OpenMP 将是开始并行计算的一种更简单的方法。例如,如果您正在使用具有 4 或 8 个内核的台式计算机并且您想利用这些内核,那么 OpenMP 可能是最好的入门方式。

其他答案已经提到了一些开始使用 MPI 的书籍。对于 OpenMP,我建议您从以下资源列表开始

http://www.openmp.org/resources/

这是 C 语言的 MPI 的一些资源。

mpitutorial.com

Peter Pacheco的 MPI 用户指南。这可以从@BillGreene 在他的评论中引用的页面访问,但这是一个方便的 PDF,而这是一个相当不方便的压缩 PostScript。

我认为这两个对于初学者来说都是很好的资源。


关于 C++,它确实已被弃用。是一个讨论。只需坚持使用常规的 C 绑定即可。没有理由不能在 C++ 代码中使用常规 C 调用。如果你真的想要,你可以围绕 C 接口编写自己的 C++ 包装器,或者使用Boost MPI,它是围绕 MPI 的 C++ 包装器。

几年前我第一次使用C++ 和 MPI 中的并行科学计算时,我非常喜欢它。我感觉它的 C++ 现在已经过时了,而且正如已经观察到的那样,MPI 和 C++ 不能再很好地结合在一起了。