Openmp补遗之数据共享&归约子句的学习
2012-03-11 00:44
211 查看
共享与私有变量声明的方法
声明方法 功能
shared(val1,val2,...) 共享变量在存储器中只有一份拷贝,所有的线程都能对它进行读写访问。正确性将由程序员来决定。 得到声明,初始赋值且写回
private(val1, val2, ...) 并行区域中变量val是私有的,即每个线程拥有该变量的一个拷贝 只得到声明,无初始赋值
无论该变量在并行区域外是否初始化,在进入并行区域后,该变量均不会初始化。
在VS2008下,会因为private所导致的私有变量未初始化而出现错误。
first_private(val1, val2, ...) 与private不同的是,每个线程在开始的时候都会对该变量进行一次初始化。 得到声明和初始赋值
各线程对val进行各自的操作,最后不会对公共区的val造成影响。
last_private(val1, val2, ...) 与private不同的是,并发执行的最后一次循环的私有变量将会拷贝到val 得到声明,无初始赋值,最后将数据赋回
reduction(operator : val1,val2 ) 每个线程根据reduction(+: sum)的声明算出自己的sum,然后再将每个线程的sum加起来。 得到声明,最后将数据归约(含初始值)
其中operator以及约定变量的初始值如下:
运算符 数据类型 默认初始值
+ 整数、浮点 0
- 整数、浮点 0
* 整数、浮点 1
& 整数 所有位均为1
| 整数 0
^ 整数 0
&& 整数 1
|| 整数 0
一种数据冲突的例子,需要reduction来避免!
如果将其中的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 //导致结果错误。
声明方法 功能
shared(val1,val2,...) 共享变量在存储器中只有一份拷贝,所有的线程都能对它进行读写访问。正确性将由程序员来决定。 得到声明,初始赋值且写回
private(val1, val2, ...) 并行区域中变量val是私有的,即每个线程拥有该变量的一个拷贝 只得到声明,无初始赋值
无论该变量在并行区域外是否初始化,在进入并行区域后,该变量均不会初始化。
在VS2008下,会因为private所导致的私有变量未初始化而出现错误。
first_private(val1, val2, ...) 与private不同的是,每个线程在开始的时候都会对该变量进行一次初始化。 得到声明和初始赋值
各线程对val进行各自的操作,最后不会对公共区的val造成影响。
last_private(val1, val2, ...) 与private不同的是,并发执行的最后一次循环的私有变量将会拷贝到val 得到声明,无初始赋值,最后将数据赋回
reduction(operator : val1,val2 ) 每个线程根据reduction(+: sum)的声明算出自己的sum,然后再将每个线程的sum加起来。 得到声明,最后将数据归约(含初始值)
其中operator以及约定变量的初始值如下:
运算符 数据类型 默认初始值
+ 整数、浮点 0
- 整数、浮点 0
* 整数、浮点 1
& 整数 所有位均为1
| 整数 0
^ 整数 0
&& 整数 1
|| 整数 0
一种数据冲突的例子,需要reduction来避免!
如果将其中的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 //导致结果错误。
相关文章推荐
- <Head First Java>学习笔记--第三章:primitive主数据类型和引用
- <<数据结构和离散数学>>树的等价关系,集合论学习
- OpenMP学习:数据的共享与私有(一)
- 机器学习如何选择模型 & 机器学习与数据挖掘区别 & 深度学习科普
- Java学习笔记3 原生数据类型 Primi…
- C++学习笔记之线程:数据共享与竞争,线程死锁
- Hibernate学习---第十二节:Hibernate之数据抓取策略&批量抓取
- 一站式Hadoop&Spark云计算分布式大数据和Android&HTML5移动互联网解决方案课程(Hadoop、Spark、Android、HTML5)V2的第一门课程
- <<Git Community Book中文版>>学习笔记
- <<Practical Common Lisp>> 学习笔记一
- Oracle学习之基本语法(二)—操作符&数据类型
- 机器学习图像识别数据挖掘面试中 不会的&答错的&答得不好的 问题Mark1
- <C/C++ 版> 设计模式 学习之 工厂模式 <2>
- 机器学习实战 -> 利用PCA&&SVD来简化数据
- <自已动手写操作系统>学习扎记之保护模式
- EA&UML日拱一卒-0基础学习微信小程序(8)-事件处理和数据绑定
- <<Python基础教程>>学习笔记 | 第14章 | 网络编程
- <一>Strom实时计算学习笔记
- <Head First Java>学习笔记--第六章:认识Java的API
- 用NSURLConnection Post上传数据的"+"会变成空格