gpt4 book ai didi

c++ - "omp single"和 "omp task"如何提供并行性?

转载 作者:行者123 更新时间:2023-12-04 14:43:53 27 4
gpt4 key购买 nike

我对 omp single 感到困惑和 omp task指令。我已经阅读了几个使用它们的例子。以下示例显示如何使用任务构造来处理链表的元素。

1  #pragma omp parallel
2 {
3 #pragma omp single
4 {
5 for(node* p = head; p; p = p->next)
6 {
7 #pragma omp task
8 process(p);
9 }
10 }
11 }
我没能理解这个例子中的并行性。与 omp single ,只有一个线程会执行与单个构造相关的结构化块,对吗?在这个例子中,第 4-10 行是与单个构造相关的结构化块,它只能执行一次,那么为什么我们可以使用 omp task在这个结构块里面?它如何以并行方式工作?

最佳答案

除了其他答案之外,让我更深入地了解执行过程中会发生什么。

1  #pragma omp parallel
2 {
3 #pragma omp single
4 {
5 for(node* p = head; p; p = p->next)
6 {
7 #pragma omp task
8 process(p);
9 }
10 } // barrier of single construct
11 }
在代码中,我在 single的末尾标注了一个barrier构造。
发生的事情是这样的:
一、遇到 parallel时构造,主线程产生并行区域并创建一堆工作线程。然后你有 n 个线程运行并执行并行区域。
二、 single构造选择 n 个线程中的任何一个并执行 single 的花括号内的代码构造。所有其他的 n-1 个线程将进入第 10 行的屏障。在那里,它们将等待最后一个线程 catch 并完成屏障同步。当这些线程在那里等待时,它们不仅在浪费时间,而且还在等待工作的到来。
三、被 single拾取的线程构造(“生产者”)执行 for循环,每次迭代都会创建一个新任务。然后将该任务放入任务池中,以便另一个线程(屏障中的一个线程)可以拾取并执行它。生产者创建任务完成后,将加入屏障,如果任务池中还有任务等待执行,它将帮助其他线程执行任务。
第四,一旦所有任务都以这种方式生成和执行,所有线程都完成了,屏障同步也完成了。
我在这里和那里做了一些简化,因为 OpenMP 实现如何执行任务有更多方面,但从概念的角度来看,以上是您可以想到的正在发生的事情,直到您准备好深入研究具体OpenMP API 中任务调度的各个方面。

关于c++ - "omp single"和 "omp task"如何提供并行性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68502197/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com