彭勇的个人博客分享 http://blog.sciencenet.cn/u/bigdataage Only Focus on Complex Systems Science & Data Science in Life Science.

博文

使用多核CPU,并行编程超简单。(OpenMP的Windows & Linux 例子)

已有 26377 次阅读 2013-3-19 16:43 |系统分类:科研笔记|关键词:学者| Linux, windows, 编程, OpenMP

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

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

       当然,还有一个更简单的方法就是使用Go语言。  



                                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%.


                                                   

                                                Linux  例子(GCC,C语言)

源代码和Windows中的 差不多,用GCC编译时加上 -fopenmp 就可以了.


未完待续。2013年6月1号以后继续纠结这个问题。没办法,又要写英文的期刊论文,又要写硕士毕业论文。    





参考:

http://www.openmp.org

http://hi.baidu.com/diwulechao/item/bc6d865c411b813c32e0a932

http://baike.baidu.com/view/3674653.htm

http://baike.baidu.com/view/1516611.htm



Go语言相关网站:

http://code.google.com/p/go/

http://go-lang.cat-v.org/

http://code.google.com/p/golang-china/

http://zh.golanger.com/

http://tieba.baidu.com/f?kw=go%D3%EF%D1%D4&fr=ala0

http://studygolang.com/





https://m.sciencenet.cn/blog-830496-671809.html

上一篇:什么时候能实现高通量测结构?
下一篇:两本复杂系统科学(complex systems science, CSSS)的好书

0

该博文允许注册用户评论 请点击登录 评论 (1 个评论)

数据加载中...
扫一扫,分享此博文

Archiver|手机版|科学网 ( 京ICP备07017567号-12 )

GMT+8, 2024-5-20 16:32

Powered by ScienceNet.cn

Copyright © 2007- 中国科学报社

返回顶部