Bootstrap

(done) openMP学习 (Day10: Tasks 原语)

url: https://dazuozcy.github.io/posts/introdution-to-openmp-intel/#19-%E6%8A%80%E8%83%BD%E8%AE%AD%E7%BB%83%E9%93%BE%E8%A1%A8%E5%92%8Copenmp


本章节内容仅提供引入,关于 task 更详细的细节请看 openMP 手册或者源材料

Day9 介绍了一个优化链表遍历的粗糙方式,现在有一种更好的优化方式 (使用 Tasks),如下:

#pragma omp parallel
{
    #pragma omp single
    {
        node* p = head;
        while (p) {
        #pragma omp task firstprivate(p);
            process(p);
        p = p->next;
        }
    }
}

逐个解析:

  • #pragma omp single
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
  • #pragma omp task firstprivate(p)
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

总的来说,task 创建一个并行任务,可以并行运行。


重新看下面的代码

#pragma omp parallel
{
    #pragma omp single
    {
        node* p = head;
        while (p) {
        #pragma omp task firstprivate(p);
            process(p);
        p = p->next;
        }
    }
}

总的来说,首先使用 #pragma omp single 只让一个线程运行,这个线程会循环更新 p 值,随后每次使用新的 p 值创建一个新的线程来运行 process(p) 函数。

下面这张图能很好的辅助解释
在这里插入图片描述


;