实例说明
一个简单的实例。使用梯形积分法来估计曲线下方所包围的面积。假设 f(x) 是一个合理的函数 a<b 且均为实数。
算法分析
我们可以将[a, b]划分为多个区间,在每一个子区间上使用梯形近似估计该区域的面积。假设每个子区间宽度为h,定义 h=(b-a)/n, xi=a+i*h, i = 0, 1, 2, ……, n,那么近似值为:
h[f(x0)/2 + f(x1) + … + f(xn-1) + f(xn)/2]
现在就是将其并行化,由于每个梯形的计算任务是无关的,因此我们可以将这些任务平均分配给线程们。我们将任务具体划分为两种:
- 单个梯形面积的计算。
- 梯形面积的求和。
在这里,我们假设梯形的数量远大于线程(核)的数量。通过给每个线程分配连续的梯形块来聚集任务,每个线程对它的子区间简单的采用串行梯形积分法。
由于最终需要将所有子结果累加起来,因此涉及到对一个共享变量的操作。引入:
# pragma omp critical
来表明该变量是一个共享资源,一次只能被一个线程更新。
代码展示
示例程序如下:
#include <stdio.h>
#include <stdlib.h>
#include <omp.h>
void Trap(double a, double b, int n, double*<