OpenMP并行编程简易教程

上传人:壹****1 文档编号:552313910 上传时间:2023-12-03 格式:DOCX 页数:10 大小:22.72KB
返回 下载 相关 举报
OpenMP并行编程简易教程_第1页
第1页 / 共10页
OpenMP并行编程简易教程_第2页
第2页 / 共10页
OpenMP并行编程简易教程_第3页
第3页 / 共10页
OpenMP并行编程简易教程_第4页
第4页 / 共10页
OpenMP并行编程简易教程_第5页
第5页 / 共10页
点击查看更多>>
资源描述

《OpenMP并行编程简易教程》由会员分享,可在线阅读,更多相关《OpenMP并行编程简易教程(10页珍藏版)》请在金锄头文库上搜索。

1、OpenMP并行编程简易教程(一)近来在学校做实习,需要使用OpenMP来优化一些SAT问题的算法,便接触到了 OpenMP, 它是基于多处理器的,分享同一内存的,并行的编程模式。对于多核的CPU计算机,仅需要 通过增加简单的语句,便可以得到立竿见影的性能提升。本文教程由自己的学习笔记而来,通过4个例子简单的阐述OpenMP的基本编程语句。例子 1 helloworld.c01 # include02 int main( argc, argv)03 int argc;04 char *argv;05 06 #pragma omp parallel07 printf( Hello world!n

2、H);08 return 0;09程序helloworld.c的本质就是在屏幕上打印字符串Hello world!。pragma omp parallel是一条OpenMP标准的语句,它的含义是让它后面的语句按照多线 程来执行。需要注意的是每个线程都去做相同的爭情。rootlocalhost zf# gcc -fopenmp helloworld.crootlocalhost zf# ./a.outHello world!编译,执行程序。屏幕上打印出了一遍”Hello world。-fopenmp是gcc编译支持OpenMP程序的参数,gcc4.2以上的版本默认支持OpenMP。 由于系统环境

3、变屋中的NUM_OMP_THREADS的值默认为1,所以程序在执行的时候只使 用了一个线程来执行。rootlocalhost zf# NUM_OMP_THREADS=5rootlocalhost zf# export NUM_OMP_THREADSrootlocalhost zf# ./a.outHello world!Hello world!Hello world!Hello world!Hello world!给表示线程数屋的坏境变量NUM_OMP_THREADS赋值为5并导出,再执行程序,得到5 遍的”Hello world!,说明程序将打印语句用5个线程分别执行了一遍。当然,我们不希望

4、受到运行系统坏境变屋的限制,所以我们也可以通过替换06行代码为” #pragma omp parallel num_threads(10),编译之后再执行程序,我们得到10遍的Hello world!”,这时无论坏境变量NUM_OMP_THREADS的值为多少,我们依然只能得到10遍 的Hello world!”。例子 2 RankNum.c01 # include02 #include03 int main( int argc, char *argv)04 05 int rank, size;06 #pragma omp parallel private(rank)07 08 rank= o

5、mp_get_thread_num();09 size= omp_get_num_threads();10 printf( Hello world! Im %d of %dn, rank, size );11 12 return 0;13导入omp.h文件以支持OpenMP的函数。函数omp_get_threads_num()返回当前的线程标号。函数omp_get_num_threads()返回当前的线程数量。(不再程序中定义线程数,使用坏境变量中的数据,当前是10)rootlocalhost zf# gcc -fopenmp RankNum.crootlocalhost zf# ./a.ou

6、tHello world! Im 8 of 10Hello world! Im 0 of 10Hello world! Im 4 of 10Hello world! Im 6 of 10Hello world! Im 3 of 10Hello world! Im 2 of 10Hello world! Im 7 of 10Hello world! Im 1 of 10Hello world! Im 9 of 10Hello world! Im 5 of 10编译,执行,得到10条输出,10个线程分别执行了打印语句。 线程执行的顺序随机,与编号无关。未完待续OpenMP并行程序设计(一)Open

7、NIP是一个支持共享存储并行设计的库,特别适宜多核CPU上的并行程序设计。今天 在双核CPU机器上试了一下OpenNIP并行程序设计,发现效率方面超出想彖,因此写岀来 分享给人家。在VC8.0中项目的属性对话框中,左边框里的“配置属性”下的“C/C卄”下的“语言”页 里,将OpenMP支持改为“是/ (OpmMP)”就可以支持OpeiiMP 了。先看一个简单的使用了 OpeiiNIP程序 iiitaigc, chai* aigv) #pragnia omp parallel forfor (int i = 0; i 10; i+ )pnntffi = %dm”, i);return 0;这个程

