选择并行化方案需要考虑什么?

Emr*_*koz 4 c++ parallel-processing tbb mpi openmp

我正在使用c ++为我的计算动力学研究开发一些代码.我的代码解决了稀疏和密集的矩阵,生成网格,并在最微不足道的意义上做类似的操作.我需要并行化我的代码以减少计算时间并为此目的使用OpenMP.

但仔细观察一下商用代码,比如ANSYS CFX,我发现该软件中使用的并行化方案是MPICH2,它是MPI的一种实现方式.

所以你有很多并行化工具/ API:

  • OpenMP的
  • MPI
  • 英特尔线程构建模块
  • 并行线程
  • 微软PPL

我使用了其中一些工具,并使用每个工具在本地计算机上获得100%的CPU使用率.

在选择合适的并行化工具时,我不知道应该注意什么标准.什么样的应用需要哪种工具?上述任何一项可用于研究目的吗?其中哪些主要用于商业软件?

Adr*_*tti 7

至于这种类型的许多问题,没有一个真正明确的答案.你不能真正说出什么更好,因为答案总是"它取决于".关于你正在做什么,你的代码是如何编写的,你的可移植性要求是什么等等.

在你的清单后面:

  • OpenMP:非常标准,我发现它非常容易使用.即使原始代码没有用并行化编写,这个库也很容易逐步实现.我认为它是并行计算的一个很好的切入点,因为它可以使一切变得简单但是它很难调试,性能有限并且它只是使代码并行(它缺乏并行算法,结构,原语而且你无法跨越工作一个网络).
  • 消息传递接口:从我的角度来看,基于此标准的库最适合跨越集群的大型计算.如果您的计算机很少并且想要并行计算,那么这是一个很好的选择,众所周知且稳定.它(我的观点再次)并不是本地并行化的解决方案.如果您正在寻找一个众所周知的大型网格计算标准,那么MPI就适合您.
  • 英特尔线程构建模块:这是一个C++库,用于统一跨不同环境(pthreads或Windows的线程模型)的多线程接口.如果您使用这样的库,则可能需要跨编译器和环境进行移植.此外,使用此库并不限制您,因此它可以与其他东西很好地集成(例如MPI).您应该看看图书馆,看看您是否喜欢它,它是一个非常好的选择,具有良好的设计,有良好的文档和广泛使用.
  • Microsoft Parallel Patterns Library:这是一个非常大的库.它是相当新的,所以我不建议有人在没有良好测试的情况下使用它,而且它是微软特定的,因此你被绑定到它的编译器.那说我认为这是一个很棒的图书馆.它抽象了很多细节,它设计得很好,它提供了"并行任务"概念的高级视图.再次使用此库并不会阻止您使用,例如,MPI用于集群(但并发运行时具有自己的库).

用什么?我没有答案,只是尝试选择你觉得更舒服的东西(看看Boost Threads).请注意,不知何故,你可以混合它们,例如OpenMP + MPI,MPI + TBB甚至MPI + PLL).我倾向于PPL但是如果你正在开发一个真实世界的应用程序,你可能需要一个长时间的测试来决定什么是更好的.实际上我喜欢Concurrency Runtime(PPL的基础),因为它是"水平的",它为并行计算和许多"垂直"包(Agents,PPL,TPL)提供了一个基本框架(带有结构和算法).

也就是说,当您将计算并行时,您可能需要提高某些CPU密集型例程的性能.您可以考虑使用GPU来完成这项任务,我认为它将为短期大规模并行计算提供最佳功能(当然,即使CUDA性能可能更高,我也更喜欢OpenCL而非专有CUDA).实际上,如果您对此主题感兴趣,您甚至可以查看OpenHMPP.