2017-03-15 65 views
0

是否可以将多个线程分配给OpenMP(4.x)中的任务?每个任务有多个线程OpenMP

问题的概要我试图解决:

#pragma omp task 
{ 
    #pragma omp parallel for num_threads(2) 
    <for loop> 
} 
+0

OpenMP会在您每次调用它时创建一名工作人员。除了做for循环之外,我不认为你可以用它产生一个自定义线程。也许尝试启动一个std ::线程来做你想做的事 – Bl4ckb0ne

+2

@ Bl4ckb0ne这是非常不准确的。你也不应该混用'std :: thread'和OpenMP。 – Zulan

+0

@Zulan这是真的,我从来没有想过这件事,但它是有道理的。我想我误解了OP – Bl4ckb0ne

回答

2

是的,你可以做到这一点与嵌套并行区域,正好与语法你描述。您需要通过设置环境变量OMP_NESTED=True或致电omp_set_nested来专门启用它,并且需要实施支持。

也就是说,你必须在性能方面非常小心。通常,OpenMP将使用每个内核1个线程,这对调度程序和硬件非常有用。嵌套的并行区域将导致超额预订(每个核心超过一个线程),因此在线程竞争核心时会导致性能问题。尤其是这样,因为许多任务可能会打开人并行的区域。

另请参阅this discussion关于嵌套循环中的嵌套并行区域。

+0

的问题只是澄清你描述的内容的影响。如果我在16核心机器上运行代码,并在for循环中使用'num_threads(2)'子句,这是否意味着8个并发任务每个都会运行2个线程?或者它会启动16个任务,每个线程2个,因此超额认购? –

+0

编辑(新评论超过5分钟):忽略此我刚刚重读您发布的讨论。 16^2个线程将可用。 –

+0

16 * 2,当然可以将外部平行区域限制为8以避免超额预订,但是您可能会遇到负载平衡问题。 – Zulan