ImageVerifierCode 换一换
格式:DOCX , 页数:15 ,大小:113.33KB ,
资源ID:2931449      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bingdoc.com/d-2931449.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(基于openMP的并行计算实验.docx)为本站会员(b****1)主动上传,冰点文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰点文库(发送邮件至service@bingdoc.com或直接QQ联系客服),我们立即给予删除!

基于openMP的并行计算实验.docx

1、基于openMP的并行计算实验并行计算实验报告 课程:并行计算 * 学号:*44 班级:计算机科学与技术13-2班 日期:2015年12月7日实验一:OpenMP基本使用一、实验目的 1、熟悉OpenMP编程。 2、比较串行算法与并行算法在执行时间上的差别; 3、考察线程数目使用不同对并行算法执行时间的影响; 4、考察运算规模N对串、并行算法执行时间上的影响。二、实验内容 1、使用OpenMP进行两个矩阵A和B的加法,并分析串行、并行时间的差别以及问题规模对程序运行时间的影响三、实验步骤 1、整个程序的设计流程 全局变量设置三个宏定义过的sizesize的二维数组啊a,b,c。 初始化a数组为

2、全1,b数组为全2 通过omp_set_num_threads()库函数设置线程数 调用openMP库函数omp_get_wtime()获取当前时间start #pragma omp parallel for开始做并行区部分 结束后再次调用omp_get_wtime()获取时间end,end-start即为并行消耗时间 再次调用时间函数更新strat 串行做一边矩阵相加 更新end,end-start即为串行耗时 代码如下: #include#include#define size 10000using namespace std;int asizesize, bsizesize, csize

3、size;int main() for(int i=0;i!=size;+i) /initial the matrix for(int j=0;j!=size;+j) aij=1; bij=2; double start=omp_get_wtime(); omp_set_num_threads(4);#pragma omp parallel for for(int i=0;isize;+i) for(int j=0;jsize;+j) cij=aij+bij; double end=omp_get_wtime(); cout并行运行时间:end-startendl; start=omp_get

4、_wtime(); for(int i=0;isize;+i) for(int j=0;jsize;+j) cij=aij+bij; end=omp_get_wtime(); cout串行运行时间:end-startendl; system(pause); 2、问题规模对串、并行程序时间的影响(A、B矩阵的大小为N*M) (1)通过不断增加问题规模,观察串行和并行程序的执行时间,得到如下表格的时间消耗数据:100*1001000*100010000*10000串行消耗(ms)0.034.36296.91并行消耗(ms)7.069.54182.27 (2)可以发现,当矩阵规模较小时,串行算法仍然

5、要比并行算法运行的快,当规模到达一定程度的时候,并行运行的速度较串行有了提升。 并行算法对各个CPU的调度也占用一定的时间,当问题规模很小的时候,这个调度时间占了很大的比重,而在规模较大的时候,这个调度时间就显得微乎其微了 3、线程数目对并行程序的影响(这里假设问题规模为:N*M=10000*10000) (1)在使用OpenMP进行并行执行矩阵加法时,我们可以自由设置进行并行计算的并行线程数目。 (2)在并行区域中,通过函数int omp_set_num_threads(int)设置并行区域中要创建的线程数,分别设置为2、4、8、16,得到如下表格的时间消耗24816并行消耗(ms)262.

6、73205.12248.97295.38 (3)观察发现,在问题规模不变的前提下,随着线程数目的增加,问题解决的时间也在相应的减少。但是,问题消耗的时间并不会随着线程数目的增加而不断的减少,原因可能是因为,随着线程数目的增减,线程的额外准备时间开销也将扩大。四、心得体会 通过本次实验,了解了openMP库函数,掌握了openMP最基本的多线程程序编写。通过分析比较串并行运行时间,体会了不同规模下串并行的使用效果。实验二:使用OpenMP实现圆周率计算的并行算法一、实验目的1、考察问题规模N对圆周率计算精确度的影响;2、考察线程数目对圆周率计算执行时间的影响;3、比较串、并行算法在执行时间上的差

7、别。二、实验内容 1、使用OpenMP和近似计算公式计算圆周率的大小,并分析串行、并行时间的差别以及问题规模对程序运行时间的影响三、实验步骤 1、整个程序的设计流程 全局变量设置宏size,用来描述计算范围 利用如下公式准备计算圆周率的近似值 通过omp_set_num_threads()库函数设置线程数 调用openMP库函数omp_get_wtime()获取当前时间start #pragmaompparallelforreduction(+:sum)开始做并行区部分注意:其中sum是共享的,因为是个连续和的问题,采用reduction之后,每个线程根据reduction(+: sum)的声

