一起来学OpenMP(5)——有效的数据规约

原创 2010年06月07日 11:23:00

 一、引言

本节介绍reduction的用法。

 

二、reduction示例

输出如下:

其中sum是共享的,采用reduction之后,每个线程根据reduction(+: sum)的声明算出自己的sum,然后再将每个线程的sum加起来。

可以看到,第一个线程sum的值依次为0, 1, 3, 6, 10;第二个线程sum的值一次为5, 11, 18, 26, 35;最后10+35=45。

 

如果将其中的reduction声明去掉,则会输出:

 

计算步骤如下:

第一个线程sum=0;第二个线程sum=5

第一个线程sum=1+5=6;    第二个线程sum=6+6=12

第一个线程sum=2+12=14;第二个线程sum=7+14=21

第一个线程sum=3+21=24;第二个线程sum=8+24=32

第一个线程sum=4+32=36;第二个线程sum=9+36=45

尽管结果是对的,但两个线程对共享的sum的操作是不确定的,会引发数据竞争,例如计算步骤可能如下:

第一个线程sum=0;第二个线程sum=5

第一个线程sum=1+5=6;    第二个线程sum=6+6=12

第一个线程sum=2+12=14;第二个线程sum=7+14=21

第一个线程sum=3+21=24;第二个线程sum=8+21=29 //在第一个线程没有将sum更改为24时,第二个线程读取了sum的值

第一个线程sum=4+29=33;第二个线程sum=9+33=42 //导致结果错误。

 

reduction声明可以看作:

1. 保证了对sum的原则操作

2. 多个线程的执行结果通过reduction中声明的操作符进行计算,以加法操作符为例:

假设sum的初始值为10,reduction(+: sum)声明的并行区域中每个线程的sum初始值为0(规定),并行处理结束之后,会将sum的初始化值10以及每个线程所计算的sum值相加。

 

三、reduction的声明形式

我们在上边已经了解了reduction的声明形式,其具体如下:

reduction (operator: var1, val2, ...)

其中operator以及约定变量的初始值如下:

运算符            数据类型                  默认初始值

+                   整数、浮点               0

-                    整数、浮点               0

*                   整数、浮点               1

&                   整数                        所有位均为1

|                    整数                        0
^                   整数                        0

&&                 整数                        1

||                   整数                        0

 

小结

对reduction的用法进行了介绍,下面介绍线程同步。

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/donhao/article/details/5652552

OpenMP: OpenMP多线程编程技术

2.1 循环并行化1、循环并行化编译指导语句的格式循环并行化是使用OpenMP来并行化程序的最重要的部分,它是并行区域编程的一个特例。在C/C++语言中,循环并行化语句的编译指导语句格式如下:#pra...
  • Augusdi
  • Augusdi
  • 2013-04-16 10:36:41
  • 6884

一起来学OpenMP(5)——有效的数据规约

 一、引言本节介绍reduction的用法。 二、reduction示例#include #include // OpenMP编程需要包含的头文件 int main() { i...
  • donhao
  • donhao
  • 2010-06-07 11:23:00
  • 5119

OpenMP并行编程计算π值及PSRS排序

OpenMP简介OpenMP是一个共享存储并行系统上的应用程序接口。它规范了一系列的编译制导、运行库例程和环境变量。它提供了C/C++和FORTRAN等的应用编程接口,已经应用到UNIX、Window...
  • rectsuly
  • rectsuly
  • 2017-04-08 23:11:06
  • 1855

一起来学OpenMP(1)——初体验

转载自新浪博文:http://blog.sina.com.cn/s/blog_57562d890100xj3i.html OpenMP是一种面向共享内存以及分布式共享内存的多处理器多线程并行编程语言...
  • lanfengfeng1120
  • lanfengfeng1120
  • 2016-11-17 14:14:24
  • 220

一起来学OpenMP(1)

Open是一种面向共享内存以及分布式共享内存的多处理器多线程并行编程语言。 我的开发环境是Windows、VS2008、双核处理器。   1。 在VS2008程序目录下找到vcomp90d.dl...
  • mydear_33000
  • mydear_33000
  • 2011-10-31 13:48:35
  • 1679

利用<em>OpenMP</em>线程绑定技术提升多核平台应用性能

使其不再迁移,这种<em>方法</em>将有可能提升应用程序性能,更充分的利用多核平台的计算...<em>OpenMP规约</em>例子 立即下载 上传者: fengxiao05270630 时间: 2009-05-13 综合评分...
  • 2018年04月08日 00:00

程序正确性证明与并行程序设计

程序正确性证明与并行程序设计 (2011-08-20 20:27:59) 标签: 校园 分类: 工作篇 理论计算机科学   关于计算和计算机...
  • junecau
  • junecau
  • 2011-11-12 21:18:58
  • 2427

一起来学RT-Thread教程连载

  • 2015年08月13日 18:07
  • 47.72MB
  • 下载

《多核程序设计》PPT

、硬件支持、系统软件的现状,详细讲解了在多核平台上进行软件开发的理论与<em>方法</em>。...<em>OpenMP规约</em>例子 立即下载 上传者: fengxiao05270630 时间: 2009-05-13 综合评分...
  • 2018年03月28日 00:00

OpenMP简介和计算实例

OpenMP是一种基于共享存储系统之上的并行编程标准,OpenMP标准提供了更为简单的编程模型,更易于编程,但是OpenMP完全依赖用户保证制导的正确性。本文以计算π值为例,给出4种OpenMP编程的...
  • u014768676
  • u014768676
  • 2015-04-15 21:38:37
  • 2111
收藏助手
不良信息举报
您举报文章:一起来学OpenMP(5)——有效的数据规约
举报原因:
原因补充:

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