Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //
- // main.cpp
- // monte_karlo_parallel
- //
- // Created by Глеб Суздалов on 09/10/2019.
- // Copyright © 2019 Gleb. All rights reserved.
- //
- #include <iostream>
- #include <cmath>
- #include <cstdlib>
- #include <ctime>
- #include <omp.h>
- #include <stdlib.h>
- using namespace std;
- int main() {
- for (int j = 1; j<9; j++){ //Цикл для того, чтобы посмотреть производительность
- omp_set_num_threads(j); //устанавливается число потоков
- unsigned int seed; //seed для случайных чисел rand_r
- double start, stop; //для измерения времени
- start = omp_get_wtime();
- int N = 0; //Число точек, попавших в сектор круга (рассматриваем 1/4 круга)
- int Nmax = 100000000; //Число всех точек (в площади квадрата)
- int a = 250; //сторона квадрата
- double R = (double)a/2; //радиус круга
- double x,y; //координаты
- #pragma omp parallel private(x,y,seed), reduction (+:N) //параллельная область
- {
- seed = omp_get_thread_num()+(int)time(NULL);
- #pragma omp for
- for (int i=0; i<Nmax; i++)
- {
- x = (double)(rand_r(&seed)%(a*100000))/100000;//случайная координата c 5 знаками после запятой
- y = (double)(rand_r(&seed)%(a*100000))/100000;
- if (sqrt(x*x+y*y)<=R){//проверка условия того, что точка в круге
- N+=1;
- }
- }
- }
- double pi = 16*(double)N/(double)Nmax;
- stop = omp_get_wtime();
- cout<<"Num of threads: "<<j<<endl<<"Time is "<<stop-start<<endl<<"Pi "<<pi<<endl<<" Delta "<<abs(pi-M_PI)<<endl;
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement