2014-12-02 27 views
1

我花了一些時間在嵌套循環中使用openmp,但是,如果有2+內部循環,我無法使其工作。是否有可能在2+內部循環上使用openmp pragmas(無需用條件語句將其重寫回一個)?openmp中的兩個內部循環優化

for (i = 1; i <= n; i++) 
{ 
    for (w = 0; w <= in[i][W]; w++) 
    a[i][w] = a[i-1][w]; 

    for (w = in[i][W]+1; w <= wc; w++) 
    a[i][w] = max(a[i-1][w], in[i][V] + a[i-1][w-in[i][W]]); 
} 
+0

什麼是'V','W'和'in'? – 2014-12-05 21:28:12

+0

'V'和'W'都是常數; 'W = 0','V = 1',所以清晰的數組是'2(n + 1)'大小 – notnull 2014-12-06 15:54:08

回答

-1

你想達到什麼目的?你爲什麼想讓內環分裂?

是什麼讓你認爲它具有平行內循環的優點?

不管怎麼說,平行化他們的問題是什麼?

Live On Coliru

#include <omp.h> 

int main() 
{ 
    for (int i=0; i <100; ++i) 
    { 
     int m = 5000; 

#pragma omp parallel for 
     for (int j=0; j<m; ++j) 
     { 
     } 

#pragma omp parallel for 
     for (int j=m; j<2*m; ++j) 
     { 
     } 

    } 
} 

如果你只想做手工分塊,看一下:schedule clauses

如果你想在哪支球隊線程運行的明確控制哪些部分:

Live On Coliru

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

int main() 
{ 
    int id = 0; 
#pragma omp parallel 
    { 
     int m = 5000; 
     std::cout << "parallel section #" << ++id << "\n"; 

     { 
#pragma omp single 
      std::cout << "first single section\n"; 
      for (int j=0; j<m; ++j) 
      { 
      } 
     } 

     { 
#pragma omp single 
      std::cout << "second single section\n"; 
      for (int j=m; j<2*m; ++j) 
      { 
      } 
     } 

    } 
} 

輸出:

parallel section #1 
parallel section #2 
first single section 
parallel section #3 
parallel section #4 
second single section 
+0

問題出在數據依賴性(數組'a')。我剛剛更新了我的代碼... – notnull 2014-12-02 18:48:30