8、明算出自己的sum,然后再将每个线程的sum加起来。避免各个线程共享sum资源时出现问题 结束后再次调用omp_get_wtime()获取时间end,end-start即为并行消耗时间 再次调用时间函数更新strat 串行做一边矩阵相加 更新end,end-start即为串行耗时 代码如下: #include #include #definesize10000000 usingnamespacestd; intmain() doublesum=0,start,end; omp_set_num_threads(4); start=omp_get_wtime(); #pragmaompparall

9、elforreduction(+:sum) for(inti=0;isize;+i) sum+=4/(1+(0.5+i)/size)*(0.5+i)/size)*1/size; end=omp_get_wtime(); cout并行时间:end-startendl; sum=0; start=omp_get_wtime(); for(inti=0;isize;+i) sum+=4/(1+(0.5+i)/size)*(0.5+i)/size)*1/size; end=omp_get_wtime(); cout串行时间:end-startendl; cout.precision(20); cout

10、:sumendl; system(pause); 2、问题规模对串、并行程序时间的影响(N的大小影响时间) (1)通过不断增加问题规模,观察串行和并行程序的执行时间,得到如下表格的时间消耗数据:100010000010000000串行消耗(ms)0.044.10365.70并行消耗(ms)4.6015.04188.48 (2)可以发现,当规模较小时,串行算法仍然要比并行算法运行的快,当规模到达一定程度的时候,并行运行的速度较串行有了提升。 并行算法对各个CPU的调度也占用一定的时间,当问题规模很小的时候,这个调度时间占了很大的比重,而在规模较大的时候,这个调度时间就显得微乎其微了 3、线程数目

11、对并行程序的影响(这里假设问题规模为:N=100000) (1)在使用OpenMP进行并行执行运算时,我们可以自由设置进行并行计算的并行线程数目。 (2)在并行区域中,通过函数int omp_set_num_threads(int)设置并行区域中要创建的线程数,分别设置为2、4、8、16,得到如下表格的时间消耗24816并行消耗(ms)3.263.233.1430.9 (3)观察发现,在问题规模不变的前提下,随着线程数目的增加,问题解决的时间也在相应的减少。但是,问题消耗的时间并不会随着线程数目的增加而不断的减少,原因可能是因为,随着线程数目的增减,线程的额外准备时间开销也将扩大。四、心得体会

12、 通过本次实验,进一步深入了openMP的编程,对openMP各线程共享资源、各自拥有自己的资源有了初步认识。再一次体会到了并行计算给大规模计算带来的便利性。实验三:使用OpenMP求最大值一、实验目的 1、掌握求最大值的并行算法 2、比较串行算法与并行算法在执行时间上的差别; 3、考察线程数目使用不同对并行算法执行时间的影响;二、实验内容 1、使用OpenMP求一个乱序数列的最大值,并分析串行、并行时间的差别以及问题规模对程序运行时间的影响三、实验步骤 1、整个程序的设计流程 本程序实现了平衡树算法,但由于处理器数目有限,并行结果反而不如串行,不过当处理器足够多时(理想情况为数组长度的一半)

13、时,并行会有大的提升。这里只讲一下平衡树算法思路。1全局变量设置numsize的二维数组,最后一维用来保存数列其中:num=log(size-1)/log(2)+1;表示平衡树的高度 初始化最后一维数组 通过omp_set_num_threads()库函数设置线程数 调用openMP库函数omp_get_wtime()获取当前时间start #pragma omp parallel for开始做并行区部分 结束后再次调用omp_get_wtime()获取时间end,end-start即为并行消耗时间 算法核心部分: 算法先处理最后一层平衡树(假设个数为n),两个数据一组比较,取大的,生成新的一

14、层平衡树(个数为n/2或者(n+1)/2),放在二维数组的上一维。迭代处理每一层,最后使得新的一层个数为1,这个值就是最大值,即a11; 并行处理每一层平衡树 代码如下: #include#include#includeconst int size=10000;using namespace std;int asize+1size+1;int main() int num=log(size-1)/log(2)+1; for(size_t i=1;i=size;+i) /初始化 anumi=i; int m=0; double start=omp_get_wtime(); for(size_t

15、i=1;i=m) m=anumi; double end=omp_get_wtime(); cout串行:end-start=0;k-)#pragma omp parallel for for(int j=1;jamax) akj=ak+1amax; else akj=ak+12*j-1ak+12*j?ak+12*j-1:ak+12*j; end=omp_get_wtime(); cout并行:end-startendl; system(pause); 2、问题规模对串、并行程序时间的影响(数列长度为N) (1)通过不断增加问题规模,观察串行和并行程序的执行时间,得到如下表格的时间消耗数据:N

