double get_pi_omp(const int& N)
{
assert(N > 0);
double pi = 0;
double sigma = 1.0/N;
int i;
double x;
double sum = 0;
//#pragma omp parallel private(x) firstprivate(sum) num_threads(4)
// {
// #pragma omp for
// for (i = 0; i < N; ++i)
// {
// x = sigma*(i + 0.5);
// sum += sigma*4/(x*x + 1);
// //printf("threadid = %d, sum = %f\n", omp_get_thread_num(), sum);
// }
// #pragma omp critical
// {
// pi += sum;
// }
// }
omp_lock_t mylock;
omp_init_lock(&mylock);
#pragma omp parallel private(x) firstprivate(sum) num_threads(4)
{
#pragma omp for
for (i = 0; i < N; ++i)
{
x = sigma*(i + 0.5);
sum += sigma*4/(x*x + 1);
//printf("threadID = %d, sum = %f\n", omp_get_thread_num(), sum);
}
omp_set_lock(&mylock);
pi += sum;
omp_unset_lock(&mylock);
}
omp_destroy_lock(&mylock);
//#pragma omp parallel private(x) firstprivate(sum) num_threads(4)
// {
// #pragma omp for
// for (i = 0; i < N; ++i)
// {
// x = sigma*(i + 0.5);
// sum += sigma*4/(x*x + 1);
// //printf("threadID = %d, sum = %f\n", omp_get_thread_num(), sum);
// }
// #pragma omp atomic
// pi += sum;
// }
return pi;
} 在main函数中检测,设置0-1之间的分段数n = 120000000, 检测代码以及结果如图: