声明:欢迎任何人和组织转载本blog中文章,但必须标记文章原始链接和作者信息。

本文链接:http://blog.csdn.net/li_007/archive/2009/04/30/4139211.aspx

开拓进取的小乌龟------->CSDN点滴点点滴滴Blog

之前大概看了一下openMP,并且在初期像很多人一样犯了一些低级错误。

openMP是一种API,不是另一种编程语言,是像XML这样的一种业界标准,是一种基于内存共享的可扩展的可移植的多核并行编程模型,它适合于PC应用程序,同样也适合超级计算机的并行编程。可以去openMP的官网(www.openmp.org)它的介绍。

openMP的语句也很简洁,由#pragma omp这个directives加上一些如parallel、for、section、etc子语句组成,现在又很多人写了大量这方面的文章,如何感兴趣可以去baidu or google一下,当然最好是去官网或者www.wikipedia.org看看,毕竟它们更权威和专业。

支持openMP的编译器有很多,流行的Visual Studio .NET 2005/2008都支持(说明一下,只有professional Edition 和 Team Edition才支持)、当然还有Intel studio@parallel、gcc 4.3.2以上版本的编译器都支持openMP。在VS系列中,如果没有用到openMP的omp_get_thread_num()等等这些API,是不需要包含<omp.h>头文件的。只需要在项目属性中打开openMP支持就可以了。

#include "stdafx.h" #include <omp.h> #include <iostream> using namespace std; int _tmain(int argc, _TCHAR* argv[]) { int a[6][6] = {0}; int i, j; int sum = 0; omp_set_num_threads(3);//设置线程数为3 // omp_get_thread_num()得到当前线程ID #pragma omp parallel for private(i, j) reduction(+:sum) for(i = 1; i <= 6; i ++) { for(j = 1; j <= 6; j ++) { a[i][j] = i * j; printf("a[%d][%d] = %d ID = %d/n", i, j, a[i][j], omp_get_thread_num()); sum += a[i][j]; } } int max = 0; int min = 37; int m, n; #pragma omp parallel for private(m, n) //lastprivate(max, min) for(m = 6; m >= 0; m --) { for(n = 0; n <= 6; n ++) { #pragma omp parallel sections { #pragma omp section #pragma omp critical if(max < a[m][n]) max = a[m][n]; #pragma omp section #pragma omp critical if(min > a[m][n]) min = a[m][n]; } printf("max = %d min = %d ID = %d/n", max, min, omp_get_thread_num()); } } cout<<"/nsum = "<<sum<<endl; cout<<"max = "<<max<<endl; cout<<"min = "<<min<<endl; int loop; cin>>loop; return 0; }

上面是一个简单的利用了openMP的程序 ,执行结果如下:

a[3][1] = 3 ID = 1 a[1][1] = 1 ID = 0 a[5][1] = 5 ID = 2 a[3][2] = 6 ID = 1 a[1][2] = 2 ID = 0 a[5][2] = 10 ID = 2 a[3][3] = 9 ID = 1 a[1][3] = 3 ID = 0 a[5][3] = 15 ID = 2 a[3][4] = 12 ID = 1 a[1][4] = 4 ID = 0 a[5][4] = 20 ID = 2 a[3][5] = 15 ID = 1 a[1][5] = 5 ID = 0 a[5][5] = 25 ID = 2 a[3][6] = 18 ID = 1 a[1][6] = 6 ID = 0 a[5][6] = 30 ID = 2 a[4][1] = 4 ID = 1 a[2][1] = 2 ID = 0 a[6][1] = 6 ID = 2 a[4][2] = 8 ID = 1 a[2][2] = 4 ID = 0 a[6][2] = 12 ID = 2 a[4][3] = 12 ID = 1 a[2][3] = 6 ID = 0 a[6][3] = 18 ID = 2 a[4][4] = 16 ID = 1 a[2][4] = 8 ID = 0 a[6][4] = 24 ID = 2 a[4][5] = 20 ID = 1 a[2][5] = 10 ID = 0 a[6][5] = 30 ID = 2 a[4][6] = 24 ID = 1 a[2][6] = 12 ID = 0 a[6][6] = 36 ID = 2 max = 30 min = 30 ID = 0 max = 30 min = 0 ID = 2 max = 30 min = 0 ID = 1 max = 30 min = 0 ID = 0 max = 30 min = 0 ID = 2 max = 30 min = 0 ID = 1 max = 30 min = 0 ID = 0 max = 30 min = 0 ID = 2 max = 30 min = 0 ID = 1 max = 30 min = 0 ID = 0 max = 30 min = 0 ID = 2 max = 30 min = 0 ID = 1 max = 30 min = 0 ID = 0 max = 30 min = 0 ID = 2 max = 30 min = 0 ID = 1 max = 30 min = 0 ID = 0 max = 30 min = 0 ID = 2 max = 30 min = 0 ID = 1 max = 36 min = 0 ID = 0 max = 36 min = 0 ID = 2 max = 36 min = 0 ID = 1 max = 36 min = 0 ID = 0 max = 36 min = 0 ID = 2 max = 36 min = 0 ID = 1 max = 36 min = 0 ID = 0 max = 36 min = 0 ID = 2 max = 36 min = 0 ID = 1 max = 36 min = 0 ID = 0 max = 36 min = 0 ID = 2 max = 36 min = 0 ID = 1 max = 36 min = 0 ID = 0 max = 36 min = 0 ID = 2 max = 36 min = 0 ID = 1 max = 36 min = 0 ID = 0 max = 36 min = 0 ID = 2 max = 36 min = 0 ID = 1 max = 36 min = 0 ID = 0 max = 36 min = 0 ID = 2 max = 36 min = 0 ID = 1 max = 36 min = 0 ID = 0 max = 36 min = 0 ID = 2 max = 36 min = 0 ID = 1 max = 36 min = 0 ID = 0 max = 36 min = 0 ID = 0 max = 36 min = 0 ID = 0 max = 36 min = 0 ID = 0 max = 36 min = 0 ID = 0 max = 36 min = 0 ID = 0 max = 36 min = 0 ID = 0 sum = 441 max = 36 min = 0

