混合并行:MPI 和 TBB

Hybrid Parallelism: MPI and TBB

在 TBB 中,经常(并且应该?)在内部调用的 task_scheduler_init () 方法是经过深思熟虑的设计决定。

但是,如果我们将TBB和MPI混合使用,是不是在不控制每个MPI进程的线程数的情况下保证线程安全呢? 例如,假设我们有 7 个内核(没有超线程)和 2 个 MPI 进程。如果每个进程同时使用 4 个线程生成一个单独的 TBB 任务,则存在可能导致程序在运行时崩溃的冲突。

我是TBB的新手。 期待您的意见和建议!

从英特尔 TBB 运行时的角度来看,它是否是 MPI 进程并不重要。因此,如果您有两个进程,您将拥有两个独立的英特尔 TBB 运行时实例。我不确定我是否理解与线程安全相关的问题,但它应该可以正常工作。但是,您的超额订阅可能会导致性能问题。

此外,如果您同时(从多个线程)使用 MPI 例程,您应该检查 MPI 实现文档,因为它可能会导致一些问题。

总的来说,这是两步探戈

  1. MPI 将每个任务绑定到一些资源
  2. 线程 运行time(待定,同样的事情也适用于 OpenMP)通常足够智能,可以在先前提供的资源中绑定线程。

最重要的是,如果 MPI 将其任务绑定到非重叠资源,那么就不会有由 TBB 运行时间引起的冲突。

一个典型的场景是 运行 2 个 MPI 任务,每个任务有 8 个 OpenMP 线程,在双插槽八核盒上。只要 MPI 将任务绑定到套接字,并且 OpenMP 运行time 被告知将线程绑定到核心,性能就会最佳。