一起来学OpenMP(3)——for循环并行化基本用法

原创 2010年06月06日 23:08:00

一、引言

在“一起来学OpenMP(1)——初体验”中给出了一个for循环并行化的例子,这里做进一步的分析,但本节仅描述for循环并行化的基本用法(即#pragma omp parallel for预处理器指示符),该用法需要满足数据不相关性。

 

二、数据相关性

在循环并行化时,由于多个线程同时执行循环,迭代的顺序是不确定的。如果是数据不相关的,则可以采用基本的#pragma omp parallel for预处理器指示符。

如果语句S2与语句S1相关,那么必然存在以下两种情况之一:

1. 语句S1在一次迭代中访问存储单元L,而S2在随后的一次迭代中访问统一存储单元,称之为循环迭代相关(Loop-Carried Dependence);

2. S1和S2在同一循环迭代中访问统一存储单元L,但S1的执行在S2之前,称之为非循环迭代相关(Loop-Independent Dependence)。

 

三、for循环并行化的几种声明形式

上边代码的两种声明形式是一样的,很显然第二种声明形式更为简洁紧凑。

但是第一种声明形式有一个好处,即可以在并行区域内、for循环以外写其他并行代码。

例如:

 

四、for循环并行化的约束条件

尽管OpenMP可以方便地对for循环进行并行化,但并不是所有的for循环都可以进行并行化。以下几种情况不能进行并行化:

1. for循环中的循环变量必须是有符号整形。例如,for (unsigned int i = 0; i < 10; ++i){}会编译不通过;

2. for循环中比较操作符必须是<, <=, >, >=。例如for (int i = 0; i != 10; ++i){}会编译不通过;

3. for循环中的第三个表达式,必须是整数的加减,并且加减的值必须是一个循环不变量。例如for (int i = 0; i != 10; i = i + 1){}会编译不通过;感觉只能++i; i++; --i; 或i--;

4. 如果for循环中的比较操作为<或<=,那么循环变量只能增加;反之亦然。例如for (int i = 0; i != 10; --i)会编译不通过;

5. 循环必须是单入口、单出口,也就是说循环内部不允许能够达到循环以外的跳转语句,exit除外。异常的处理也必须在循环体内处理。例如:若循环体内的break或goto会跳转到循环体外,那么会编译不通过。

 

五、基本for循环并行化举例

 

 

六、嵌套for循环

编译器会让第一个cpu完成:

会让第二个cpu完成:

 

 

七、小节

本节首先给出了数据相关的概念,然后对基本for循环并行化方法进行了描述,并指出了#pragma omp parallel for预处理指示符不能应用的场合。后续讲述数据竞争时再对其他种类的for循环并行化进行描述。

 

版权声明:本文为博主原创文章,未经博主允许不得转载。

OpenMP并行程序设计——for循环并行化详解

在C/C++中使用OpenMP优化代码方便又简单,代码中需要并行处理的往往是一些比较耗时的for循环,所以重点介绍一下OpenMP中for循环的应用。个人感觉只要掌握了文中讲的这些就足够了,如果想要学...
  • zhongkejingwang
  • zhongkejingwang
  • 2014年10月22日 18:12
  • 11978

OpenMP并行程序设计(二)

 OpenMP并行程序设计(二)... 11、fork/join并行执行模式的概念... 12、OpenMP指令和库函数介绍... 13、parallel 指令的用法... 34、for指令的使用方法...
  • drzhouweiming
  • drzhouweiming
  • 2006年09月04日 15:31
  • 66734

OpenMP编程入门之一

当前多核多线程CPU大行其道,如果不能充分利用岂不是太可惜了!特别在图像处理领域,简直是为并行计算而生的!在网上看了不少文章,还是自己总结一下吧。...
  • wyjkk
  • wyjkk
  • 2011年07月17日 14:32
  • 10771

OpenMP中的数据处理子句

 OpenMP中的数据处理子句相关文档连接:多核编程中的任务随机竞争模式的概率分析多核编程中的任务分组竞争模式  多核编程中的负载平衡难题 多核编程中的锁竞争难题 多核编程的几个难题及其应对策略(难题...
  • drzhouweiming
  • drzhouweiming
  • 2008年01月10日 11:02
  • 31089

并行编程OpenMP基础及简单示例

OpenMP基本概念 OpenMP是一种用于共享内存并行系统的多线程程序设计方案,支持的编程语言包括C、C++和Fortran。OpenMP提供了对并行算法的高层抽象描述,特别适合在多核CPU机器...
  • dcrmg
  • dcrmg
  • 2016年12月24日 22:30
  • 4134

OpenMP并发编程快速入门

随着多核处理器的普及,并发编程也变得越来越流行。OpenMP是目前被广泛接受的,用于共享内存并行系统的多处理器程序设计的一套指导性的编译处理方案。程序员通过在源代码中加入专用的pragma来指明自己的...
  • baimafujinji
  • baimafujinji
  • 2016年09月06日 13:52
  • 1631

一起来学OpenMP(9)——线程同步之事件同步机制

一、引言 前边已经提到过,线程的同步机制包括互斥锁同步和事件同步。互斥锁同步包括atomic、critical、mutex函数,其机制与普通多线程同步的机制类似。而事件同步则通过nowait、sec...
  • mydear_33000
  • mydear_33000
  • 2011年10月31日 13:51
  • 4374

利用OpenCV和OpenMP的多路视频融合显示

#include "stdafx.h"#include "opencv2/core/core.hpp"#include "opencv2/highgui/highgui.hpp"#include "o...
  • klqulei123
  • klqulei123
  • 2014年03月03日 13:39
  • 353

openMP的一点使用经验【非原创】

按照百科上说的,针对于openmp的编程,最简单的就是在开头加个#include,然后在后面的for上加一行#pragma omp parallel for即可,下面的是较为详细的介绍了openmp的...
  • shouhuxianjian
  • shouhuxianjian
  • 2015年06月22日 12:32
  • 1121

openMP的一点使用经验

原文链接:http://www.cnblogs.com/yangyangcv/archive/2012/03/23/2413335.html 最近在看多核编程。简单来说,由于现在电脑CPU一般...
  • CSDNMicrosoftCSDN
  • CSDNMicrosoftCSDN
  • 2015年01月29日 14:13
  • 963
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:一起来学OpenMP(3)——for循环并行化基本用法
举报原因:
原因补充:

(最多只允许输入30个字)