【问题标题】:Hybrid Parallelism: MPI and TBB混合并行:MPI 和 TBB
【发布时间】:2017-08-08 23:00:35
【问题描述】:
在 TBB 中,task_scheduler_init () 方法经常(并且应该?)在内部调用,是经过深思熟虑的设计决策。
但是,如果我们混合使用TBB和MPI,在不控制每个MPI进程的线程数的情况下,是否保证线程安全?
例如,假设我们有 7 个内核(没有超线程)和 2 个 MPI 进程。如果每个进程同时使用 4 个线程生成一个单独的 TBB 任务,则存在可能导致程序在运行时崩溃的冲突。
我是 TBB 的新手。
期待您的cmets和建议!
【问题讨论】:
标签:
c++
multithreading
parallel-processing
mpi
tbb
【解决方案1】:
从英特尔 TBB 运行时的角度来看,它是否是 MPI 进程并不重要。因此,如果您有两个进程,您将拥有两个独立的英特尔 TBB 运行时实例。我不确定我是否理解与线程安全相关的问题,但它应该可以正常工作。但是,您的超额订阅可能会导致性能问题。
此外,如果您同时使用 MPI 例程(来自多个线程),您应该查看 MPI 实现文档,因为它可能会导致一些问题。
【解决方案2】:
一般来说,这是一个两步探戈
- MPI 将每个任务绑定到某些资源
- 线程运行时(TBB,同样适用于 OpenMP)通常足够智能,可以在之前提供的资源中绑定线程。
归根结底,如果 MPI 将其任务绑定到非重叠资源,则不应存在由 TBB 运行时引起的冲突。
一个典型的场景是在双插槽八核盒上运行 2 个 MPI 任务,每个任务有 8 个 OpenMP 线程。只要 MPI 将任务绑定到套接字,并告知 OpenMP 运行时将线程绑定到内核,性能就会达到最佳。