安装,参考: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的简单使用相关推荐

  1. openmp多线程简单编程

    OpenMP支持的编程语言包括C.C++和Fortran,简单的说,就是一种API,来编写多线程应用程序.通过使用简单的指令#pragma omp -就可以对程序进行多线程并行.OpenMP使得程序员 ...

  2. VS2010+OpenMP的简单使用

    OpenMP是把程序中的循环操作分给电脑的各个CPU处理器并行进行.比如说我要循环运行100次,我的电脑有两个处理器,那OpenMP就会平均分给两个处理器并行运行,每个处理器运行50次. 使用方法 1 ...

  3. 并行编程OpenMP基础及简单示例

    OpenMP基本概念 OpenMP是一种用于共享内存并行系统的多线程程序设计方案,支持的编程语言包括C.C++和Fortran.OpenMP提供了对并行算法的高层抽象描述,特别适合在多核CPU机器上的 ...

  4. OpenMP用法大全

    OpenMP基本概念 OpenMP是一种用于共享内存并行系统的多线程程序设计方案,支持的编程语言包括C.C++和Fortran.OpenMP提供了对并行算法的高层抽象描述,特别适合在多核CPU机器上的 ...

  5. 用openMP进行并行加速

    用openMP进行并行加速 参考:http://blog.csdn.net/lanbing510/article/details/17108451 最近在看多核编程.简单来说,由于现在电脑CPU一般都 ...

  6. OpenMP的一点使用经验

    参考:http://blog.sina.com.cn/s/blog_7462bf390101d8sd.html 最近在看多核编程.简单来说,由于现在电脑CPU一般都有两个核,4核与8核的CPU也逐渐走 ...

  7. openmp使用经验

    最近在看多核编程.简单来说,由于现在电脑CPU一般都有两个核,4核与8核的CPU也逐渐走入了寻常百姓家,传统的单线程编程方式难以发挥多核CPU的强大功能,于是多核编程应运而生.按照我的理解,多核编程可 ...

  8. OpenMP基本概念

    OpenMP是一种用于共享内存并行系统的多线程程序设计方案,支持的编程语言包括C.C++和Fortran.OpenMP提供了对并行算法的高层抽象描述,特别适合在多核CPU机器上的并行程序设计.编译器根 ...

  9. 用OpenMP加速你的程序[转]

    最近在看多核编程.简单来说,由于现在电脑CPU一般都有两个核,4核与8核的CPU也逐渐走入了寻常百姓家,传统的单线程编程方式难以发挥多核 CPU的强大功能,于是多核编程应运而生.按照我的理解,多核编程 ...

最新文章

  1. 增加CentOS File Descriptors
  2. 哪里不知道“瞄”哪里,这项AI黑科技,打开手机就能体验
  3. Oracle PL SQL 精萃pdf
  4. 表格隔行变色_CSS实现鼠标悬停高亮
  5. 【最佳实践】授权子账号进行OSS图片样式设置
  6. php获得可靠的精准的当前时间 ( 通过授时服务器 )
  7. bzoj 1006: [HNOI2008]神奇的国度
  8. DrawerLayout 使用
  9. react 脚手架 立即可以写业务 react + react-router-dom + less + axios + antd
  10. python的列表函数
  11. tomcat6.0启动报错
  12. 【笔记】vim如何删除重复行
  13. 职工信息管理系统—C语言工程实践
  14. 动手学深度学习 v2 PDF版本
  15. 有雌雄一对兔子,假定过两个月便可繁殖雌雄各一的一对小兔子。问过n个月后共有多少对兔子?递归函数解决
  16. imx6ul的sd卡启动过程分析
  17. 计算机毕业设计android的酒店客房预订客户端app(源码+系统+mysql数据库+Lw文档)
  18. iOS计算器:采用NSDecimalNumber 进行表达式的精准计算(计算字符串数学表达式)【案例:折扣计算器(完整demo源码)】
  19. ad16 导入dwg_AD16怎样精确导入CAD文件
  20. 嵌入式应该从哪里入手?

热门文章

  1. python list存储对象_《python解释器源码剖析》第4章--python中的list对象
  2. 如何提升大规模Transformer的训练效果?Primer给出答案
  3. 阿里架构师进阶23期精讲:Redis、Kafka、Dubbo、Docker等
  4. distutils.errors.DistutilsError: Could not find suitable distribution for Requirement.parse(‘setupto
  5. Python多进程中多参数问题
  6. 文献阅读课13-DSGAN: Generative Adversarial Training for (远程监督关系抽取,句子级去噪)
  7. 我为什么在这里写博客
  8. 【Q】【poj 1144】【poj 1523】
  9. 小凡做蛋糕(Python)
  10. 三维空间中曲线绕任意轴旋转所得的旋转曲面求法