根据openMP的并行计算实验

合集下载
相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

并行计算实验报告课程:并行计算

姓名:郑波

学号:2013211644

班级:计算机科学与技术13-2班

日期:2015年12月7日

实验一:OpenMP基本使用

一、实验目的

1、熟悉OpenMP编程。

2、比较串行算法与并行算法在执行时间上的差别;

3、考察线程数目使用不同对并行算法执行时间的影响;

4、考察运算规模N对串、并行算法执行时间上的影响。

二、实验内容

1、使用OpenMP进行两个矩阵A和B的加法,并分析串行、并行时间的差别以及问题规模对程序运行时间的影响

三、实验步骤

1、整个程序的设计流程

①全局变量设置三个宏定义过的size×size的二维数组啊a,b,c。

②初始化a数组为全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 10000

using namespace std;

int a[size][size],

b[size][size],

c[size][size];

int main()

{

for(int i=0;i!=size;++i) //initial the matrix

for(int j=0;j!=size;++j){

a[i][j]=1;

b[i][j]=2;

}

double start=omp_get_wtime();

omp_set_num_threads(4);

#pragma omp parallel for

for(int i=0;i

for(int j=0;j

c[i][j]=a[i][j]+b[i][j];

double end=omp_get_wtime();

cout<<"并行运行时间:"<

start=omp_get_wtime();

for(int i=0;i

for(int j=0;j

c[i][j]=a[i][j]+b[i][j];

end=omp_get_wtime();

cout<<"串行运行时间:"<

system("pause");

}

2、问题规模对串、并行程序时间的影响(A、B矩阵的大小为N*M)

(1)通过不断增加问题规模,观察串行和并行程序的执行时间,得到如下表格的时

(2)可以发现,当矩阵规模较小时,串行算法仍然要比并行算法运行的快,当规模到达一定程度的时候,并行运行的速度较串行有了提升。

并行算法对各个CPU的调度也占用一定的时间,当问题规模很小的时候,这个调度时间占了很大的比重,而在规模较大的时候,这个调度时间就显得微乎其微了

3、线程数目对并行程序的影响(这里假设问题规模为:N*M=10000*10000)

(1)在使用OpenMP进行并行执行矩阵加法时,我们可以自由设置进行并行计算的并行线程数目。

(2)在并行区域中,通过函数int omp_set_num_threads(int)设置并行区域中要创建的

也在相应的减少。但是,问题消耗的时间并不会随着线程数目的增加而不断的减少,原因可能是因为,随着线程数目的增减,线程的额外准备时间开销也将扩大。

四、心得体会

通过本次实验,了解了openMP库函数,掌握了openMP最基本的多线程程序编写。通过分析比较串并行运行时间,体会了不同规模下串并行的使用效果。

实验二:使用OpenMP实现圆周率计算的并行算法

一、实验目的

1、考察问题规模N对圆周率计算精确度的影响;

2、考察线程数目对圆周率计算执行时间的影响;

3、比较串、并行算法在执行时间上的差别。

二、实验内容

1、使用OpenMP和近似计算公式计算圆周率π的大小,并分析串行、并行时间的差别以及问题规模对程序运行时间的影响

三、实验步骤

1、整个程序的设计流程

①全局变量设置宏size,用来描述计算范围

②利用如下公式准备计算圆周率π的近似值

③通过omp_set_num_threads()库函数设置线程数

④调用openMP库函数omp_get_wtime()获取当前时间start

#pragma omp parallel for reduction(+:sum)

开始做并行区部分

注意:

其中sum是共享的,因为是个连续和的问题,采用reduction之后,每个线程

根据reduction(+: sum)的声明算出自己的sum,然后再将每个线程的sum

加起来。避免各个线程共享sum资源时出现问题

结束后再次调用omp_get_wtime()获取时间end,end-start即为并行消耗时间

⑤再次调用时间函数更新strat

串行做一边矩阵相加

更新end,end-start即为串行耗时

代码如下:

#include

#include

#define size10000000

using namespace std;

int main()

{

double sum=0,start,end;

omp_set_num_threads(4);

相关文档
最新文档