线程构建块与MPI,哪一个适合mt需要更好?

时间:2010-02-03 14:12:03

标签: c++ mpi tbb parallel-processing

现在我在C ++中有一个用于解决优化问题的串行求解器,我应该用不同的参数并行化我的求解器,看看它是否有助于提高求解器的性能。现在我不确定我应该使用TBB还是MPI。从我读过的TBB书中,我觉得TBB更适合于循环或细粒度代码。由于我对TBB没有太多经验,因此我觉得很难将代码划分为小部分以实现并行化。另外,从文献中我发现许多作者使用MPI来平行几个求解器并使其合作。我想也许MPI更适合我的需要。因为我对TBB或MPI都不太了解。谁能告诉我我的感觉是否正确? MPI会让我更好吗?如果是这样,什么材料有利于开始学习MPI。我没有使用MPI的经验,我使用的是Windows系统和c ++。非常感谢。

1 个答案:

答案 0 :(得分:3)

您需要考虑的基本事项是在共享内存和分布式内存之间进行选择。 共享内存是指您可以访问公共内存的多个进程(通常是进程中的多个线程)。这可以是非常精细的,并且通常更简单的是使单线程程序适应多个线程。您需要设计程序的方式是线程大部分时间在内存的不同部分工作(利用数据并行性),并且使用锁保护共享部分免受并发访问。 分布式内存意味着您可以在一个或多个分布式计算机中执行不同的进程,但这些进程具有共同的目标并通过消息传递(数据通信)共享数据。没有共同的存储空间,一个进程需要来自另一个进程的所有数据都需要通信。 这是一种更通用的方法,但由于通信要求,它需要粗粒。 TBB是基于线程的共享内存并行性的库支持,而MPI是用于分布式内存并行的库(它具有简单的通信原语以及不同节点执行中的多个进程的脚本)。

最重要的是让您确定解算器中的并行性,然后选择最佳解决方案。您是否拥有数据并行性(不同的线程/进程可以在不同的数据块中并行工作,而无需通信或共享此数据的一部分)?任务并行性(不同的线程/进程可能正在对数据执行不同的转换,或者以管道或图形方式对数据处理中的不同步骤执行)?