Advertisement
patryk

19.10 - Laboratoria PR

Oct 19th, 2015
411
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.01 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <time.h>
  3. #include <conio.h>
  4. #include <omp.h>
  5.                
  6. long long num_steps = 1000000000;
  7. double step;
  8.  
  9. void rozwiazanie_z_tablica() {
  10.     clock_t start, stop;
  11.     double pi, sum;
  12.     int i;
  13.     step = 1./(double)num_steps;
  14.     start = clock();
  15.  
  16.     #pragma omp parallel
  17.     {
  18.         double x = 0;
  19.         volatile double tab[100];
  20.         int id = omp_get_thread_num();
  21.         #pragma omp for
  22.         for (i=0; i<num_steps; i++)
  23.         {
  24.             x = (i + .5)*step;
  25.             tab[id] += 4.0/(1.+ x*x);      
  26.         }
  27.         #pragma omp atomic
  28.             sum += tab[id];
  29.     }
  30.    
  31.     pi = sum*step;
  32.     stop = clock();
  33.  
  34.     printf("\nROZWIAZANIE ZE ZMIENNA LOKALNA: \n");
  35.     printf("Wartosc liczby PI wynosi %15.12f\n",pi);
  36.     printf("Czas przetwarzania wynosi %f sekund\n",((double)(stop - start)/1000.0));
  37.    
  38. }
  39.  
  40. void rozwiazanie_ze_zmienna_lokalna() {
  41.     clock_t start, stop;
  42.     double pi, sum=0.0;
  43.     int i;
  44.     step = 1./(double)num_steps;
  45.     start = clock();
  46.  
  47.     #pragma omp parallel
  48.     {
  49.         double x = 0, suml = 0.0;
  50.         #pragma omp for
  51.         for (i=0; i<num_steps; i++)
  52.         {
  53.             x = (i + .5)*step;
  54.             suml += 4.0/(1.+ x*x);     
  55.         }
  56.         #pragma omp atomic
  57.             sum += suml;
  58.     }
  59.    
  60.     pi = sum*step;
  61.     stop = clock();
  62.  
  63.     printf("\nROZWIAZANIE ZE ZMIENNA LOKALNA: \n");
  64.     printf("Wartosc liczby PI wynosi %15.12f\n",pi);
  65.     printf("Czas przetwarzania wynosi %f sekund\n",((double)(stop - start)/1000.0));
  66.    
  67. }
  68.  
  69. void rozwiazanie_z_redukcja() {
  70.     clock_t start, stop;
  71.     double pi, sum=0.0;
  72.     int i;
  73.     step = 1./(double)num_steps;
  74.     start = clock();
  75.  
  76.     #pragma omp parallel for reduction(+:sum)
  77.     for (i=0; i<num_steps; i++)
  78.     {
  79.         double x = 0;
  80.         x = (i + .5)*step;
  81.         sum = sum + 4.0/(1.+ x*x);
  82.     }
  83.    
  84.     pi = sum*step;
  85.     stop = clock();
  86.  
  87.     printf("\nROZWIAZANIE Z REDUKCJA: \n");
  88.     printf("Wartosc liczby PI wynosi %15.12f\n",pi);
  89.     printf("Czas przetwarzania wynosi %f sekund\n",((double)(stop - start)/1000.0));
  90.    
  91. }
  92.  
  93. void rozwiazanie_z_atomic() {
  94.     clock_t start, stop;
  95.     double pi, sum=0.0;
  96.     int i;
  97.     step = 1./(double)num_steps;
  98.     start = clock();
  99.  
  100.     #pragma omp parallel
  101.     {
  102.         double x = 0;
  103.         for (i=0; i<num_steps; i++)
  104.         {  
  105.             x = (i + .5)*step;
  106.         #pragma omp atomic
  107.             sum += sum + 4.0/(1.+ x*x);
  108.         }
  109.     }
  110.     pi = sum*step;
  111.     stop = clock();
  112.  
  113.     printf("\nROZWIAZANIE Z DYREKTYWA ATOMIC: \n");
  114.     printf("Wartosc liczby PI wynosi %15.12f\n",pi);
  115.     printf("Czas przetwarzania wynosi %f sekund\n",((double)(stop - start)/1000.0));   
  116. }
  117.  
  118. void rozwiazanie_sekwencyjne() {
  119.     clock_t start, stop;
  120.     double x=0, pi, sum=0.0;
  121.     int i;
  122.     step = 1./(double)num_steps;
  123.     start = clock();
  124.  
  125.     for (i=0; i<num_steps; i++)
  126.     {  
  127.         x = (i + .5)*step;
  128.         sum = sum + 4.0/(1.+ x*x);
  129.     }
  130.    
  131.     pi = sum*step;
  132.     stop = clock();
  133.  
  134.     printf("ROZWIAZANIE SEKWENCYJNE: \n");
  135.     printf("Wartosc liczby PI wynosi %15.12f\n",pi);
  136.     printf("Czas przetwarzania wynosi %f sekund\n",((double)(stop - start)/1000.0));   
  137. }
  138.  
  139. int main(int argc, char* argv[])
  140. {
  141.  
  142.     //rozwiazanie_sekwencyjne();
  143.     //rozwiazanie_z_atomic();
  144.     //rozwiazanie_z_redukcja();
  145.     //rozwiazanie_ze_zmienna_lokalna();
  146.     rozwiazanie_z_tablica;
  147.  
  148.     _getch();
  149.     return 0;
  150. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement