pborawski

omp sekcja critical

Nov 26th, 2012
71
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 1.50 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <time.h>
  4. #include <omp.h>
  5.  
  6. #define N 1000
  7.  
  8. int main(int argc, char **argv)
  9. {
  10.     double start, stop;
  11.  
  12.     int wektor[N];
  13.     long int i,suma_lokalna, suma = 0;
  14.     srand(time(NULL));
  15.  
  16.     // uzupelniania wektora losowymi elementami
  17.     for(i = 0; i < N; i++)
  18.     {
  19.         wektor[i] = rand()%15 + 3;
  20.     }
  21.  
  22.  
  23.     start = omp_get_wtime(); // pobieramy czas
  24.  
  25.  
  26.     // Tutaj definiujemy sobie zmienna suma_lokalna ktora musi byc wczesniej zadeklarowana i dodana do zmiennych prywatnych
  27.     // Bo kazdy rdzen musi miec wlasna kopie zmiennej suma_lokalna aby dodawac do niej elementy z wektora.
  28.     #pragma omp parallel default(none) private(i, suma_lokalna) shared(wektor, suma)
  29.     {
  30.         suma_lokalna = 0;
  31.         #pragma omp single
  32.         printf("Program wykonuje sie z %d watkami\n",omp_get_num_threads());
  33.             #pragma omp for
  34.             for(i = 0; i < N; i++)
  35.             {
  36.                 suma_lokalna += wektor[i];
  37.             }
  38.             // Dyrektywa critical natomiast stosowana jest po to aby na koniec obliczen kazdy rdzen dostal sie zmiennej suma
  39.             // a tam dodal swoja sume_lokalna. Pozwala to uniknac momentow gdy dwa rdzenie na raz potrzebuja dostepu do zmiennej.
  40.             #pragma omp critical
  41.             suma += suma_lokalna;
  42.     }
  43.  
  44.  
  45.     stop = omp_get_wtime();
  46.  
  47.     printf("Czas obliczen funkcja omp_get_wtime(): %lfs.\n", stop-start);
  48.  
  49.  
  50.  
  51.  
  52.  
  53.     printf(" Suma: %d\n", suma);
  54.  
  55.     return 0;
  56. }
Advertisement
Add Comment
Please, Sign In to add comment