Omp 使用

使用多核CPU,并行编程超简单!

       OpenMP提供了对并行算法的高层的抽象描述,程序员通过在源代码中加入专用的pragma来指明自己的意图,由此编译器可以自动将程序进行并行化,并在必要之处加入同步互斥以及通信。但是,作为高层抽象,OpenMP并不适合需要复杂的线程间同步和互斥的场合。OpenMP的另一个缺点是不能在非共享内存系统(如计算机集群)上使用,在这样的系统上,MPI使用较多。


                                Windows  例子(Visual Studio,C语言)

      我用的是Windows系统(Win8)的双核台式机  ,  用C语言写源代码,以Visual Studio 2012为编译器。打开Visual Studio 2012,需要在建立工程后,点击 菜单栏->Project->Properties,弹出菜单里,点击 Configuration Properties->C/C++->Language->OpenMP Support,在下拉菜单里选择Yes。然后才能使用OpenMP。


下面以并行代码为例,只需要把相应的行注释掉,就是串行代码了!下同。

 

第一个例子(example_1.c):

增加一行代码#pragma omp parallel,然后用花括号把你需要放在并行区内的语句括起来,并行区就创建好了。

默认情况下,并行区内线程数=系统中核的个数。并行区里每个线程都会去执行并行区中的代码。故对于双核电脑,并行区中的代码会被执行2次,当然若有输出语句,结果也会被输出2次    。




运行example_1.c, 会发现 并行区里面的语句会被执行2次(我的电脑是2核的  ),  多次运行,会发现各次运行的结果会不一样,打印到屏幕上结果的顺序是不一定的,这个符合多线程程序的特性。 当然, 运行过程中也可以观察到CPU的使用率是100%.  

我运行了2次,结果不同,如下所示:






第二个例子(example_2.c):

example_1.c中并行区里每个线程执行的代码是一样的,计算机若有N个核,相当于同时重复执行了N次,并没有提高效率、节省时间。我们希望的是把同一工作分配给不同线程来做,每个线程完成一部分,这样运行速率才会快。        

#pragma omp for 
使用这个语句,就可以把一个for循环的工作量分配给不同线程。这个语句后面必须紧跟一个for循环,它只能对循环的工作量进行划分、分配。




可以把多行openmp pragma合并成一行,

#pragma omp parallel, #pragma omp for 合并成一行#pragma omp parallel for , 合并后的程序如下:



并行计算的运行用了16.415秒。

把第11行(#pragma omp parallel for)注释以后, 就成为了传统的串行计算,运行用了29.116秒。


双核运行的时间大约缩短为单核的二分之一,说明OpenMP还是很强大的。运行过程中也可以观察到CPU的使用率是100%.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值