openMP的简单使用
安装,参考:https://blog.csdn.net/augusdi/article/details/8808226
如图所示,右键工程名->属性->C/C+±>语言,找到OpenMP支持,更改设置即可。
代码编程,参考:https://blog.csdn.net/zhongkejingwang/article/details/40350027
在C/C++中使用OpenMP优化代码方便又简单,代码中需要并行处理的往往是一些比较耗时的for循环,所以下面介绍一下OpenMP中for循环的应用。
###1. 首先,如何使一段代码并行处理呢?
omp中使用parallel制导指令标识代码中的并行段,形式为:
#pragma omp parallel
{...//每个线程都会执行大括号里的代码
}
我们编写如下的代码:
#include <iostream>
#include "omp.h"
using namespace std;
int main(int argc, char **argv) {//设置线程数,一般设置的线程数不超过CPU核心数,这里开4个线程执行并行代码段omp_set_num_threads(4);#pragma omp parallel{cout << "Hello" << ", I am Thread " << omp_get_thread_num() << endl;}
}
上面的代码输出结果为:
Hello,Thread Hello,Thread 21
Hello,Thread 3
Hello,Thread 0
可以看到四个线程各自独立的输出了cout后面的内容。如果去掉omp_set_num_threads(4)语句,我们的电脑CPU的每个核都会独立执行,我的CPU有8个核,就会执行8次大括号内的语句。
###2.带有for的制导指令:
使用形式为:
#pragma omp parallel for
for()
或者
#pragma omp parallel
{ //注意:大括号必须要另起一行#pragma omp forfor()
}
第一种形式作用域只是紧跟着的那个for循环,而第二种形式在整个并行块中可以出现多个for制导指令。
...
#include "omp.h"
...
int main()
{omp_set_num_threads(4);#pragma omp parallel forfor (int i = 0; i < 6; i++){printf("i = %d,Hello,Thread:%d\n", i, omp_get_thread_num());}return 0;
}
输出结果如下:
i = 0,Hello,Thread:0
i = 1,Hello,Thread:0
i = 2,Hello,Thread:1
i = 3,Hello,Thread:1
i = 5,Hello,Thread:3
i = 4,Hello,Thread:2
我们可以看到输出6次printf的任务被分给了CPU的4个核。
###3.数据同步问题
int main()
{int n = 100000;int sum = 0;omp_set_num_threads(4);#pragma omp parallel forfor (int i = 0; i < n; i++){sum++;}cout << sum << endl;return 0;
}
期望的正确结果是100000,但是这样写是错误的。看代码,由于默认情况下sum变量是每个线程共享的,所以多个线程同时对sum操作时就会因为数据同步问题导致结果不对,显然,输出结果每次都不同,这是无法预知的,下面是输出结果,但是每个线程不会共享for循环中的变量,包括i值。所以如果线程要调用for循环外的变量,要加critical语句,下面有介绍。
//多次输出结果
58504
45203
35716
...
#####解决方法1:方法一:对操作共享变量的代码段做同步标识
int main()
{int n = 100000;int sum = 0;omp_set_num_threads(4);#pragma omp parallel forfor (int i = 0; i < n; i++){#pragma omp critical{sum++;}}cout << sum << endl;return 0;
}
critical制导语句标识的下一行代码,也可以是跟着一个大括号括起来的代码段做了同步处理。
输出结果100000。
openMP的简单使用相关推荐
- openmp多线程简单编程
OpenMP支持的编程语言包括C.C++和Fortran,简单的说,就是一种API,来编写多线程应用程序.通过使用简单的指令#pragma omp -就可以对程序进行多线程并行.OpenMP使得程序员 ...
- VS2010+OpenMP的简单使用
OpenMP是把程序中的循环操作分给电脑的各个CPU处理器并行进行.比如说我要循环运行100次,我的电脑有两个处理器,那OpenMP就会平均分给两个处理器并行运行,每个处理器运行50次. 使用方法 1 ...
- 并行编程OpenMP基础及简单示例
OpenMP基本概念 OpenMP是一种用于共享内存并行系统的多线程程序设计方案,支持的编程语言包括C.C++和Fortran.OpenMP提供了对并行算法的高层抽象描述,特别适合在多核CPU机器上的 ...
- OpenMP用法大全
OpenMP基本概念 OpenMP是一种用于共享内存并行系统的多线程程序设计方案,支持的编程语言包括C.C++和Fortran.OpenMP提供了对并行算法的高层抽象描述,特别适合在多核CPU机器上的 ...
- 用openMP进行并行加速
用openMP进行并行加速 参考:http://blog.csdn.net/lanbing510/article/details/17108451 最近在看多核编程.简单来说,由于现在电脑CPU一般都 ...
- OpenMP的一点使用经验
参考:http://blog.sina.com.cn/s/blog_7462bf390101d8sd.html 最近在看多核编程.简单来说,由于现在电脑CPU一般都有两个核,4核与8核的CPU也逐渐走 ...
- openmp使用经验
最近在看多核编程.简单来说,由于现在电脑CPU一般都有两个核,4核与8核的CPU也逐渐走入了寻常百姓家,传统的单线程编程方式难以发挥多核CPU的强大功能,于是多核编程应运而生.按照我的理解,多核编程可 ...
- OpenMP基本概念
OpenMP是一种用于共享内存并行系统的多线程程序设计方案,支持的编程语言包括C.C++和Fortran.OpenMP提供了对并行算法的高层抽象描述,特别适合在多核CPU机器上的并行程序设计.编译器根 ...
- 用OpenMP加速你的程序[转]
最近在看多核编程.简单来说,由于现在电脑CPU一般都有两个核,4核与8核的CPU也逐渐走入了寻常百姓家,传统的单线程编程方式难以发挥多核 CPU的强大功能,于是多核编程应运而生.按照我的理解,多核编程 ...
最新文章
- 增加CentOS File Descriptors
- 哪里不知道“瞄”哪里,这项AI黑科技,打开手机就能体验
- Oracle PL SQL 精萃pdf
- 表格隔行变色_CSS实现鼠标悬停高亮
- 【最佳实践】授权子账号进行OSS图片样式设置
- php获得可靠的精准的当前时间 ( 通过授时服务器 )
- bzoj 1006: [HNOI2008]神奇的国度
- DrawerLayout 使用
- react 脚手架 立即可以写业务 react + react-router-dom + less + axios + antd
- python的列表函数
- tomcat6.0启动报错
- 【笔记】vim如何删除重复行
- 职工信息管理系统—C语言工程实践
- 动手学深度学习 v2 PDF版本
- 有雌雄一对兔子,假定过两个月便可繁殖雌雄各一的一对小兔子。问过n个月后共有多少对兔子?递归函数解决
- imx6ul的sd卡启动过程分析
- 计算机毕业设计android的酒店客房预订客户端app(源码+系统+mysql数据库+Lw文档)
- iOS计算器:采用NSDecimalNumber 进行表达式的精准计算(计算字符串数学表达式)【案例:折扣计算器(完整demo源码)】
- ad16 导入dwg_AD16怎样精确导入CAD文件
- 嵌入式应该从哪里入手?
热门文章
- python list存储对象_《python解释器源码剖析》第4章--python中的list对象
- 如何提升大规模Transformer的训练效果?Primer给出答案
- 阿里架构师进阶23期精讲:Redis、Kafka、Dubbo、Docker等
- distutils.errors.DistutilsError: Could not find suitable distribution for Requirement.parse(‘setupto
- Python多进程中多参数问题
- 文献阅读课13-DSGAN: Generative Adversarial Training for (远程监督关系抽取,句子级去噪)
- 我为什么在这里写博客
- 【Q】【poj 1144】【poj 1523】
- 小凡做蛋糕(Python)
- 三维空间中曲线绕任意轴旋转所得的旋转曲面求法