8、序执行后打印出以卜结果:1 = 0i = 5 i= 1i = 6i = 2i=7i = 3i = 8i = 4i = 9可见foi循环语句中的内容被并行执行了。(每次运行的打印结果可能会有区别)这里要说明一下,pragma omp paiallel for这条语句是用来指定后面的for循坏语句变成并 行执行的,当然for循环里的内容必须满足可以并行执行,即每次循环互不相干,后一次循 环不依赖于前面的循环。有关#pragnia omp parallel for这条语句的具体含义及相关OpeiiNIP指令和函数的介绍暂时先 放一放,只要知道这条语句会将后面的for循环里的内容变成并行执行就行了。将

9、for循环里的语句变成并行执行后效率会不会提高呢,我想这是我们最关心的内容了。 下面就写一个简单的测试程序来测试一下:void test()iiit a = 0;clocktl = clock();for (int i = 0; i 100000000; i+)a = i+1;clockt2 = clockQ;prmtf(HTmie = %diT,t2-tl);iiit maiii(iiit aigc, chai* aigv)clocktl = clock();#pragnia omp parallel forfor(intj = 0;j2;j+ )test();clock_t t2 = cl

10、ock();piuitf(Total time = %dn, t2-tl);test();return 0;在test。函数中,执行了 1亿次循环,主要是用来执行一个长时间的操作。在niam ()函数里,先在一个循环里调用test。函数,只循环2次,我们还是看一下在双核 CPU上的运行结果吧:Time = 297Time = 297Total time = 297Time = 297可以看到在for循环里的两次test。函数调用都花费了 297ms,但是打印出的总时间却只花 费了 2971HS,后面那个单独执行的test()函数花费的时间也是297ms,可见使用并行计算后 效率提高了整整一倍。

11、OpenNIP并行程序设计(二)1、fork/j om并行执行模式的概念OpeiiNIP是一个编译器指令和库函数的集合,主要是为共享式存储计算机上的并行程序设计 使用的。前面一篇文章中已经试用了 OpeiiMP的一个Parallel for指令。从上篇文章中我们也可以发 现OpenMP并行执行的程序要全部结束后才能执行后面的非并行部分的代码。这就是标准 的并行模式forVjoui式并行模式,共享存储式并行程序就是使用forkjom式并行的。标准并行模式执行代码的基本思想是,程序开始时只有一个主线程,程序中的串行部分都由 主线程执行,并行的部分是通过派生其他线程来执行,但是如杲并行部分没有结束时

12、是不会 执行串行部分的,如上一篇文章中的以下代码:iiitargc, chai* argv)clock_t tl = clock(); #piagnia omp parallel forfbr(mtj = 0;j2;j+ )test();clockt2 = clock();prmtf(HTotal time =t2-tl);testy;return 0;在没有执行完for循坏中的代码之前,后面的clock.t t2 = clockQ;这行代码是不会执行的, 如果和调用线程创建函数相比,它相当于先创建线程,并等待线程执行完,所以这种并行模 式中在主线程里创建的线程并没有和主线程并行运行。2、Op

13、亡nMP指令和库函数介绍卜面来介绍OpeiiNIP的基本指令和常用指令的用法,在C/C+中,OpenMP指令使用的格式为# pragma omp指令子句子句前面提到的parallel for就是一条指令,有些书中也将OpeiiNIP的“指令”叫做“编译指导语 句”,后面的子句是可选的。例如:#piagnia omp parallel piivate(i, j)parallel就是指令,private是子句为叙述方便把包含pragma和OpeiiNIP指令的一行叫做语句,如上面那行叫parallel语句。OpeiiNIP的指令有以下一些:paiaUel,用在一个代码段之前,表示这段代码将被多个线

14、程并行执行for,用于for循坏之前,将循环分配到多个线程中并行执行,必须保证每次循坏之 间无相关性。paiallel for, parallel和for语句的结合,也是用在一个for循坏之前,表示fbr循 环的代码将被多个线程并行执行。sections,用在可能会被并行执行的代码段之前paiallel sections, parallel 和 sections 两个语句的结合critical,用在一段代码临界区之前smgle,用在一段只被单个线程执行的代码段之前,表示后面的代码段将被单线程执 行。flush tbarrier,用于并行区内代码的线程同步,所有线程执行到bamer时要停止,直到

15、所有线程都 执行到barrier时才继续往下执行。atomic,用于指定一块内存区域被制动更新master,用于指定一段代码块由主线程执行 ordered,用于指定并行区域的循环按顺序执行 tliieadpnvate,用于指定一个变量是线程私有的。OpenMP除上述指令外,还有一些库函数,卞面列出几个常用的库函数: omp_get_num_piocs,返回运行本线程的多处理机的处理器个数。 omp_get_num_tlueads.返回当前并行区域中的活动线程个数。 omp_get_tluead_nunL 返回线程号omp_set_num_tlueads,设置并行执行代码时的线程个数onip_uut_lock,初始化一个简单锁omp_set_lock,上锁操作 omp_unset_lock,解锁操作,要和omp_set_lock函数配对使用。omp_destroy_lock, om

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 建筑/环境 > 建筑资料

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号