2013-10-07 30 views
5

我已經用「pragma omp for」循環使用了OpenMP,現在想試試OpenMP任務。 但是,一個簡單的程序,它應該運行2個任務並行似乎並沒有工作。 我誤解了任務的使用或錯誤嗎?gcc openmp任務不起作用

#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; 
      } 
     } 

    } 
} 
} 

輸出是: TASK1 TASK1 TASK1 .....

因此,第二個任務沒有運行。

回答

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; 
      } 
     } 
} 
} 
+0

我想到了一個OpenMP的任務始終是某種「重生」或「叉」,並且遇到了這個任務會繼續他的工作線程。但是我錯了。 – martin7743