首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >"omp单“和"omp任务”如何提供并行性?

"omp单“和"omp任务”如何提供并行性?
EN

Stack Overflow用户
提问于 2021-07-23 16:15:36
回答 3查看 1.6K关注 0票数 4

我对omp singleomp task指令感到困惑。我读过几个使用这两种方法的例子。下面的示例演示如何使用任务结构处理链接列表的元素。

代码语言:javascript
运行
复制
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呢?如何并行工作呢?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2021-07-23 17:32:04

在其他答案的基础上,让我更深入地研究执行过程中发生的事情。

代码语言:javascript
运行
复制
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结构末尾引入的一个屏障。

所发生的事情是:

首先,当遇到parallel构造时,主线程生成并行区域并创建一组工作线程。然后让n个线程运行并执行并行区域。

其次,single构造选择n个线程中的任何一个,并在single构造的大括号内执行代码。所有其他的n-1线程将继续到第10行中的屏障。在那里,它们将等待最后一个线程赶上并完成屏障同步。当这些线程在那里等待时,它们不仅在浪费时间,而且还在等待工作的到来。

第三,由single构造(“生产者”)选择的线程执行for循环,并为每次迭代创建一个新任务。然后将此任务放入任务池中,以便另一个线程(屏障中的线程之一)能够获取并执行它。一旦生产者完成了创建任务,它将加入障碍,如果任务池中还有等待执行的任务,它将帮助其他线程执行任务。

第四,一旦以这种方式生成和执行了所有任务,所有线程就都完成了,障碍同步也就完成了。

我在这里和那里简化了一些,因为OpenMP实现如何执行任务有更多的方面,但是从概念的角度来看,在您准备好在OpenMP API中深入研究任务调度的特定方面之前,您可以想到正在发生的事情。

票数 13
EN

Stack Overflow用户

发布于 2021-07-23 16:36:20

#pragma omp task在单个线程上调度一个任务,但它可以由其他线程执行。这是使用OpenMP任务的目的之一:提供并行性的线程不一定是并行执行计算的线程。

注意,任务在调度点执行。omp parallel部分的末尾是调度点。这就是为什么所有其他OpenMP线程都应该执行计划的任务(只要任务持续时间足够长)。

票数 2
EN

Stack Overflow用户

发布于 2021-07-23 16:52:01

因此,我们将一步一步地走:

当您编写语句#

  1. 并行时,一个并行区域将创建一个线程组。

然后,

  1. 编写了#语用omp单线程,然后一个线程创建这些任务,将它们添加到属于团队的队列中。

  1. 终于编写了#语用omp任务。执行此代码段的线程创建一个任务,该任务稍后将被执行,可能是通过不同的线程将它们添加到属于该团队的队列中,以及该团队中的所有线程(可能包括生成任务的线程)。任务执行的确切时间取决于任务调度程序,它对用户来说是不可见的。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68502197

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档