在TBB中,task_scheduler_init()方法通常(而且应该是?)在内部调用,这是一个慎重的设计决策。混合并行:MPI和TBB
但是,如果我们混合使用TBB和MPI,是否保证线程安全,而不控制每个MPI进程的线程数?例如,假设我们有7个内核(没有超线程)和2个MPI进程。如果每个进程同时使用4个线程产生一个单独的TBB任务,那么存在冲突,可能导致程序在运行时崩溃。
我是TBB的新手。 期待您的意见和建议!
在TBB中,task_scheduler_init()方法通常(而且应该是?)在内部调用,这是一个慎重的设计决策。混合并行:MPI和TBB
但是,如果我们混合使用TBB和MPI,是否保证线程安全,而不控制每个MPI进程的线程数?例如,假设我们有7个内核(没有超线程)和2个MPI进程。如果每个进程同时使用4个线程产生一个单独的TBB任务,那么存在冲突,可能导致程序在运行时崩溃。
我是TBB的新手。 期待您的意见和建议!
从英特尔TBB运行时角度来看,它是否是MPI进程并不重要。所以如果你有两个进程,你将有两个独立的英特尔TBB运行时实例。我不确定我是否理解与线程安全相关的问题,但它应该正常工作。但是,您可能会导致超额预订,导致性能问题。
此外,如果您同时使用MPI例程(来自多个线程),则应检查MPI实现文档,因为它可能会导致一些问题。
一般来说,这是一个两步巴掌拍不响
底线,如果MPI将其任务绑定到非重叠资源,则不应该由TBB运行时造成冲突。
一个典型的场景是运行2个MPI任务,每个任务8个OpenMP线程在双插座八核心核心盒上运行。只要MPI将任务绑定到套接字,并且要求OpenMP运行时将线程绑定到内核,性能将是最佳的。