2014-02-19 173 views
1

我想在另一個for循環中並行化for循環。我可以直接在內部循環中使用「#pragma omp parallel for」指令,但是我擔心每次創建一組新線程並不是最佳選擇。在外部循環(在內部循環之前)有分配和一些其他指令由單個線程完成(我分配一個矩陣在內部循環中共享,所以每個線程都應該有權訪問它)。我試圖做這樣的事情:Openmp:嵌套循環和分配

 #pragma omp parallel 
     { 
     for (auto t=1;t<=time_step;++t){ 
     #pragma omp single { 
     Matrix<unsigned int> newField(rows,cols); 
     //some instructions 
     } 
     unsigned int j; 
     #pragma omp for 
     for (unsigned int i = 2;i<=rows-1;++i){ 

      for (j = 1;j<=cols;++j){ 
          //Work on NewField (i,j) 
      } 
     } 
     #pragma omp single { 
      //Instruction 
      } 
     } 
    } 

此代碼不起作用。這樣(如果我讓它工作)比每次創建線程更有效率?我做錯了什麼?

謝謝!

+0

爲什麼不只是平行外部循環t?如果你真的在每一步創建一個新的矩陣,那麼每個線程都會寫入矩陣的私有版本。 –

+0

你是什麼意思代碼不起作用?你有語法錯誤嗎? –

+0

我會使用'#pragma omp master'而不是'single'。這種方式線程不需要協商哪一個執行代碼。 –

回答

0

你現在編寫代碼的方式會導致語法錯誤。當您使用OpenMP指令(如單個或重要)時,大括號必須位於新行。

所以不是這個

#pragma omp single { 

} 

你需要這樣做

#pragma omp single 
{ 

} 
1

OpenMP的許多實現都保持線程池,而不是每一個並行區域之前,他們創造的。

所以,你可以去用

for (auto t=1;t<=time_step;++t){ 
    Matrix<unsigned int> newField(rows,cols); 
    //some instructions 
    unsigned int j; 
    #pragma omp parallel for 
    for (unsigned int i = 2;i<=rows-1;++i){ 
     for (j = 1;j<=cols;++j){ 
      //Work on NewField (i,j) 
     } 
    } 
    //Instruction 
} 

,它甚至可能是因爲沒有單指令的速度更快。