是否可以在OpenMP(4.x)中为任务分配多个线程?
我想解决的问题的大致概述:
#pragma omp task
{
#pragma omp parallel for num_threads(2)
<for loop>
}
答案 0 :(得分:2)
是的,您可以使用嵌套的并行区域,完全使用您描述的语法。您需要通过设置环境变量OMP_NESTED=True
或调用omp_set_nested
来专门启用它,并且它需要得到实现的支持。
那就是说,你必须在表现方面非常小心。通常,OpenMP将每个核心使用1个线程,这对于调度程序和硬件来说非常好。嵌套的并行区域将导致超额订阅(每个核心多个线程),因此当线程竞争核心时可能会导致性能问题。这尤其正确,因为许多任务可能会打开人类并行区域。
另请参阅this discussion关于嵌套循环上的嵌套并行区域。