Advertisement
Guest User

Untitled

a guest
Nov 12th, 2018
86
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.37 KB | None | 0 0
  1. #include<iostream>
  2. #include<omp.h>
  3.  
  4. using namespace std;
  5.  
  6. //functie pentru varianta secventiala ce determina numarul de numere prime intre 1 si N
  7.  
  8. int getNumarPrime(long long N)
  9. {
  10.     int contor = 0;
  11.     for (long long i = 0; i < N; i++)
  12.     {
  13.         bool estePrim = true;
  14.         for (long long j = 2; j < i / 2; j++)
  15.         {
  16.             if (i%j == 0)
  17.             {
  18.                 estePrim = false;
  19.                 break;
  20.             }
  21.         }
  22.         if (estePrim)
  23.         {
  24.             contor++;
  25.         }
  26.     }
  27.     return contor;
  28. }
  29.  
  30. int getNumarPrimeParalel(long long N)
  31. {
  32.     int contor = 0;
  33.     //problema de race condition pe contor
  34. #pragma omp parallel num_threads(4) shared(contor)
  35.     {
  36.         int idThread = omp_get_thread_num();
  37.         int nrThreaduri = omp_get_num_threads();
  38.  
  39.         long long limitaSuperioara = (idThread + 1) / nrThreaduri * N;
  40.         long long limitaInferioara = idThread / nrThreaduri * N;
  41.  
  42.         for (long long i = limitaInferioara; i < limitaSuperioara; i++)
  43.         {
  44.             bool estePrim = true;
  45.             for (long long j = 2; j < i / 2; j++)
  46.             {
  47.                 if (i%j == 0)
  48.                 {
  49.                     estePrim = false;
  50.                     break;
  51.                 }
  52.             }
  53.             if (estePrim)
  54.             {
  55.                 contor++;
  56.             }
  57.         }
  58.     }
  59.     return contor;
  60. }
  61.  
  62.  
  63. //rezolva problema de race condition
  64. int getNumarPrimeParalel2(long long N)
  65. {
  66.     int contor = 0;
  67.     int contorLocal = 0;
  68.  
  69. #pragma omp parallel num_threads(4) shared(contor) private(contorLocal)
  70.     {
  71.         contorLocal = 0;
  72.  
  73.         int idThread = omp_get_thread_num();
  74.         int nrThreaduri = omp_get_num_threads();
  75.  
  76.         long long limitaSuperioara = (idThread + 1) / nrThreaduri * N;
  77.         long long limitaInferioara = idThread / nrThreaduri * N;
  78.  
  79.         for (long long i = limitaInferioara; i < limitaSuperioara; i++)
  80.         {
  81.             bool estePrim = true;
  82.             for (long long j = 2; j < i / 2; j++)
  83.             {
  84.                 if (i%j == 0)
  85.                 {
  86.                     estePrim = false;
  87.                     break;
  88.                 }
  89.             }
  90.             if (estePrim)
  91.             {
  92.                 contorLocal++;
  93.             }
  94.         }
  95. #pragma omp critical
  96.         contor += contorLocal;
  97.     }
  98.     return contor;
  99. }
  100.  
  101. //rezolva race condition si foloseste structura for
  102. int getNumarPrimeParalel3(long long N)
  103. {
  104.     int contor = 0;
  105.     int contorLocal = 0;
  106.  
  107. #pragma omp parallel num_threads(4) shared(contor) private(contorLocal)
  108.     {
  109.         contorLocal = 0;
  110.  
  111.         int idThread = omp_get_thread_num();
  112.         int nrThreaduri = omp_get_num_threads();
  113.  
  114. #pragma omp for
  115.         for (long long i = 0; i < N; i++)
  116.         {
  117.             bool estePrim = true;
  118.             for (long long j = 2; j < i / 2; j++)
  119.             {
  120.                 if (i%j == 0)
  121.                 {
  122.                     estePrim = false;
  123.                     break;
  124.                 }
  125.             }
  126.             if (estePrim)
  127.             {
  128.                 contorLocal++;
  129.             }
  130.         }
  131. #pragma omp critical
  132.         contor += contorLocal;
  133.     }
  134.     return contor;
  135. }
  136.  
  137. //rezolva race condition si foloseste structura for
  138. int getNumarPrimeParalel4(long long N)
  139. {
  140.     int contor = 0;
  141. /* \ poti sa pui pe mai multe randuri */
  142. #pragma omp parallel for num_threads(4) \
  143. reduction(+: contor)
  144.         for (long long i = 0; i < N; i++)
  145.         {
  146.             bool estePrim = true;
  147.             for (long long j = 2; j < i / 2; j++)
  148.             {
  149.                 if (i%j == 0)
  150.                 {
  151.                     estePrim = false;
  152.                     break;
  153.                 }
  154.             }
  155.             if (estePrim)
  156.             {
  157.                 contor++;
  158.             }
  159.         }
  160.  
  161.    
  162.     return contor;
  163. }
  164.  
  165. //functie ce demonstreaza sincronizare prin aplicarea unei bariere
  166. void testBariera(){
  167. #pragma omp parallel num_threads(4)
  168.     {
  169.         int idThread = omp_get_thread_num();
  170.         _sleep(idThread * 1000);
  171.         cout << endl << " Hello from " << idThread;
  172.  
  173. #pragma omp barrier
  174.  
  175.         cout << endl << idThread << " continua executia ";
  176.     }
  177.  
  178.     cout << endl << " Sfarsit prelucrari";
  179. }
  180.  
  181. static long long N = 2 * 1e5; //10^5
  182.  
  183. void main()
  184. {
  185.     /*
  186. #pragma omp parallel num_threads(8)
  187.     {
  188.         cout << endl << "Hello world";
  189.     }
  190.  
  191.     //Test varianta secventiala
  192.     double tStart = omp_get_wtime();
  193.     int nrPrime = getNumarPrime(N);
  194.     double tFinal = omp_get_wtime();
  195.  
  196.     cout << endl << "Numere prime: " << nrPrime << " in " << tFinal - tStart << " ms";
  197.  
  198.     //Test varianta paralela #1
  199.  
  200.     tStart = omp_get_wtime();
  201.     nrPrime = getNumarPrimeParalel(N);
  202.     tFinal = omp_get_wtime();
  203.  
  204.     cout << endl << "Numere prime: " << nrPrime << " in " << tFinal - tStart << " ms";
  205.  
  206.  
  207.     //Test varianta paralela #3
  208.  
  209.     tStart = omp_get_wtime();
  210.     nrPrime = getNumarPrimeParalel3(N);
  211.     tFinal = omp_get_wtime();
  212.  
  213.     cout << endl << "Numere prime: " << nrPrime << " in " << tFinal - tStart << " ms";
  214.  
  215.  
  216.     //Test varianta paralela #4
  217.  
  218.     tStart = omp_get_wtime();
  219.     nrPrime = getNumarPrimeParalel4(N);
  220.     tFinal = omp_get_wtime();
  221.  
  222.     cout << endl << "Numere prime: " << nrPrime << " in " << tFinal - tStart << " ms";
  223.     */
  224.     testBariera();
  225. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement