OpenMP深入剖析reduction子句教程
目录
- 前言
- 从并发求和开始
- 解决求和问题的各种办法
- 使用数组巧妙解决并发程序当中的数据竞争问题
- reduction 子句
- 深入剖析 reduction 子句
- 加法+操作符
- 乘法*操作符
- 逻辑与&&操作符
- 或||操作符
- MIN 最小值
- MAX 最大值
- & 按位与
- |按位或
- ^按位异或
- 总结
前言
在前面的教程OpenMP入门当中我们简要介绍了 OpenMP 的一些基础的使用方法,在本篇文章当中我们将从一些基础的问题开始,然后仔细介绍在 OpenMP 当中 reduction 子句的各种使用方法。
从并发求和开始
我们的任务是两个线程同时对一个变量 data
进行 ++
操作,执行 10000 次,我们看下面的代码有什么问题:
#include <stdio.h> #include <omp.h> #include <unistd.h> static int data; int main() { #pragma omp parallel num_threads(2) // 使用两个线程同时执行上面的代码块 { for(int i = 0; i < 10000; i++) { data++; usleep(10); } // omp_get_thread_num 函数返回线程的 id 号 这个数据从 0 开始,0, 1, 2, 3, 4, ... printf("data = %d tid = %d\n", data, omp_get_thread_num()); } printf("In main function data = %d\n", data); return 0; }
在上面的代码当中,我们开启了两个线程并且同时执行 $pragma
下面的代码块,但是上面的程序有一个问题,就是两个线程可能同时执行 data++
操作,但是同时执行这个操作的话,就存在并发程序的数据竞争问题,在 OpenMP 当中默认的数据使用方式就是
相关推荐
-
详解CLion配置openMP的方法
使用MinGW64在Clion中配置openMP的开发 安装MinGW64和CLion配置CMakeList.txtCLion 2020.2.3 Build #CL-202.7319.72, built on September 18, 2020 对openMP编译制导的格式问题踩坑 下载 MinGW64 CLion 创建工程,配置CMakeList.txt cmake_minimum_required(VERSION 3.17) project(openMP C) set(CMAKE_C_ST
-
OpenMP 共享内存的并行编程框架入门详解
目录 简介 认识 openmp 的简单易用性 C 语言实现 C++ 实现 OpenMP 实现 opnemp 基本原理 积分例子 总结 简介 OpenMP 一个非常易用的共享内存的并行编程框架,它提供了一些非常简单易用的API,让编程人员从复杂的并发编程当中释放出来,专注于具体功能的实现.openmp 主要是通过编译指导语句以及他的动态运行时库实现,在本篇文章当中我们主要介绍 openmp 一些入门的简单指令的使用. 认识 openmp 的简单易用性 比如现在我们有一个任务,启动四个线程打印 he
-
安装OpenMPI来配合C语言程序进行并行计算
安装OPENMPI 由于是实验,也不进行多机的配置了,只在虚拟机里安装吧.多个机器的配置可以参考此文 最简单的方法,apt安装 sudo apt-get install libcr-dev mpich2 mpich2-doc 测试 hello.c /* C Example */ #include <mpi.h> #include <stdio.h> int main (int argc, char* argv[]) { int rank, size; MPI_Init (&
-
OpenMP深入剖析reduction子句教程
目录 前言 从并发求和开始 解决求和问题的各种办法 使用数组巧妙解决并发程序当中的数据竞争问题 reduction 子句 深入剖析 reduction 子句 加法+操作符 乘法*操作符 逻辑与&&操作符 或||操作符 MIN 最小值 MAX 最大值 & 按位与 |按位或 ^按位异或 总结 前言 在前面的教程OpenMP入门当中我们简要介绍了 OpenMP 的一些基础的使用方法,在本篇文章当中我们将从一些基础的问题开始,然后仔细介绍在 OpenMP 当中 reduction 子句的各
-
PHP中ORDER BY子句的详细用法教程
我们已经看到SQL SELECT命令来获取数据从MySQL表.当选择行,MySQL服务器是自由返回,除非指示说如何排序结果否则它会自由返回.指定需要结果集增加一个ORDER BY子句要作为排序依据的列或列名进行排序. 语法: SELECT field1, field2,...fieldN table_name1, table_name2... ORDER BY field1, [field2...] [ASC [DESC]] 这里是通用的SQL的SELECT命令的语法,ORDER BY子句从My
-
MySQL的子查询中FROM和EXISTS子句的使用教程
FROM 子查询 FROM 子句中的子查询 MySQL FROM 子查询是指 FROM 的子句作为子查询语句,主查询再到子查询结果中获取需要的数据.FROM 子查询语法如下: SELECT ... FROM (subquery) AS name ... 子查询会生成一个临时表,由于 FROM 子句中的每个表必须有一个名称,因此 AS name 是必须的.FROM 子查询也称为衍生数据表子查询. FROM 子查询实例 table1: s1 s2 1 5 2 12 3 20 FROM 子查询 SQL
-
MySQL中LIKE子句相关使用的学习教程
MySQL LIKE 语法 LIKE 运算符用于 WHERE 表达式中,以搜索匹配字段中的指定内容,语法如下: WHERE column LIKE pattern WHERE column NOT LIKE pattern 在 LIKE 前面加上 NOT 运算符时,表示与 LIKE 相反的意思,即选择 column 不包含 pattern 的数据记录. LIKE 通常与通配符 % 一起使用,% 表示通配 pattern 中未出现的内容.而不加通配符 % 的 LIKE 语法,表示精确匹配,其实际效
-
C++性能剖析教程之循环展开
什么是循环展开? 循环展开,英文中称Loop unwinding或loop unrolling,是一种牺牲程序的尺寸来加快程序的执行速度的优化方法.可以由程序员完成,也可由编译器自动优化完成.循环展开最常用来降低循环开销,为具有多个功能单元的处理器提供指令级并行.也有利于指令流水线的调度. 循环展开能从两方面改进程序的性能: 减少了不直接有助于程序结果的操作的数量,例如循环索引计算和分支条件. 提供了一些方法,可以进一步变化代码,减少整个计算中关键路径上的操作数量. 循环展开对程序性能的影响 我
-
OpenMP Parallel Construct的实现原理详解
目录 Parallel 分析——编译器角度 深入剖析 Parallel 动态库函数参数传递 动态库函数分析 参数传递分析 汇编程序分析 GOMP_parallel_start 详细参数分析 动态库函数源码分析 GOMP_parallel_start 源码分析 GOMP_parallel_end 分析 总结 Parallel 分析——编译器角度 在本小节当中我们将从编译器的角度去分析该如何处理 parallel construct .首先从词法分析和语法分析的角度来说这对编译器并不难,只需要加上一
-
Swift hello world!Swift快速入门教程
通常来说,编程语言教程中的第一个程序应该在屏幕上打印"Hello, world".在 Swift 中,可以用一行代码实现: 复制代码 代码如下: println("hello, world") 如果你写过 C 或者 Objective-C 代码,那你应该很熟悉这种形式--在 Swift 中,这行代码就是一个完整的程序.你不需要为了输入输出或者字符串处理导入一个单独的库.全局作用域中的代码会被自动当做程序的入口点,所以你也不需要main函数.你同样不需要在每个语句结尾
-
mysql 8.0 安装配置方法教程
一.安装mysql yum源 从官网http://dev.mysql.com/downloads/repo/yum/下载mysql最新的yum源的rpm安装包 wget http://repo.mysql.com//mysql57-community-release-el6-9.noarch.rpm 使用yum安装rpm包 yum install mysql57-community-release-el6-9.noarch.rpm 检测mysql yum源 yum repolist enable
-
汇编语言超浓缩教程
所以我个人看法学汇编,不一定要写程序,写程序确实不是汇编的强项,大家不妨玩玩DEBUG,有时CRACK出一个小软件比完成一个程序更有成就感(就像学电脑先玩游戏一样).某些高深的指令事实上只对有经验的汇编程序员有用,对我们而言,太过高深了.为了使学习汇编语言有个好的开始,你必须要先排除那些华丽复杂的命令,将注意力集中在最重要的几个指令上(CMP LOOP MOV JNZ--).但是想在啰里吧嗦的教科书中完成上述目标,谈何容易,所以本人整理了这篇超浓缩(用WINZIP.WINRAR-依次压迫,嘿嘿!
随机推荐
- iOS 中根据屏幕宽度自适应分布按钮的实例代码
- java操作(DOM、SAX、JDOM、DOM4J)xml方式的四种比较与详解
- asp.net 获取系统中参数的实现代码
- 分享C++面试中string类的一种正确写法
- div+css排版的样例
- 用java实现冒泡排序算法
- jQuery插件HighCharts绘制2D金字塔图效果示例【附demo源码下载】
- jquery 延迟执行实例介绍
- JavaScript判断用户是否对表单进行了修改的方法
- JavaScript快速检测浏览器对CSS3特性的支持情况
- Vim 强制保存只读类型文件的方法
- 深入理解链表的各类操作详解
- php object转数组示例
- 用PHP连接Oracle数据库
- 消除口中蒜臭的有效方法
- mysql5.7.21安装配置教程
- 浅谈vue.js导入css库(elementUi)的方法
- 浅谈Node框架接入ELK实践总结
- layui点击按钮添加可编辑的一行方法
- springcloud Zuul动态路由的实现