2015-11-11 9 views
5

So habe ich äußere parallele Region mit zwei inneren parallelen Regionen. Ist es möglich, 2 Fäden in äußere parallele und 4 Fäden in jede innere zu legen? Ich habe so etwas gemacht, aber es scheint nicht zu funktionieren, wie ich es will. Irgendwelche Vorschläge?Open Mp verschachtelte Parallelität

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

Ich schlage vor, Sie dies mit openmp auch markieren –

Antwort

2

Das in VS2012 funktioniert

Beispiel:

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

Ausgabe:

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

Es ist möglich, die Anzahl der Threads auf einer Schleife mit diesem zu setzen:

#pragma parallel for num_threads(variable) 

siehe auch diesen Beitrag openmp difference beetween num_threads vs. omp_set_num_threads vs OMP_NUM_THREADS

+0

Ja ich versuchte Anzahl von Threads zu inneren Bereichen so zu setzen, aber sie immer noch nur zwei Threads als Außenbereich erhalten. – Lobo

+0

Dies sollte funktionieren, um die Anzahl der Threads festzulegen, die auf for (...) nicht in einer Region arbeiten. –

+0

Auch wenn ich 4 Threads für Parellel-Schleifen verwende, gibt omp_get_num_threads() - mir die gleiche Antwort (dass nur zwei Threads in dieser Schleife arbeiten). Es scheint, dass es davon abhängt, wie viele Threads ich vor der äußeren Region gesetzt habe, aber selbst wenn ich 8 davon setze, arbeiten sie alle in inneren Regionen (und ich kann sie nicht teilen, um beide gleichzeitig zu bearbeiten) – Lobo