Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- #include <iostream>
- #include <omp.h>
- #include <list>
- #include <math.h>
- using namespace std;
- //INTEGRAL DATA
- long step_count = 100000000;
- double a = 0;
- double b = 1;
- double dx = (b-a)/step_count;
- //MONTE CARLO DATA
- long point_count = 10000000;
- double function(double x){
- return 1/(1+(x*x));
- }
- struct Point{
- double a;
- double b;
- Point() { }
- Point(double a_, double b_) : a(a_), b(b_) { }
- };
- void zad1(){
- double normal_sum = 0;
- for (long i=0; i<step_count; i++){
- normal_sum += function(a+i*dx) * dx;
- }
- cout << "Integral PI resoult: " << 4 * normal_sum << endl;
- }
- void zad2(){
- double parallel_sum[128];
- for (int i=0; i < 128; i++){
- parallel_sum[i] = 0;
- }
- #pragma omp parallel
- {
- double sum = 0;
- for (long i=omp_get_thread_num(); i<step_count; i += omp_get_num_threads()){
- sum += function(a+i*dx) * dx;
- }
- parallel_sum[omp_get_thread_num()] = sum;
- }
- double sum = 0;
- for (int i=0; i < 128; i++){
- sum += parallel_sum[i];
- }
- cout << "Parallel integral PI resoult: " << 4 * sum << endl;
- }
- void zad3(){
- double parallel_sum = 0;
- #pragma omp parallel for reduction(+:parallel_sum)
- for (long i=0; i<step_count; i++){
- parallel_sum += function(a+i*dx) * dx;
- }
- cout << "For reduction integral PI resoult: " << 4 * parallel_sum << endl;
- }
- void zad4(){
- long insideCircle = 0;
- for (long i=0; i<point_count; i++){
- Point point = Point(((double) rand() / (RAND_MAX)), ((double) rand() / (RAND_MAX)));
- //środek okręgu S = (0,0), r = 1;
- // (a - Sx)^2 + (b- Sy)^2 < r^2
- if(pow(point.a,2.0) + pow(point.b,2.0) < 1){
- insideCircle ++;
- }
- }
- cout << "Monte Carlo PI resoult: " << double(4*insideCircle) / double(point_count) << endl;
- }
- void zad5(){
- int parallel_insideCircle[128];
- for (int i=0; i < 128; i++){
- parallel_insideCircle[i] = 0;
- }
- #pragma omp parallel
- {
- int insideCircle = 0;
- for (long i=0; i<point_count/omp_get_num_threads(); i++){
- Point point = Point(((double) rand() / (RAND_MAX)), ((double) rand() / (RAND_MAX)));
- if(pow(point.a,2.0) + pow(point.b,2.0) < 1){
- insideCircle ++;
- }
- }
- parallel_insideCircle[omp_get_thread_num()] = insideCircle;
- }
- int insideCircle = 0;
- for (int i=0; i < 128; i++){
- insideCircle += parallel_insideCircle[i];
- }
- cout << "Parallel Monte Carlo PI resoult: " << double(4*insideCircle) / double(point_count) << endl;
- }
- void zad6(){
- int parallel_insideCircle = 0;
- #pragma omp parallel for reduction(+:parallel_insideCircle)
- for (long i=0; i<point_count; i++){
- Point point = Point(((double) rand() / (RAND_MAX)), ((double) rand() / (RAND_MAX)));
- if(pow(point.a,2.0) + pow(point.b,2.0) < 1){
- parallel_insideCircle ++;
- }
- }
- cout << "For reduction Monte Carlo PI resoult: " << double(4*parallel_insideCircle) / double(point_count) << endl;
- }
- int main() {
- zad1();
- zad2();
- zad3();
- zad4();
- zad5();
- zad6();
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement