Advertisement
Guest User

Untitled

a guest
Oct 14th, 2019
76
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.86 KB | None | 0 0
  1. //
  2. // main.cpp
  3. // monte_karlo_parallel
  4. //
  5. // Created by Глеб Суздалов on 09/10/2019.
  6. // Copyright © 2019 Gleb. All rights reserved.
  7. //
  8.  
  9. #include <iostream>
  10. #include <cmath>
  11. #include <cstdlib>
  12. #include <ctime>
  13. #include <omp.h>
  14. #include <stdlib.h>
  15.  
  16. using namespace std;
  17.  
  18. int main() {
  19. for (int j = 1; j<9; j++){ //Цикл для того, чтобы посмотреть производительность
  20. omp_set_num_threads(j); //устанавливается число потоков
  21. unsigned int seed; //seed для случайных чисел rand_r
  22. double start, stop; //для измерения времени
  23. start = omp_get_wtime();
  24. int N = 0; //Число точек, попавших в сектор круга (рассматриваем 1/4 круга)
  25. int Nmax = 100000000; //Число всех точек (в площади квадрата)
  26. int a = 250; //сторона квадрата
  27. double R = (double)a/2; //радиус круга
  28. double x,y; //координаты
  29. #pragma omp parallel private(x,y,seed), reduction (+:N) //параллельная область
  30. {
  31. seed = omp_get_thread_num()+(int)time(NULL);
  32. #pragma omp for
  33. for (int i=0; i<Nmax; i++)
  34. {
  35. x = (double)(rand_r(&seed)%(a*100000))/100000;//случайная координата c 5 знаками после запятой
  36. y = (double)(rand_r(&seed)%(a*100000))/100000;
  37. if (sqrt(x*x+y*y)<=R){//проверка условия того, что точка в круге
  38. N+=1;
  39. }
  40. }
  41. }
  42. double pi = 16*(double)N/(double)Nmax;
  43. stop = omp_get_wtime();
  44. cout<<"Num of threads: "<<j<<endl<<"Time is "<<stop-start<<endl<<"Pi "<<pi<<endl<<" Delta "<<abs(pi-M_PI)<<endl;
  45. }
  46. return 0;
  47. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement