课程论文LU分解的OpenMP实现Word文档下载推荐.docx

上传人:b****6 文档编号:18625635 上传时间:2022-12-29 格式:DOCX 页数:11 大小:131.08KB
下载 相关 举报
课程论文LU分解的OpenMP实现Word文档下载推荐.docx_第1页
第1页 / 共11页
课程论文LU分解的OpenMP实现Word文档下载推荐.docx_第2页
第2页 / 共11页
课程论文LU分解的OpenMP实现Word文档下载推荐.docx_第3页
第3页 / 共11页
课程论文LU分解的OpenMP实现Word文档下载推荐.docx_第4页
第4页 / 共11页
课程论文LU分解的OpenMP实现Word文档下载推荐.docx_第5页
第5页 / 共11页
点击查看更多>>
下载资源
资源描述

课程论文LU分解的OpenMP实现Word文档下载推荐.docx

《课程论文LU分解的OpenMP实现Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《课程论文LU分解的OpenMP实现Word文档下载推荐.docx(11页珍藏版)》请在冰豆网上搜索。

课程论文LU分解的OpenMP实现Word文档下载推荐.docx

KMP算法的OpenMP实现

编写KMP算法的OpenMP程序

3

高斯消元法解线性方程组的OpenMP实现

编写高斯消元法解线性方程组的OpenMP程序

4

高斯消元法解线性方程组的MPI实现

编写高斯消元法解线性方程组的MPI程序

5

高斯-塞德尔迭代解线性方程组的MPI实现

编写高斯-塞德尔迭代解线性方程组的MPI程序

6

Cannon乘法的MPI实现

编写Cannon乘法的MPI程序

7

LU分解的MPI实现

编写LU分解的MPI程序

8

随机串匹配算法的MPI实现

编写随机串匹配算法的MPI程序

9

单源最短路径Dijkstra算法的MPI实现

编写单源最短路径Dijkstra算法的MPI程序

10

快速排序算法的MPI实现

编写快速排序算法的MPI程序

11

KMP串匹配的MPI实现

编写KMP串匹配算法的MPI程序

 

一、实验课程名称:

并行算法实践

二、实验项目名称:

三、实验目的:

理解多核程序的设计思想,学习使用OpenMP编写并行程序。

四、必修或选修:

选修

五、实验平台:

硬件平台:

龙芯3A教学仪器

软件平台:

DebianGNU/Linux2.6.27无盘系统,GCC4.3编译环境

六、实验原理:

(阐述基本原理,也包括对算法改进和优化方法)

对于一个n阶非奇异方阵A=[aij],对A进行LU分解是求一个主对角元素全为1的下三角方阵L=[lij]与上三角方阵U=[uij],使A=LU。

例如对于一个3×

3的矩阵,就有

设A的各阶主子行列式皆非零,U和L的元素可由下面的递推式求出:

aij

(1)=aij

aij(k+1)=aij(k)-likukj

在计算过程中,首先计算出U的第一行元素,然后算出L的第一列元素,修改相应A的元素;

再算出U的第二行,L的第二列…,直至算出unn为止。

若一次乘法和加法运算或一次除法运算时间为一个单位时间,则下述LU分解的串行算法时间复杂度为

=O(n3)。

单处理器上矩阵LU分解串行算法

输入:

矩阵An×

n

输出:

下三角矩阵Ln×

n,上三角矩阵Un×

Begin

(1)fork=1tondo

(1.1)fori=k+1tondo

a[i,k]=a[i,k]/a[k,k]

endfor

(1.2)fori=k+1tondo

forj=k+1tondo

a[i,j]=a[i,j]-a[i,k]*a[k,j]

endfor

(2)fori=1tondo

(2.1)forj=1tondo

if(j<

i)then

l[i,j]=a[i,j]

else

u[i,j]=a[i,j]

endif

endfor

(2.2)l[i,i]=1

End

LU分解的OpenMP并行算法主要是用pragmaompfor制导语句对非数据相关且非操作相关的for循环语句并行化。

多核处理器上矩阵LU分解OpenMP并行算法

#pragmaompparallelshared(A)private(tid,i,j,k)

#pragmaompfor

#pragmaompfor

七、实验内容及步骤:

1.编写程序源代码:

lu.c

#include<

stdio.h>

stdlib.h>

math.h>

sys/time.h>

omp.h>

