||
使用多核CPU,并行编程超简单!
OpenMP提供了对并行算法的高层的抽象描述,程序员通过在源代码中加入专用的pragma来指明自己的意图,由此编译器可以自动将程序进行并行化,并在必要之处加入同步互斥以及通信。但是,作为高层抽象,OpenMP并不适合需要复杂的线程间同步和互斥的场合。OpenMP的另一个缺点是不能在非共享内存系统(如计算机集群)上使用,在这样的系统上,MPI使用较多。
当然,还有一个更简单的方法就是使用Go语言。
我用的是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秒。
Linux 例子(GCC,C语言)
源代码和Windows中的 差不多,用GCC编译时加上 -fopenmp 就可以了.
未完待续。2013年6月1号以后继续纠结这个问题。没办法,又要写英文的期刊论文,又要写硕士毕业论文。
参考:
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/golang-china/
http://tieba.baidu.com/f?kw=go%D3%EF%D1%D4&fr=ala0
Archiver|手机版|科学网 ( 京ICP备07017567号-12 )
GMT+8, 2024-11-26 05:55
Powered by ScienceNet.cn
Copyright © 2007- 中国科学报社