OpenMP编程实例(向量点积、矩阵乘法和快排)

之前的一篇文章给出了用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编程还是较容易上手和掌握的。



你可能感兴趣的:(并行算法,OpenMP,编程,实践)