多核多线程技术OpenMP_实验报告2

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

实验二:OpenMP多线程编程

模块一:基础练习

3 编译执行,执行结果:

简答与思考:

1 写出关键的并行代码

(1)四个线程各自执行6次迭代。

#include"stdafx.h"

#include<omp.h>

int _tmain(int argc, _TCHAR* argv[])

{

printf("Hello World \n");

#pragma omp parallel

{

for(int i=0; i<6; i++)

{

printf("Iter:%d Thread%d\n ",i,omp_get_thread_num());

}

}

printf("GoodBye World\n");

return 0;

}

(2)四个线程协同完成6次迭代。

#include"stdafx.h"

#include<omp.h>

int _tmain(int argc, _TCHAR* argv[])

{

printf("Hello World \n");

#pragma omp parallel

{

#pragma omp for

for(int i=0; i<6; i++)

{

printf("Iter:%d Thread%d\n ",i,omp_get_thread_num());

}

}

printf("GoodBye World\n");

return 0;

}

2 附加练习:

(1)编译执行下面的代码,写出两种可能的执行结果。

int i=0,j = 0;

#pragma omp parallel for

for ( i= 2; i < 7; i++ )

for ( j= 3; j< 5; j++ )

printf(“i = %d, j = %d\n”, i, j);

可能的结果:

1种2种

i=2,j=3 i=2,j=3

i=2,j=4 i=2,j=4

i=3,j=3 i=3,j=3

i=3,j=4 i=3,j=4

i=6,j=3 i=5,j=3

i=6,j=4 i=5,j=4

i=4,j=3 i=5,j=3

i=4,j=4 i=5,j=4

i=5,j=3 i=6,j=3

i=5,j=4 i=6,j=4

(2)编译执行下面的代码,写出两种可能的执行结果。

int i=0,j = 0;

for ( i= 2; i < 7; i++ )

#pragma omp parallel for

for ( j= 3; j< 5; j++ )

printf(“i = %d, j = %d\n”, i, j);

可能的结果:

1种2种

i=2,j=3 i=2,j=3

i=2,j=4 i=2,j=4

i=3,j=3 i=3,j=4

i=3,j=4 i=3,j=3

i=4,j=3 i=4,j=3

i=4,j=4 i=4,j=4

i=5,j=3 i=5,j=4

i=5,j=4 i=5,j=3

i=6,j=3 i=6,j=3

i=6,j=4 i=6,j=4

(3)分析上述两段代码的不同并行效果。

1).代码,” #pragma omp parallel for”为并行区域只对外层循环起作用,因此外层循环 i 值出现的比较随机。而” #pragma omp parallel for”对内层的循环不起作用,执行方式仍然是串行方式,于是内层循环的出现还是固定的先3 后4。2).代码” #pragma omp parallel for”只对内层循环起作用,对外层循环不起作用,因此外层循环是串行方式执行的,内层循环是多个线程共同并发执行的。因此i值的出现是随机的,j值的出现是有序的。

3 实验总结。

对于嵌套循环的,并行的结果只与并行化作用的循环有关,在每一个并行执行线程的内部,程序是继续按照顺序执行的。

模块二:数值积分计算Pi值

3 编译执行,计算执行时间为:11.200000s

6 编译执行,计算执行时间为: 5.192000s

7 加速比(写出计算公式):11.200/5.192≈ 2.157

8 并行效率(写出计算公式): 2.157/4*(100%)≈54%

简答与思考:

1 如何进行并行化的?为什么?

for循环被多个线程协同执行,因此变量x 为多个线程的共享变量,需要被私有化;sum也是多个线程的共享变量,也需要被私有话,但是sum值由于功能和效率的需要,最终结果需要相加,因此用 reduction(+:sum),reduction会为每个线程创建一个私有的sum变量的副本,最终结果相加并且返回到sum。

关键代码:(黄色部分已标记)

// OpenMPPi.cpp : 定义控制台应用程序的入口点。

//

#include"stdafx.h"

#include<time.h>

#include<omp.h>

long long num_steps = 1000000000;

double step;

int main()

{

clock_t start, stop;

double x, pi, sum=0.0;

int i;

step = 1./(double)num_steps;

start = clock();

#pragma omp parallel for reduction(+:sum),private(x)

for (i=0; i<num_steps; i++)

{

x = (i + .5)*step;

sum += 4.0/(1.+ x*x);

}

相关文档
最新文档