2015-11-11 49 views
5

所以我有兩個內部平行區域的外部平行區域。是否可以將2個線程放入外部平行線並將4個線程放入每個內部線程?我做了這樣的事情,但它似乎不工作,我想如何。有什麼建議麼?打開Mp嵌套並行

start_r = omp_get_wtime(); 
omp_set_nested(1); 
omp_set_num_threads(2); 
#pragma omp parallel 
{ 
    printf("Thread %d executes the outer parallel region\n",omp_get_thread_num()); 
    omp_set_num_threads(4); 
    #pragma omp parellel for private(i,j,color)schedule(guided, chunk) default(shared) 
    { 

// Blur 
    for (int i = 1; i < x-1; i++) 
     for (int j = 1; j < y-1; j++) 
      for (int k = 0; k < 3; k++) 
      { 
       wynik = 0; 
       wynik = ((color[(i-1)][((j - 1))][k] + 
         color[(i-1)][j][k] + 
         color[(i-1)][(j + 1)][k] + 
         color[i][(j - 1)][k] + 
         color[i][j][k] + 
         color[i][(j + 1)][k] + 
         color[(i+1)][(j - 1)][k] + 
         color[(i+1)][j][k] + 
         color[(i+1)][(j + 1)][k])/9); 
       if (wynik>255)wynik = 255; 
       if (wynik<0)wynik = 0; 
       color2[i][j][k] = wynik; 
      } 
      stop_r = omp_get_wtime(); 
      cout << "Wyostrzenie zejelo : " << (stop_r-start_r) <<" sekund"<< endl; 
      cout<<omp_get_nested()<<endl; 
      cout<<"Ilość wątków dla rozmycia : "<<omp_get_num_threads()<<endl; 
      printf("Thread %d executes the inner parallel region\n",omp_get_thread_num()); 
     } 
     omp_set_num_threads(4); 
#pragma omp parellel for schedule(guided, chunk) privat(i,j,color) default(shared) 
{ 
// Sharp 
    for (int i = 1; i < x - 1; i++) 
     for (int j = 1; j < y - 1; j++) 
      for (int k = 0; k < 3; k++) 
      { 
       wynik = 0; 
       wynik = (color[(i-1)][(j - 1)][k] * (0) + 
         color[(i-1)][j][k] * (-1) + 
         color[(i-1)][(j + 1)][k] * (0) + 
         color[i][(j - 1)][k] * (-1) + 
         color[i][j][k] * 20 + 
         color[i][(j + 1)][k] * (-1) + 
         color[(i+1)][(j - 1)][k] * (0) + 
         color[(i+1)][j][k] * (-1) + 
         color[(i+1)][(j + 1)][k] * (0))/16; 
       wynik = wynik % 255; 
       color3[i][j][k] = wynik; 



      } 
      cout<<omp_get_nested()<<endl; 
      cout<<"Ilość wątków dla wyostrzenia : "<<omp_get_num_threads()<<endl; 
      printf("Thread %d executes the inner parallel region\n",omp_get_thread_num()); 
      } 
     } 
    for (int j = 0; j < y; j++) 
     for (int i = 0; i < x; i++)  
      { 
       fwrite(color2[i][j], 1, 3, fp2); 
       fwrite(color3[i][j], 1, 3, fp3); 

      } 



    fclose(fp); 
    fclose(fp2); 
    fclose(fp3); 

    system("PAUSE"); 
    return 0; 
} 
} 
+2

我建議你使用OpenMP也標記這個 –

回答

2

這個工作在VS2012

例如:

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

int main() 
{ 
    omp_set_nested(2); 

    #pragma omp parallel num_threads(2) 
    { 
     int threadID1 = omp_get_thread_num(); 

     #pragma omp parallel num_threads(4) 
     { 
      int threadID2 = omp_get_thread_num(); 

      #pragma omp critical 
      { 
       std::cout << "tID1: " << threadID1 << std::endl; 
       std::cout << "tID2: " << threadID2 << std::endl; 
       std::cout << std::endl; 
      } 
     } 
    } 

    return EXIT_SUCCESS; 
} 

輸出:

tID1: 0 
tID2: 0 

tID1: 0 
tID2: 2 

tID1: 0 
tID2: 1 

tID1: 0 
tID2: 3 

tID1: 1 
tID2: 0 

tID1: 1 
tID2: 1 

tID1: 1 
tID2: 2 

tID1: 1 
tID2: 3 
0

它可以設置這個循環的線程數:

#pragma parallel for num_threads(variable) 

也看到這個帖子openmp difference beetween num_threads vs. omp_set_num_threads vs OMP_NUM_THREADS

+0

是的,我試圖把線程這樣的內部區域的數量,但他們仍然可以只有兩個線程的外部區域。 – Lobo

+0

這應該可以用來設置工作在for(...)上的線程數不在一個區域上。 –

+0

即使我把4個線程放到parellel循環中,omp_get_num_threads()給了我相同的anserw(只有兩個線程在這個循環中工作)。這看起來取決於我在外部區域之前設置了多少個線程,但即使我設置了8個線程,他們都在內部區域工作(並且我不能將它們在同一時間劃分爲兩個線程) – Lobo