一起来学OpenMP(5)——有效的数据规约
2013-09-10 18:10
701 查看
一起来学OpenMP(5)——有效的数据规约
(2012-03-04 12:41:03)
转载▼
一、引言
本节介绍reduction的用法。
二、reduction示例
[cpp] view plaincopyprint?
#include <iostream>
#include <omp.h> // OpenMP编程需要包含的头文件
int main()
{
int sum = 0;
std::cout << "Before: " << sum << std::endl;
#pragma omp parallel for reduction(+: sum)
for (int i = 0; i < 10; ++i)
{
sum = sum + i;
std::cout << sum << std::endl;
}
std::cout << "After: " << sum << std::endl;
return 0;
}
输出如下:
其中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的用法进行了介绍,下面介绍线程同步。
相关文章推荐
- 一起来学OpenMP(5)——有效的数据规约
- 一起来学OpenMP(5)——有效的数据规约
- OpenMP 有效的数据规约
- 一起来学OpenMP(4)——数据的共享与私有化
- 一起来学OpenMP(4)——数据的共享与私有化
- 一起来学OpenMP(4)——数据的共享与私有化
- OpenMP: OpenMP数据环境
- OpenMP中数据属性相关子句详解(2):shared/default/copyin/copyprivate子句的使用
- OpenMP中数据属性相关子句详解(1):private/firstprivate/lastprivate/threadprivate之间的比较
- 大数据量表中如何有效使用非聚集索引及如何避免使用LEFT JOIN
- MySQL开启binlog并且保存7天有效数据
- 诠释数据降维算法:一文讲尽t-分布邻域嵌入算法(t-SNE)如何有效利用
- mysql导入数据的一种有效方法:loa…
- 如何做数据仓库的有效需求分析
- EXCEL中提取某行最后一个有效单元格数据
- OpenMP 与 MPICH2 进行集群计算时数据分发与共享
- [ mysql ] 根据时间查询有效数据
- 统计电视机顶盒中无效用户数据,并以压缩格式输出有效用户数据
- 在C#中用最简洁有效的代码执行存储过程并返回数据
- 一起来学OpenMP(3)——for循环并行化基本用法