gcc openmp任务不起作用

时间:2013-10-07 09:07:45

标签: gcc task openmp

我已经将" pragma omp用于"循环,现在想尝试OpenMP任务。 但是一个简单的程序,它应该并行运行2个任务似乎不起作用。 我是否误解了任务的使用或这里有什么问题?

#include<iostream>
#include<omp.h>

//ubuntu 12.04 LTS, gcc 4.6.3
//g++ test_omp.cpp -fopenmp

int main()
{
 #pragma omp parallel
 {
  #pragma omp single
  {

      #pragma omp task
      {
          while(true) 
          {
           usleep(1e6);
           #pragma omp critical (c_out)
            std::cout<<"task1"<<std::endl;
          }
      }

      #pragma omp task
      {
          while(true) 
          {
           usleep(1e6);
           #pragma omp critical (c_out)
            std::cout<<"task2"<<std::endl;
          }
      }

  }
 }
}

输出是: 任务1 任务1 任务1 .....

所以第二项任务没有运行。

1 个答案:

答案 0 :(得分:3)

来自OpenMP规范:

  

当线程遇到任务构造时,会生成一个任务   相关结构化块的代码。的数据环境   根据数据共享属性子句创建任务   任务构造,每数据环境ICV以及任何默认值   应用。

     

遇到的线程可能会立即执行任务,或   推迟执行。在后一种情况下,团队中的任何线程都可以   分配任务。使用任务可以保证任务的完成   同步结构。任务构造可以嵌套在   外部任务,但内部任务的任务区域不是其中的一部分   外部任务的任务区域。

(强调我的)

我读这个的方式:一个线程开始执行你的single部分。它到达task指令,此时它可以决定自己运行任务,还是将其交给另一个线程。当它决定自己运行任务时会发生问题 - 它永远不会返回。

我不太确定为什么你的例子中有task / single。您想要做的事情似乎是omp parallel sections的情况:

int main()
{
 #pragma omp parallel sections num_threads(2)
 {
      #pragma omp section
      {
          while(true)
          {
           usleep(3e5);
           #pragma omp critical (c_out)
            std::cout<<"task1"<<std::endl;
          }
      }
      #pragma omp section
      {
          while(true)
          {
           usleep(5e5);
           #pragma omp critical (c_out)
            std::cout<<"task2"<<std::endl;
          }
      }
 }
}