课程论文LU分解的OpenMP实现Word文档下载推荐.docx
- 文档编号:18625635
- 上传时间:2022-12-29
- 格式:DOCX
- 页数:11
- 大小:131.08KB
课程论文LU分解的OpenMP实现Word文档下载推荐.docx
《课程论文LU分解的OpenMP实现Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《课程论文LU分解的OpenMP实现Word文档下载推荐.docx(11页珍藏版)》请在冰豆网上搜索。
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并行程序设计,只有当线程数量设置与处理器核数量相同时,才能获得最大的加速比。
小于或大于处理器核数量,都将使加速比下降。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 课程 论文 LU 分解 OpenMP 实现