Advertisement
Guest User

Untitled

a guest
Nov 21st, 2017
136
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.15 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <iostream>
  5. #include <omp.h>
  6. #include <list>
  7. #include <math.h>
  8.  
  9. using namespace std;
  10.  
  11. //INTEGRAL DATA
  12. long step_count = 100000000;
  13. double a = 0;
  14. double b = 1;
  15. double dx = (b-a)/step_count;
  16.  
  17. //MONTE CARLO DATA
  18. long point_count = 10000000;
  19.  
  20. double function(double x){
  21.     return 1/(1+(x*x));
  22. }
  23.  
  24. struct Point{
  25.     double a;
  26.     double b;
  27.  
  28.     Point() { }
  29.     Point(double a_, double b_) : a(a_), b(b_) { }
  30. };
  31.  
  32. void zad1(){
  33.   double normal_sum = 0;
  34.   for (long i=0; i<step_count; i++){
  35.       normal_sum += function(a+i*dx) * dx;
  36.   }
  37.   cout << "Integral PI resoult: " << 4 * normal_sum << endl;
  38. }
  39.  
  40. void zad2(){
  41.   double parallel_sum[128];
  42.   for (int i=0; i < 128; i++){
  43.       parallel_sum[i] = 0;
  44.   }
  45.  
  46.   #pragma omp parallel
  47.   {
  48.       double sum = 0;
  49.       for (long i=omp_get_thread_num(); i<step_count; i += omp_get_num_threads()){
  50.           sum += function(a+i*dx) * dx;
  51.       }
  52.       parallel_sum[omp_get_thread_num()] = sum;
  53.   }
  54.  
  55.   double sum = 0;
  56.   for (int i=0; i < 128; i++){
  57.       sum += parallel_sum[i];
  58.   }
  59.   cout << "Parallel integral PI resoult: " << 4 * sum << endl;
  60. }
  61.  
  62. void zad3(){
  63.   double parallel_sum = 0;
  64.   #pragma omp parallel for reduction(+:parallel_sum)
  65.   for (long i=0; i<step_count; i++){
  66.       parallel_sum += function(a+i*dx) * dx;
  67.   }
  68.   cout << "For reduction integral PI resoult: " << 4 * parallel_sum << endl;
  69. }
  70.  
  71. void zad4(){
  72.   long insideCircle = 0;
  73.   for (long i=0; i<point_count; i++){
  74.       Point point = Point(((double) rand() / (RAND_MAX)), ((double) rand() / (RAND_MAX)));
  75.       //środek okręgu S = (0,0), r = 1;
  76.       // (a - Sx)^2 + (b- Sy)^2 < r^2
  77.       if(pow(point.a,2.0) + pow(point.b,2.0) < 1){
  78.         insideCircle ++;
  79.       }
  80.   }
  81.   cout << "Monte Carlo PI resoult: " << double(4*insideCircle) / double(point_count) << endl;
  82.  
  83. }
  84.  
  85. void zad5(){
  86.   int parallel_insideCircle[128];
  87.   for (int i=0; i < 128; i++){
  88.       parallel_insideCircle[i] = 0;
  89.   }
  90.  
  91.   #pragma omp parallel
  92.   {
  93.       int insideCircle = 0;
  94.       for (long i=0; i<point_count/omp_get_num_threads(); i++){
  95.           Point point = Point(((double) rand() / (RAND_MAX)), ((double) rand() / (RAND_MAX)));
  96.           if(pow(point.a,2.0) + pow(point.b,2.0) < 1){
  97.             insideCircle ++;
  98.           }
  99.       }
  100.       parallel_insideCircle[omp_get_thread_num()] = insideCircle;
  101.   }
  102.  
  103.   int insideCircle = 0;
  104.   for (int i=0; i < 128; i++){
  105.       insideCircle += parallel_insideCircle[i];
  106.   }
  107.   cout << "Parallel Monte Carlo PI resoult: " << double(4*insideCircle) / double(point_count) << endl;
  108. }
  109.  
  110.  
  111. void zad6(){
  112.   int parallel_insideCircle = 0;
  113.  
  114.   #pragma omp parallel for reduction(+:parallel_insideCircle)
  115.   for (long i=0; i<point_count; i++){
  116.     Point point = Point(((double) rand() / (RAND_MAX)), ((double) rand() / (RAND_MAX)));
  117.     if(pow(point.a,2.0) + pow(point.b,2.0) < 1){
  118.       parallel_insideCircle ++;
  119.     }
  120.   }
  121.  
  122.   cout << "For reduction Monte Carlo PI resoult: " << double(4*parallel_insideCircle) / double(point_count) << endl;
  123. }
  124.  
  125. int main() {
  126.     zad1();
  127.     zad2();
  128.     zad3();
  129.     zad4();
  130.     zad5();
  131.     zad6();
  132. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement