基于openMP的并行计算实验_第1页
基于openMP的并行计算实验_第2页
基于openMP的并行计算实验_第3页
基于openMP的并行计算实验_第4页
基于openMP的并行计算实验_第5页
已阅读5页,还剩4页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

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

2、s()库函数设置线程数调用openMP库函数omp_get_wtime()获取当前时间start#pragmaompparallelfor开始做并行区部分结束后再次调用omp_get_wtime()获取时间end,end-start即为并行消耗时间再次调用时间函数更新strat串行做一边矩阵相加更新end,end-start即为串行耗时代码如下:#include<iostream>#include<>#definesize10000usingnamespacestd;intasizesize,bsizesize,csizesize;intmain()for(inti=0

3、;i!=size;+i)/initialthematrixfor(intj=0;j!=size;+j)aij=1;bij=2;doublestart=omp_get_wtime();omp_set_num_threads(4);#pragmaompparallelforfor(inti=0;i<size;+i)for(intj=0;j<size;+j)cij=aij+bijdoubleend=omp_get_wtime();cout<<"并行运行时间:"<<end-start<<endl;start=omp_get_wtime

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

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

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

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

8、免各个线程共享sum资源时出现问题结束后再次调用omp_get_wtime()获取时间end,end-start即为并行消耗时间再次调用时间函数更新strat用行做一边矩阵相加更新end,end-start即为串行耗时代码如下:I#include<iostream>#include<>#define?size?using?namespace?std;int?main()double?sum=0,start,end;omp_set_num_threads(4);start=omp_get_wtime();#pragma?omp?parallel?for?reduction

9、(+:sum)for(int?i=0;i<size;+i)sum+=4/(1+(+i)/size)*(+i)/size)*1/size;end=omp_get_wtime();cout<<"并行时间:"<<end-start<<endl;sum=0;start=omp_get_wtime();for(int?i=0;i<size;+i)sum+=4/(1+(+i)/size)*(+i)/size)*1/size;end=omp_get_wtime();cout<<"串行时间:"<<e

10、nd-start<<endl;(20);cout<<"n:"<<sum<<endl;system("pause");2、问题规模对用、并行程序时间的影响(N的大小影响时间)(1)通过不断增加问题规模,观察串行和并行程序的执行时间,得到如下表格的时间消耗数据:1000100000串行消耗(ms)并行消耗(ms)(2)可以发现,当规模较小时,用行算法仍然要比并行算法运行的快,当规模到达一定程度的时候,并行运行的速度较申行有了提升。并行算法对各个CPU的调度也占用一定的时间,当问题规模很小的时候,这个调度时间占了

11、很大的比重,而在规模较大的时候,这个调度时间就显得微乎其微了3、线程数目对并行程序的影响(这里假设问题规模为:N=100000)(1)在使用OpenMP进行并行执行运算时,我们可以自由设置进行并行计算的并行线程数目。在并行区域中,通过函数intomp_set_num_threads(int)设置并行区域中要创建的线程数,分别设置为2、4、8、16,得到如下N格而时间7肖耗24816并行消耗(ms)(3)观察发现,在问题规模不变的前提下,随着线程数目的增加,问题解决的时间也在相应的减少。但是,问题消耗的时间并不会随着线程数目的增加而不断的减少,原因可能是因为,随着线程数目的增减,线程的额外准备时

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

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

14、(个数为n/2或者(n+1)/2),放在二维数组的上一维。迭代处理每一层,最后使得新的一层个数为1,这个值就是最大值,即a11;并行处理每一层平衡树代码如下:#include<iostream>#include<>#include<>constintsize=10000;usingnamespacestd;intasize+1size+1;intmain()intnum=log(size-1)/log(2)+1;for(size_ti=1;i<=size;+i)/初始化anumi=i;intm=0;doublestart=omp_get_wtime()

15、;for(size_ti=1;i<=size;+i)/串行if(anumi>=m)m=anumi;doubleend=omp_get_wtime();cout<<"串行:"<<end-start<<endl;intamax=size;omp_set_num_threads(4);start=omp_get_wtime();for(intk=num-1;k>=0;k-)#pragmaompparallelforfor(intj=1;j<=(amax-1)/2+1;j+)if(2*j>amax)akj=ak+1a

16、max;elseakj=ak+12*j-1>ak+12*j?ak+12*j-1:ak+12%;end=omp_get_wtime();cout<<"并行:"<<end-start<<endl;system("pause");2、问题规模对申、并行程序时间的影响(数列长度为N)通过不断增加问题规模,观察串行和并行程序的执行时间,得到如下表格的时间消耗数据:N100100010000串行消耗(ms)并行消耗(ms)(2)可以发现,并行总是比串行慢。主要原因是:平衡树算法对处理器个数有很高的要求,在处理器个数达到问题规

17、模的一半的时候才有最好的效果,本机只有4个线程,线程的调度反而使得整个时间消耗比用行多。3、线程数目对并行程序的影响(这里假设问题规模为:N*M=10000*10000)(1)在使用OpenMP进行并行执行矩阵加法时,我们可以自由设置进行并行计算的并行线程数目。在并行区域中,通过函数intomp_set_num_threads(int)设置并行区域中要创建的线程数,分别设置为2、4、8、16,得到如下N格而时间7肖耗24816并行消耗(ms)(3)观察发现,在问题规模不变的前提下,随着线程数目的增加,问题解决的时间也在相应的减少。但是,问题消耗的时间并不会随着线程数目的增加而不断的减少,原因可

18、能是因为,随着线程数目的增减,线程的额外准备时间开销也将扩大。四、心得体会通过本次实验,学会了平衡树的算法设计思想,见识到了高性能计算在庞大任务规模面前的解决问题的能力。在实验的过程中使用平衡树没有得到理想的结果,也说明了高性能计算在处理器方面的限制。实验四:使用OpenMP计算矩阵相乘一、实验目的1、掌握矩阵的乘法的申、并行算法2、比较串行算法与并行算法在执行时间上的差别;3、考察线程数目使用不同对并行算法执行时间的影响;二、实验内容1、给定两个矩阵AN,M1和BM1,M的乘积,即求CN,M=AN,M1*BM1,M。三、实验步骤1、整个程序的设计流程计算矩阵的乘法,简单的使用三重循环完成,并

19、行对最外层循环并行计算全局变量设置3个数组:aM+1N+1,bN+1M+1,cM+1M+1初始化三个数组通过omp_set_num_threads()库函数设置线程数调用openMP库函数omp_get_wtime()获取当前时间start#pragmaompparallelfor开始做并行区部分结束后再次调用omp_get_wtime()获取时间end,end-start即为并行消耗时间代码如下:#include<iostream>#include<>#define?M?500#define?N?500using?namespace?std;int?aM+1N+1,b

20、N+1M+1,cM+1M+1;int?main()/init?arrayfor(int?i=1;i<=Mi+)for(int?j=1;j<=N;j+)a皿=1;for(int?i=1;i<=N;i+)for(int?j=1;j<=Mj+)b皿=2;/parallel?doomp_set_num_threads(4);double?start=omp_get_wtime();#pragma?omp?parallel?forfor(int?i=1;i<=M|i+)for(int?j=1;j<=M|j+)for(int?k=1;k<=N|k+)cij+=aik*bkj;double?end=omp_get_wtime();cout<<"并行:"<<end-start<<endl;/serial?dostart=omp_get_wtime();for(int?i=1;i<=M|i+)for(int?j=1;j<=M|j+)for(int?k=1;k<=N|k+)cij+=aik*bkj;end=omp_get_wtime();cout<<"串行:"<

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论