16、100100010000串行消耗(ms)1.23e-61.35e-53.4e-5并行消耗(ms)0.00310.03600.047 (2)可以发现,并行总是比串行慢。 主要原因是:平衡树算法对处理器个数有很高的要求,在处理器个数达到问题规模的一半的时候才有最好的效果,本机只有4个线程,线程的调度反而使得整个时间消耗比串行多。 3、线程数目对并行程序的影响(这里假设问题规模为:N*M=10000*10000) (1)在使用OpenMP进行并行执行矩阵加法时,我们可以自由设置进行并行计算的并行线程数目。 (2)在并行区域中,通过函数int omp_set_num_threads(int)设置并行区

17、域中要创建的线程数,分别设置为2、4、8、16,得到如下表格的时间消耗24816并行消耗(ms)0.0060.0040.040.06 (3)观察发现,在问题规模不变的前提下,随着线程数目的增加,问题解决的时间也在相应的减少。但是,问题消耗的时间并不会随着线程数目的增加而不断的减少,原因可能是因为,随着线程数目的增减,线程的额外准备时间开销也将扩大。四、心得体会 通过本次实验,学会了平衡树的算法设计思想,见识到了高性能计算在庞大任务规模面前的解决问题的能力。在实验的过程中使用平衡树没有得到理想的结果,也说明了高性能计算在处理器方面的限制。实验四:使用OpenMP计算矩阵相乘一、实验目的 1、掌握

18、矩阵的乘法的串、并行算法 2、比较串行算法与并行算法在执行时间上的差别; 3、考察线程数目使用不同对并行算法执行时间的影响;二、实验内容 1、给定两个矩阵AN,M1和BM1,M的乘积,即求CN,M=AN,M1*BM1,M。三、实验步骤 1、整个程序的设计流程 计算矩阵的乘法,简单的使用三重循环完成,并行对最外层循环并行计算1全局变量设置3个数组:aM+1N+1,bN+1M+1,cM+1M+1 初始化三个数组 通过omp_set_num_threads()库函数设置线程数 调用openMP库函数omp_get_wtime()获取当前时间start #pragma omp parallel for

19、开始做并行区部分 结束后再次调用omp_get_wtime()获取时间end,end-start即为并行消耗时间 代码如下: #include #include #defineM500 #defineN500 usingnamespacestd; intaM+1N+1,bN+1M+1,cM+1M+1; intmain() /initarray for(inti=1;i=M;i+) for(intj=1;j=N;j+) aij=1; for(inti=1;i=N;i+) for(intj=1;j=M;j+) bij=2; /paralleldo omp_set_num_threads(4); d

20、oublestart=omp_get_wtime(); #pragmaompparallelfor for(inti=1;i=M;i+) for(intj=1;j=M;j+) for(intk=1;k=N;k+) cij+=aik*bkj; doubleend=omp_get_wtime(); cout并行:end-startendl; /serialdo start=omp_get_wtime(); for(inti=1;i=M;i+) for(intj=1;j=M;j+) for(intk=1;k=N;k+) cij+=aik*bkj; end=omp_get_wtime(); cout串

21、行:end-startendl; system(pause); 2、问题规模对串、并行程序时间的影响(二维数组为N*N) (1)通过不断增加问题规模,观察串行和并行程序的执行时间,得到如下表格的时间消耗数据:N10030010000串行消耗(ms)0.00720.1190.49并行消耗(ms)0.01980.1000.31(2)可以发现,当规模较小时,串行算法仍然要比并行算法运行的快,当规模到达一定程度的时候,并行运行的速度较串行有了提升。并行算法对各个CPU的调度也占用一定的时间,当问题规模很小的时候,这个调度时间占了很大的比重,而在规模较大的时候,这个调度时间就显得微乎其微了3、线程数目对

22、并行程序的影响(这里假设问题规模为:N*M=500*500) (1)在使用OpenMP进行并行执行矩阵加法时,我们可以自由设置进行并行计算的并行线程数目。 (2)在并行区域中,通过函数int omp_set_num_threads(int)设置并行区域中要创建的线程数,分别设置为2、4、8、16,得到如下表格的时间消耗24816并行消耗(ms)0.4180.2540.2520.352 (3)观察发现,在问题规模不变的前提下,随着线程数目的增加,问题解决的时间也在相应的减少。但是,问题消耗的时间并不会随着线程数目的增加而不断的减少,原因可能是因为,随着线程数目的增减,线程的额外准备时间开销也将扩大。四、心得体会 挺水的一次实验,不是因为实验水,而是感觉跟第一次实验没什么区别,线程只是利用线程数去减少了时间开销,而不是降低了问题的复杂度。主要是矩阵的乘法,自己没有用到好的算法。不过目前计算矩阵的乘法还没有找到O(n2)或者比O(n2)时间复杂度更小的算法吧

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2