是否可以将多个线程分配给OpenMP(4.x)中的任务?每个任务有多个线程OpenMP
问题的概要我试图解决:
#pragma omp task
{
#pragma omp parallel for num_threads(2)
<for loop>
}
是否可以将多个线程分配给OpenMP(4.x)中的任务?每个任务有多个线程OpenMP
问题的概要我试图解决:
#pragma omp task
{
#pragma omp parallel for num_threads(2)
<for loop>
}
是的,你可以做到这一点与嵌套并行区域,正好与语法你描述。您需要通过设置环境变量OMP_NESTED=True
或致电omp_set_nested
来专门启用它,并且需要实施支持。
也就是说,你必须在性能方面非常小心。通常,OpenMP将使用每个内核1个线程,这对调度程序和硬件非常有用。嵌套的并行区域将导致超额预订(每个核心超过一个线程),因此在线程竞争核心时会导致性能问题。尤其是这样,因为许多任务可能会打开人并行的区域。
另请参阅this discussion关于嵌套循环中的嵌套并行区域。
的问题只是澄清你描述的内容的影响。如果我在16核心机器上运行代码,并在for循环中使用'num_threads(2)'子句,这是否意味着8个并发任务每个都会运行2个线程?或者它会启动16个任务,每个线程2个,因此超额认购? –
编辑(新评论超过5分钟):忽略此我刚刚重读您发布的讨论。 16^2个线程将可用。 –
16 * 2,当然可以将外部平行区域限制为8以避免超额预订,但是您可能会遇到负载平衡问题。 – Zulan
OpenMP会在您每次调用它时创建一名工作人员。除了做for循环之外,我不认为你可以用它产生一个自定义线程。也许尝试启动一个std ::线程来做你想做的事 – Bl4ckb0ne
@ Bl4ckb0ne这是非常不准确的。你也不应该混用'std :: thread'和OpenMP。 – Zulan
@Zulan这是真的,我从来没有想过这件事,但它是有道理的。我想我误解了OP – Bl4ckb0ne