之前的一篇文章给出了用OpenMP编程求PI的四种方法,算是OpenMP编程的初级实例,本文将继续探讨用OpenMP并行编程解决更多的问题。
关于求PI的实现方法可见我的前一篇博客:http://blog.csdn.net/u014768676/article/details/45065341
1.使用临界区,并行规约方式来实现两个向量点积的运算
首先是临界区的方法:
#include
#include
int main(){
int i,n;
float a[100],b[100],result;
//some initializations
n=100;
result=0.0;
for(i=0;i
这里很简单的给两个数组设置了初始值,也可以用随机数发生器来产生两个数组。
或者采用并行规约的方式:
#include
#include
//reduction
int main(){
int i,n,chunk;
float a[100],b[100],result;
//some initializations
n=100;
chunk=10;
result=0.0;
for(i=0;i
可以在两段代码里加入计时函数,然后比较两种方法的性能。
2.矩阵乘法
同样是简单赋值初始化两个N×N的矩阵,OpenMP实现如下:
#include
#include
#define N 10
#define n 2
int main()
{
int a[N][N];
int b[N][N];
int c[N][N];
int i,j,k;
//some initializations
for(i=0;i
这里是采用打印的方式查看结果,可同样加入计时函数,分析加速比,分析时间与线程数的关系。
3.用OpenMP实现快速排序算法
回顾一下快排的串行算法,主要是以下一个分治的过程:
QUICKSORT(A,p,r)
if p
快排的关键是PATITION过程,它对子数组A[p..r]进行就地重排:
PARTITION(A,p,r)
x=A[r]
i=p-1
for j=p to r-1
do if A[j]<=x
then i=i+1
exchange A[i] and A[j]
exchange A[i+1] and A[r]
return i+1
基于这样的串行算法,我们可以给出快排的OpenMP实现:
#include
#include
#include
#include
#define NUM_THREADS 2
int Partition(int *data,int p,int r)
{
int x,i,j,tmp;
//即A[r]
x=data[r];
i=p-1;
for(j=p;j
4.总结
本文以向量点积运算、矩阵乘法和快速排序为例,进一步对OpenMP编程进行了实战,可以发现,OpenMP编程还是较容易上手和掌握的。