#include<stdio.h>
#include<stdlib.h>
#include<omp.h>
#include<math.h>
#define NUM_THREADS 10
const double a = 0.0;
const double b = 3.1415926;
int n = 100;
double h = (b - a) / n;
double trap(double a, double b, int num)
{
double y0 = sin(a);
double yn = sin(b);
int i;
double sum = (y0 + yn) / 2;
for (i = 1; i < num; i++) {
sum += sin(a + i * h);
}
double area = sum * h;
return area;
}
int main(int argc, char** argv) {
double local_a, local_b;
int num, id;
double integral=0;
double total_integral=0;
num = n / NUM_THREADS;
//使用private和critical
#pragma omp parallel num_threads(NUM_THREADS) private(integral)
{
id = omp_get_thread_num();
int sum = omp_get_num_threads();
local_a = a + num * (double)id * h;
local_b = local_a + num * h;
integral = trap(local_a, local_b, num);
#pragma omp critical
{
total_integral += integral;
}
}
printf("integral output is %lf", total_integral);
/*使用规约
#pragma omp parallel num_threads(NUM_THREADS) reduction(+:integral)
{
id = omp_get_thread_num();
int sum = omp_get_num_threads();
local_a = a + num * (double)id * h;
local_b = local_a + num * h;
integral = trap(local_a, local_b, num);
}
printf("integral output is %lf", integral);
*/
return 0;
}
OPENMP会遇到 数据依赖(一个数据的计算,需要用到另一个数据的运算结果)和循环依赖(后一次迭代中需要前一次迭代的数据)的问题,如果改变程序不能解决,那么就不能正确并行,所以openmp小恒徐相比MPI简单,但是都具有复杂依赖的问题,不能有效解决。