【问题标题】:Task based programming : #pragma omp task versus #pragma omp parallel for基于任务的编程:#pragma omp task 与 #pragma omp parallel for
【发布时间】:2012-10-25 09:50:09
【问题描述】:

考虑:

    void saxpy_worksharing(float* x, float* y, float a, int N) {
      #pragma omp parallel for
      for (int i = 0; i < N; i++) {
         y[i] = y[i]+a*x[i];
      }
    }

    void saxpy_tasks(float* x, float* y, float a, int N) {
      #pragma omp parallel
      {
         for (int i = 0; i < N; i++) {
         #pragma omp task
         {
           y[i] = y[i]+a*x[i];
         }
      }
   }

使用任务和 omp 并行指令有什么区别?为什么我们可以用任务编写诸如归并排序之类的递归算法,但不能用工作共享?

【问题讨论】:

    标签: task openmp


    【解决方案1】:

    我建议您查看来自劳伦斯利弗莫尔国家实验室的 OpenMP 教程,地址为 here

    您的特定示例应该使用 OpenMP 任务实现。第二个代码创建了N 乘以线程任务的数量(因为在缺少的} 旁边的代码中有错误;我稍后会回来),每个任务只执行一个非常简单的计算。正如您在我对this question 的回答中所看到的那样,任务的开销将是巨大的。除了第二个代码在概念上是错误的。由于没有工作共享指令,所有线程将执行循环的所有迭代,而不是N 任务,N 倍线程任务将被创建。它应该以下列方式之一重写:

    单任务生产者 - 常见模式,NUMA 不友好:

    void saxpy_tasks(float* x, float* y, float a, int N) {
       #pragma omp parallel
       {
          #pragma omp single
          {
             for (int i = 0; i < N; i++)
                #pragma omp task
                {
                   y[i] = y[i]+a*x[i];
                }
          }
       }
    }
    

    single 指令将使循环仅在单个线程内运行。所有其他线程将跳过它并在 single 构造的末尾遇到隐式屏障。由于屏障包含隐式任务调度点,等待线程将在任务可用时立即开始处理。

    并行任务生成器 - 对 NUMA 更友好:

    void saxpy_tasks(float* x, float* y, float a, int N) {
       #pragma omp parallel
       {
          #pragma omp for
          for (int i = 0; i < N; i++)
             #pragma omp task
             {
                y[i] = y[i]+a*x[i];
             }
       }
    }
    

    在这种情况下,任务创建循环将在线程之间共享。

    如果您不知道 NUMA 是什么,请忽略有关 NUMA 友好性的 cmets。

    【讨论】:

    • +1,没看懂-1,你一定遇到过仇人。
    • 我也没有,但这就是现实世界所提供的——仇恨者、巨魔等:)
    • NUMA 友好版本和没有“task”编译指示的相同代码有什么区别?
    • @ManuelSelva,那时候,当我写这个特定的答案时,我仍然没有意识到单结构末尾的隐式屏障也是一个任务调度点。 nowait 的情况可以允许其余线程在任务生产者线程仍在生产任务时执行其他操作。
    • @zeawoas 在现代架构中的发展倾向于缩小本地和远程内存之间的差异,但一般来说,支持 NUMA 的代码运行得更快。
    猜你喜欢
    • 1970-01-01
    • 2021-03-22
    • 1970-01-01
    • 2021-06-08
    • 1970-01-01
    • 2022-12-07
    • 1970-01-01
    • 2022-01-15
    • 2021-11-23
    相关资源
    最近更新 更多