OpenMP 有效的数据规约
2011-01-27 13:20
323 查看
一、引言
在以多线程执行的的循环访问中,为了解决在不使用锁的情况下既共享sum变量有保护该变量的问题,OpenMP提供了reduction子句,可以用来有效的合并一个循环中某些关于一个或多个满足结合律的算术规约操作。 二、reduction示例 #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(5)——有效的数据规约
- MySQL开启binlog并且保存7天有效数据
- 云中共享数据的公开校验——2.基于组签名的身份隐私保护+有效支持动态组管理
- 大数据早报:缺乏有效辟谣机制怎么办?人工智能狙击网络谣言 95后大数据报告出炉:兴趣决定一切(9.15)
- 在mysql中使用group by和order by取每个分组中日期最大一行数据,亲测有效
- SQL 获得某表中身份证信息有效的数据
- 芝麻分从本地mongo中获取有效数据工具
- 一起来学OpenMP(4)——数据的共享与私有化
- Ubuntu环境下TensorBoard 可视化 不显示数据问题 No scalar data was found...(作者亲测有效)
- 部署K2流程时,报错:“请求的名称有效,但是找不到请求的类型的数据”
- 统计电视机顶盒中无效用户数据,并以压缩格式输出有效用户数据
- 查询数据库中所有表的数据量、有效数据量以及其它定制数据量
- 回发或回调参数无效。在配置中使用 或在页面中使用 启用了事件验证。出于安全目的,此功能验证回发或回调事件的参数是否来源于最初呈现这些事件的服务器控件。如果数据有效并且是预期的,则使用 ClientScriptManager.RegisterForEventValidation 方法来注册回发或回调数据以进行验证。
- Effective C# 原则8:确保0对于值类型数据是有效的(翻译)
- 有效模糊查询大量数据
- Sql Server展示树级结构数据,类似ORCAL中的Start With的效果,测试非常有效
- iphone3g 蜂窝数据有效设置
- 在C#中用最简洁有效的代码执行存储过程并返回数据