#defineMaxN1010

#defineinfile"

LU.in"

#defineoutfile"

LU.out"

#defineNUM_OF_THREADS2

FILE*fin,*fout;

//fin为输入文件fout为输出文件

doubleA[MaxN][MaxN];

//A为原矩阵

doubleL[MaxN][MaxN],U[MaxN][MaxN];

//L和U为分解后的矩阵

intn;

//n为矩阵行数

intnthreads,tid;

intcreatefile()//创建A矩阵数据文件

{

inti=0,j=0;

n=1000;

srand((unsigned)time(NULL));

FILE*f;

f=fopen(infile,"

w"

);

fprintf(f,"

%d"

n);

for(i=0;

i<

n;

i++)

{

for(j=0;

j<

j++)

rand()%1000);

%c"

'

\n'

}

fclose(f);

printf("

Finished!

\n"

return0;

}

intinit()//初始化,读取A矩阵数据文件

inti,j;

fscanf(fin,"

%d"

&

n);

for(i=0;

i<

i++)

for(j=0;

j<

j++)

%lf"

A[i][j]);

omp_set_num_threads(NUM_OF_THREADS);

//设置OpenMP线程数量

L[i][j]=0;

U[i][j]=0;

i++)L[i][i]=1;

intfactorize()

inti,j,k;

for(k=0;

k<

k++)

#pragmaompfor//for循环并行制导语句

for(i=k+1;

A[i][k]=A[i][k]/A[k][k];

for(j=k+1;

A[i][j]=A[i][j]-A[i][k]*A[k][j];

if(i<

=j)U[i][j]=A[i][j];

elseL[i][j]=A[i][j];

intoutput()

//输出L矩阵

fprintf(fout,"

MatrixL:

%.10lf%c"

L[i][j],(j==n-1)?

'

:

'

//输出U矩阵

MatrixU:

U[i][j],(j==n-1)?

intmain()

doublets,te;

while((fin=fopen(infile,"

r"

))==NULL)//如果检测不到A矩阵数据文件,则调用createfile()函数,以随机数创建一个

createfile();

fout=fopen(outfile,"

//初始化

init();

//矩阵分解

ts=omp_get_wtime();

factorize();

te=omp_get_wtime();

time=%fs\n"

te-ts);

//输出LU分解所用时间

//输出结果

output();

fclose(fin);

fclose(fout);

2.下载并安装SecureCRT

(可在或自行上网搜索下载)

3.主机名192.168.150.218,用户名kd60,密码kd60

4.进入后,以ssh************.60.80登陆龙芯实验平台KD60,密码kd60。

5.编译命令gcclu.c–olu-fopenmp

6.运行命令./lu,即可得到实验结果。

八、实验数据及结果:

本实验对1000阶矩阵进行LU分解。

当把线程个数设置为4时,即#defineNUM_OF_THREADS4

运行时间为11.566771秒。

当把线程个数设置为2时,即#defineNUM_OF_THREADS2

运行时间为22.170146秒。

当把线程个数设置为1时,即#defineNUM_OF_THREADS1

程序实际上变成串行程序,运行时间为45.148058秒。

当把线程个数设置为8时,即#defineNUM_OF_THREADS8

由于龙芯3A处理器只有4核,线程数量超过4时,实际上将不再完全是并行执行,反而会带来一定的线程切换开销。

运行时间竟长达194.894202秒。

根据以上实验数据,计算得加速比如下:

线程数

运行时间(s)

45.148058

22.170146

11.566771

194.894202

加速比

1x

2.03x

3.90x

0.23x

九、实验结论分析及总结:

1.实验结论分析:

由于龙芯3A实验平台采用四核的龙芯3A处理器,因此OpenMP线程数设置为4时,达到最大加速比,即3.90,非常接近4。

当线程数设置为2时,只用到一半的处理器核,也即2个,加速比为2..03,接近2。

当线程数设置为1时,程序退化为串行程序。

如果把线程数设置得比4更大,将反而使加速比下降,甚至运行时间比串行程序更大。

例如线程数为8时,运行时间长达194.9秒之外,远大于串行程序的45秒,主要原因为线程切换开销。

2.总结

对于OpenMP并行程序设计,只有当线程数量设置与处理器核数量相同时,才能获得最大的加速比。

小于或大于处理器核数量,都将使加速比下降。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 外语学习 > 法语学习

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1