注:在这里说明一下,不能使用C++的cout输出,貌似是不支持多线程输出,大家可以自己去测试。

转载于:https://www.cnblogs.com/leezhm/archive/2009/04/30/2560316.html

openMP学习笔记(一)相关推荐

  1. OPENMP学习笔记(1)——简介,模型,运行

    OPENMP学习笔记(1)--简介,模型,运行 简介: OpenMP的英文全称是Open Multiprocessing,一种应用程序接口(API,即Application Program Inter ...

  2. OpenMP学习笔记1

    OpenMP学习笔记1 介绍 在C/C++中,OpenMP可以通过使用预处理指令来让程序并行化.OpenMP指令使用的格式为: #pragma omp 指令 [子句[子句]-] fork/join并行 ...

  3. OpenMP学习笔记

    一.OpenMP简介 1. 内存共享并行模型. 机器必须多处理器/核,共享内存. 底层架构可以是UMA和NUMA. UMA NUMA 2. Fork-Join模型 重复fork-join操作. 3. ...

  4. 【OpenMP学习笔记】2:OpenMP中的归约和reduction子句

    简述归约 归约操作在MPI里也学过,不过那时候还不太熟悉这种操作.当时只知道MPI_Reduce可以把全局求和和集合通信封装起来,非常方便.实际上将相同的二元归约操作符重复地应用到一个序列上得到结果的 ...

  5. OpenMP学习笔记之常用指令parallel/sections/critical 其余待续

    主要涵盖以下指令: parallel parallel for sections critical single flush atomic master ordered threadprivate p ...

  6. OpenCV学习笔记(四十一)——再看基础数据结构core OpenCV学习笔记(四十二)——Mat数据操作之普通青年、文艺青年、暴力青年 OpenCV学习笔记(四十三)——存取像素值操作汇总co

    OpenCV学习笔记(四十一)--再看基础数据结构core 记得我在OpenCV学习笔记(四)--新版本的数据结构core里面讲过新版本的数据结构了,可是我再看这部分的时候,我发现我当时实在是看得太马 ...

  7. OpenCV学习笔记(三十一)——让demo在他人电脑跑起来 OpenCV学习笔记(三十二)——制作静态库的demo,没有dll也能hold住 OpenCV学习笔记(三十三)——用haar特征训练自己

    OpenCV学习笔记(三十一)--让demo在他人电脑跑起来 这一节的内容感觉比较土鳖.这从来就是一个老生常谈的问题.学MFC的时候就知道这个事情了,那时候记得老师强调多次,如果写的demo想在人家那 ...

  8. 【DOTS学习笔记】DOTS简介

    目录 前言 DOTS是什么? 核心Package 游戏功能相关Package 谁需要关注DOTS? DOTS可以应用到哪些地方? 为什么需要DOTS 前言 本文是Metaverse大衍神君的<D ...

  9. Brian2学习笔记

    Brian2学习笔记 前言 运行环境 写点有用的 没用的 简介 引用 安装 python编译安装 pip安装 C++ code generation的安装要求 测试 使用教程 Tutorial par ...

最新文章

  1. springmvc 传对象报400_源码导读:深入理解SpringMVC报400时的流程
  2. 她说要介绍10000个开源项目?来!我们一起监督!
  3. keras 导出onnx并使用
  4. C# switch语句中,可以放哪些类型
  5. 鸿蒙轻内核源码分析:虚实映射
  6. 解决企业人力短缺难题?且看RPA如何大展身手!
  7. 常用Gis通用符号库大全
  8. Matlab数组及多项式运算
  9. tableau数据汇总/明细/分-总的行列展示— Lee桑的学习笔记
  10. Complier Validation via Equivalence Modulo Inputs
  11. A Game of Thrones(50)
  12. 室内装修app开发,尽享绿色生活
  13. python内存地址不变,关于python内存地址问题
  14. 今日份安利:视频变声的软件有哪些?
  15. NEO改进协议提案2(NEP-2) 1
  16. 2015年macbookpro更换电池
  17. 导入Excel文件的方法
  18. php imagick加GD实现gif图换脸动画生成表情包制作功能
  19. DNS欺骗攻击和防护
  20. 测不准原理主要指向微观

热门文章

  1. 编译Ngnix遇到的问题,查看程序依赖的库文件
  2. IPv6与IPv4的区别
  3. 如何当好独立CIO(1)
  4. Map.putAll方法——追加另一个Map对象到当前Map集合
  5. 软件工程中的启发规则
  6. Diango博客--21.实现简单的全文搜索
  7. php用date语句获取时间,关于php date()函数获取时间的设置和使用方法
  8. 【docker】docker虚拟容器的使用大全
  9. Python面向切面编程是什么
  10. 给未来的自己一封信计算机,给未来的自己的一封信范文(精选5篇)