OpenMp编程
- 格式:doc
- 大小:1.71 MB
- 文档页数:12
H a r b i n I n s t i t u t e o f T e c h n o l o g y并行处理与体系结构实验报告实验题目: OpenMp编程院系:计算机科学与技术姓名:学号:实验日期: 2011-12-11哈尔滨工业大学实验二:OpenMP 编程一、实验目的1、熟悉OpenMP编程规范在多核程序设计中的使用;2、掌握OpenMP的基本功能、结构与句法;3、掌握采用OpenMP进行多线程编程和调试的基本方法;二、实验内容1、使用OpenMP编程规范进行程序的编写;2、对并行与串行程序进行比较;3、利用intel性能分析工具对程序进行分析三、实验原理1、引入线程的目的:在引入线程的操作系统中,通常都是把进程作为分配资源的基本单位,而把线程作为独立运行和独立调度的基本单位。
由于线程比进程更小,基本上不拥有系统资源,故对它的调度所付出的开销就会小得多,能更高效的提高系统内多个程序间并发执行的程度,从而显著提高系统资源的利用率和吞吐量。
具有一下优点:同一进程的线程切换时不会引起进程的切换;同属于一个进程的线程之间可以并发执行;线程共享所属进程的资源;线程切换只保存和设置少量的寄存器的内容;2、OpenMP是已被广泛接受的一种应用程序接口,用于共享内存并行系统的多线程程序设计的一套指导性注释(Compiler Directive)。
支持的编程语言:C语言、C++和Fortran,提供了对并行算法的高层的抽象描述,程序员通过在源代码中加入专用的pragma来指明自己的意图,由此编译器可以自动将程序进行并行化,并在必要之处加入同步互斥以及通信。
当选择忽略这些pragma,或者编译器不支持OpenMP时,程序又可退化为通常的程序(一般为串行),代码仍然可以正常运作,只是不能利用多线程来加速程序执行。
3、OpenMP提供的这种对于并行描述的高层抽象降低了并行编程的难度和复杂度,这样程序员可以把更多的精力投入到并行算法本身,而非其具体实现细节。
对基于数据分集的多线程程序设计,OpenMP是一个很好的选择。
同时,使用OpenMP也提供了更强的灵活性,可以较容易的适应不同的并行系统配置。
4、在windows下,使用Microsoft Visual Studio 2005以及更高版本来编译并行程序,配置方法为:在工程属性页面中:C/C++-->语言-->OpenMP支持-->是即可。
5、gcc编译器中直接使用-fopenmp即可四、实验步骤1.熟悉OpenMP常用编译制导语句的原理及使用方法,找到示例程序所在的目录,熟悉编译指令格式。
(1)打开示例程序中的hello1.c,代码如下,可以看出,程序加入了OpenMp的编译制导语句,在终端下对程序进行编译,输入命令gcc –fopenmp –o test hello1.c,就可以对程序进行编译。
#include "stdio.h"#include "omp.h"int main(int argc, char**argv){#pragma omp parallelprintf( "Hello world!\n" );return 0;}(2)打开实例程序下的sections.c,代码如下,此程序是利用sections将串行代码并行化,同样使用gcc –fopenmp –o test sections.c编译程序,运行结果如下图。
#include "stdio.h”#include "omp.h”int main(int argc, char *argv){#pragma omp parallel sections{#pragma omp sectionprintf("section 1 ThreadId = %d\n", omp_get_thread_num()); #pragma omp sectionprintf("section 2 ThreadId = %d\n", omp_get_thread_num());#pragma omp sectionprintf("section 3 ThreadId = %d\n", omp_get_thread_num());#pragma omp sectionprintf("section 4 ThreadId = %d\n", omp_get_thread_num());}return 0;}2.编译运行示例程序,会分析运行结果,并分别将三、四、五、六部分的至少一个示例程序的运行结果及分析体现在实验报告中(1)分别编译和运行parallel_for.c 和for.c ,运行结果如下:不难发现,第一段程序代码执行后,由两个线程完成了for 的操作,而第二段程序代码执行后,for 的所有操作均有一个线程完成,可以看出#pragma omp parallel for 和#pragma omp(2)分别编译和运行dynamic.c和guided.c,运行结果如下:不难发现,第一段程序代码执行后,由两个线程完成了for的操作,而第二段程序代码执行后,for的所有操作均有一个线程完成,可以看出#pragma omp parallel for和#pragma omp for的区别。
(3)分别编译和运行firstprivate.c和lastprivate.c,运行结果如下:不难发现,第一段程序代码执行后,K的值并没有改变,而第二段程序代码执行后,K 的值被改变,可以看出#pragma omp parallel for firstprivate(k)和#pragma omp parallel for firstprivate(k) lastprivate(k)的区别。
(4)编译和运行master.c,运行结果如下:从运行结果可以看出,使用了#pragma omp master制导语句后,所有的任务均由一个线程来运行。
<master.c>#include "stdio.h“int main(int argc, char* argv[]){int a[5], i;#pragma omp parallel{#pragma omp forfor(i = 0; i < 5; i++)a[i] = i * i;#pragma omp masterfor (i = 0; i < 5; i++)printf("a[%d] = %d\n", i, a[i]);#pragma omp barrier // Wait.#pragma omp forfor (i = 0; i < 5; i++)a[i] += i;}#pragma omp masterfor (i = 0; i < 5; i++)printf("a[%d] = %d threadnum=%d\n",i, a[i],omp_get_thread_num());return 0;}3.分别在windows和linux下运行示例程序BallV1.c和BallV2.c,比较运行结果并分析原因在linux环境下,分别编译BallV1.c和BallV2.c,并且运行程序如图,可以发现,BallV1.c 的运行时间消耗远远小于BallV2.c的时间消耗,而在Windows下,则相反,在这里,ballv2.c 是经过并行优化的,导致这种结果的原因是在linux下对并行调度开销比较大,因此才会出现4.远程连接服务器,用intel性能分析工具对示例程序BallV1.c和BallV2.c进行热点和cpu 空闲分析(1)将上一步实验中编译成功的两个文件test1和test2分别用intel性能分析工具进行分析,首先对程序热点进行分析,分别如下图,可以看出串行程序的热点比较集中,而并行程序的热点比较分散。
(2)将上一步实验中编译成功的两个文件test1和test2分别用intel性能分析工具对CPU 的占用率进行分析,分别如下图,可以看出串行程序对CPU的使用率是比较低的,而并行程序则更能充分的使用CPU。
(3)将上一步实验中编译成功的两个文件test1和test2分别用intel性能分析工具对程序并行性进行分析,分别如下图,由于当前使用了export OMP_NUM_THREADS=4将并行线程数设置为4,因此可以看出,并行后的程序有4个线程。
5.试使用OpenMP技术编写一多线程循环程序,说明程序的主要功能,分析OpenMP带来的性能变化。
下面为编写的一个多线程循环程序,在程序中,线程数设置为10,程序的作用为对1到1000000的数字进行累加,计算出和,程序采用了并行的方法,代码如下:<mypro.c>#include "stdio.h"#include "omp.h"static long num = 1000000;#define NUM_THREADS 10int main (){int i;double sum = 0.0;omp_set_num_threads(NUM_THREADS);#pragma omp parallel for reduction(+:sum)for (i=0;i<num; i++){sum = sum + i;}printf("SUM=%f\n",sum);return 0;}对程序进行编译,然后用intel性能分析工具进行分析,结果如下。
在将程序改为串行的,然后用intel性能分析工具进行分析,结果如下。
五、结论和问题多线程程序的确提高了计算机硬件资源的率用率,在对串行、并行程序利用intel性能分析工具进行分析时,明显的可以看出,串行程序的CPU的利用率是很低的,而并行程序对计算机的硬件资源有很高的利用率,但是,这些是离不开操作系统支持的,在linux下,由于系统底层的并行的一些开销比较大,往往并行程序不能发挥它的优势,而将这些程序放到windows下编译运行后会发现,程序的运行耗时明显低于同样的代码在Linux下的运行耗时,系统对并行程序的支持很好。
因此,我们在做并行程序时,一方面要考虑程序设计,而另一方面还要考虑程序运行的环境,这样才能最大限度的发挥并行程序的优势。