2012-09-07 66 views
3

我正在开发一个代码来执行我的标准进行一些非常大的计算。根据单CPU估计,预计运行时间约为10个CPU年,内存要求约为64 GB。几乎没有IO是必需的。我的问题代码(用C编写)的序列版本运行良好,我必须开始考虑如何最好地并行化代码。混合OpenMP + OpenMPI用于混合分布式和共享内存?

我有权访问具有〜64 GB RAM和每个节点16个内核的群集。我可能会限制自己使用例如< = 8个节点。我在想象一个设置,其中内存在单个节点上的线程之间共享,在不同节点上使用单独的内存,节点之间的通信相对较少。

从我迄今为止阅读的内容来看,我已经提出的解决方案是使用混合OpenMP + OpenMPI设计,使用OpenMP管理各个计算节点上的线程,并使用OpenMPI在节点之间传递信息,如此: https://www.rc.colorado.edu/crcdocs/openmpi-openmp

我的问题是,这是否是“最佳”的方式来实现这种并行。我是一名经验丰富的C编程人员,但在并行编程方面的经验非常有限(有一点OpenMP,OpenMPI没有;我过去的大部分工作都是并行)。作为另一种建议,OpenMPI可以在单个主机上有效共享内存吗?如果是这样,那么我可以避免使用OpenMP,这会使事情变得更简单(一个API而不是两个)。

回答

6

混合OpenMP和MPI编码最适合用于可以清楚地识别两个单独级别的并行性的问题 - 一个是粗粒度嵌套,另一个是细粒度嵌套在每个粗粒子域内。由于细粒度并行性在使用消息传递实现时需要大量的通信,因此它不会扩展,因为通信开销可能会与正在执行的工作量相当。由于OpenMP是一种共享内存范例,因此不需要数据通信,只需访问同步,并且更适合于更细粒度的并行任务。 OpenMP也受益于线程之间的数据共享(以及具有共享最后一级缓存的现代多核CPU上的相应缓存共享),并且通常需要的内存少于等效的消息传递代码,其中某些数据可能需要在所有进程。另一方面,MPI可以运行跨节点,并且不限于在单个共享内存系统上运行。

你的话表明你的并行化非常粗糙或属于所谓的并发问题。如果我是你,我会走混合。如果您只使用OpenMP编译指示并且不使用运行时调用(例如omp_get_thread_num()),则您的代码可以编译为纯MPI(即使用非线程MPI进程)或混合编译,具体取决于是否启用OpenMP(可以还提供虚拟OpenMP运行时以使代码能够编译为串行)。这将为您提供OpenMP(数据共享,缓存重用)和MPI(透明网络,可扩展性,轻松启动工作)两方面的优势,并增加了关闭OpenMP并在仅MPI模式下运行的选项。作为额外的奖励,您将能够满足未来,这看起来像让我们互联了许多核心的CPU。