win蒙特卡洛法并行求解Pi值代码c++并行
时间: 2024-01-25 19:20:51 浏览: 86
以下是使用OpenMP并行化的C++代码实现Monte Carlo方法求解Pi值:
```c++
#include <iostream>
#include <chrono>
#include <random>
#include <omp.h>
using namespace std;
int main() {
const long long n = 1000000000; // 投点次数
double x, y, pi;
long long i, count = 0;
unsigned int seed = chrono::system_clock::now().time_since_epoch().count();
mt19937 generator(seed);
uniform_real_distribution<double> distribution(0.0, 1.0);
double start_time = omp_get_wtime(); // 开始计时
#pragma omp parallel for private(x, y) reduction(+:count) // 并行化
for (i = 0; i < n; i++) {
x = distribution(generator);
y = distribution(generator);
if (x * x + y * y <= 1) {
count++;
}
}
pi = 4.0 * count / n;
double end_time = omp_get_wtime(); // 结束计时
cout << "pi = " << pi << endl;
cout << "time = " << end_time - start_time << "s" << endl;
return 0;
}
```
解释一下代码中的关键部分:
- `#pragma omp parallel for` 用于并行化for循环。
- `private(x, y)` 表示x和y是线程私有的,每个线程有自己的x和y变量。
- `reduction(+:count)` 用于对所有线程中的count变量求和,这是必须的,因为多个线程同时修改同一个变量会导致竞态条件。
阅读全文