原文链接
代码在git

什么是OpenMP

Open Multi-Processing的缩写,是一个应用程序接口(API),可用于显式指导多线程、共享内存的并行性。

在项目程序已经完成好的情况下不需要大幅度的修改源代码,只需要加上专用的pragma来指明自己的意图,由此编译器可以自动将程序进行并行化,并在必要之处加入同步互斥以及通信。当选择忽略这些pragma,或者编译器不支持OpenMp时,程序又可退化为通常的程序(一般为串行),代码仍然可以正常运作,只是不能利用多线程来加速程序执行。OpenMP提供的这种对于并行描述的高层抽象降低了并行编程的难度和复杂度,这样程序员可以把更多的精力投入到并行算法本身,而非其具体实现细节。对基于数据分集的多线程程序设计,OpenMP是一个很好的选择。

OpenMP支持的语言包括C/C++、Fortran;而支持OpenMP的编译器VS、gcc、clang等都行。可移植性也很好:Unix/Linux和Windows

OpenMP编程模型

内存共享模型:OpenMP是专为多处理器/核,共享内存机器所设计的。底层架构可以是UMA和NUMA。即(Uniform Memory Access和Non-Uniform Memory Access)

  • OpenMP仅通过线程来完成并行
  • 一个线程的运行是可由操作系统调用的最小处理单
  • 线程们存在于单个进程的资源中,没有了这个进程,线程也不存在了
  • 通常,线程数与机器的处理器/核数相匹配,然而,实际使用取决与应用程序

明确的并行

  • OpenMP是一种显式(非自动)编程模型,为程序员提供对并行化的完全控制
  • 一方面,并行化可像执行串行程序和插入编译指令那样简单
  • 另一方面,像插入子程序来设置多级并行、锁、甚至嵌套锁一样复杂

Fork-Join模型

  • OpenMP就是采用Fork-Join模型
  • 所有的OpenML程序都以一个单个进程——master thread开始,master threads按顺序执行知道遇到第一个并行区域
  • Fork:主线程创造一个并行线程组
  • Join:当线程组完成并行区域的语句时,它们同步、终止,仅留下主线程

数据范围

  • 由于OpenMP时是共享内存模型,默认情况下,在共享区域的大部分数据是被共享的
  • 并行区域中的所有线程可以同时访问这个共享的数据
  • 如果不需要默认的共享作用域,OpenMP为程序员提供一种“显示”指定数据作用域的方法

嵌套并行

  • API提供在其它并行区域放置并行区域
  • 实际实现也可能不支持

简单使用

具体的:新建一个C/C++程序,注意一定要加上<omp.h>头文件。

写一个并行的Hello World

#include <omp.h>
#include <stdio.h>
#include <stdlib.h>int main()
{int nthreads, tid;/* Fork a team of threads giving them their own copies of variables */#pragma omp parallel private(nthreads, tid){/* Obtain thread number */tid = omp_get_thread_num();printf("Hello World from thread = %d\n", tid);/* Only master thread does this */if (tid == 0){nthreads = omp_get_num_threads();printf("Number of threads = %d\n", nthreads);}}  /* All threads join master thread and disband */return 0;
}

也可以直接使用gcc加上-fopenmp编译,For example:

 g++ test.cpp -o test -fopenmp
./test
gcc test.cpp -o test -fopenmp -lstdc++

OpenMP入门教程(一)hello world相关推荐

  1. OpenMP入门教程

    OpenMP入门教程 OpenMP API概述 OpenMP由三部分组成: 编译指令(19) 运行时库程序(32) 环境变量(9) 后来的API包含同样的三个组件,只是三者的数量都有所增加. 编译器指 ...

  2. 【转】OpenMP 入门教程

    [转]OpenMP 入门教程 来自:https://www.cnblogs.com/ospider/p/5265975.html posted on 2018-08-08 09:22 时空观察者9号 ...

  3. OpenMP入门教程(二)reduce sum

    link 代码在git #include <iostream> #include <math.h> #include <omp.h>using namespace ...

  4. C++ 高性能计算之多线程简单基础入门教程

    C/C++ 高性能计算之多线程简单基础入门教程 比起别人的盲目罗列函数接口,鹦鹉学舌式的解释每一个输入参数和输出参数,一味求全而无重点,我的文章更侧重于入门知识的讲解,宁缺毋滥,只有一些最简单的入门用 ...

  5. Kafka入门教程与详解

    1 Kafka入门教程 1.1 消息队列(Message Queue) Message Queue消息传送系统提供传送服务.消息传送依赖于大量支持组件,这些组件负责处理连接服务.消息的路由和传送.持久 ...

  6. 【CV】Pytorch一小时入门教程-代码详解

    目录 一.关键部分代码分解 1.定义网络 2.损失函数(代价函数) 3.更新权值 二.训练完整的分类器 1.数据处理 2. 训练模型(代码详解) CPU训练 GPU训练 CPU版本与GPU版本代码区别 ...

  7. python tornado教程_Tornado 简单入门教程(零)——准备工作

    前言: 这两天在学着用Python + Tornado +MongoDB来做Web开发(哈哈哈这个词好高端).学的过程中查阅了无数资料,也收获了一些经验,所以希望总结出一份简易入门教程供初学者参考.完 ...

  8. python向量计算库教程_NumPy库入门教程:基础知识总结

    原标题:NumPy库入门教程:基础知识总结 视学算法 | 作者 知乎专栏 | 来源 numpy可以说是 Python运用于人工智能和科学计算的一个重要基础,近段时间恰好学习了numpy,pandas, ...

  9. mysql query browswer_MySQL数据库新特性之存储过程入门教程

    MySQL数据库新特性之存储过程入门教程 在MySQL 5中,终于引入了存储过程这一新特性,这将大大增强MYSQL的数据库处理能力.在本文中将指导读者快速掌握MySQL 5的存储过程的基本知识,带领用 ...

最新文章

  1. 《百面机器学习》---AI算法工程师求职必备“面经”
  2. 【融云分析】如何实现分布式场景下唯一 ID 生成?
  3. php编译工具 知乎,关于知乎回答问题编辑框用Ctrl+V 粘贴图片是如何实现的详解...
  4. 获取最大轮廓 opencv
  5. jQuery实现表格隔行换颜色:
  6. Windows中的进程和线程
  7. 脉冲编码调制pcm matlab,基于MATLAB的脉冲编码调制PCM
  8. 更改VS2010,VS2008,VS2012等指定默认浏览器操作方式
  9. Java基础之十年面试杂记
  10. Go语言:运行代码报错main redeclared in this block previous declaration at .\test.go:5:6
  11. es java 实现should must filter组合查询
  12. 常用 EPSG 编号对应的投影信息
  13. 一个开源的 Markdown 在线编辑器
  14. 计讯物联防潮产品,无惧恶劣环境
  15. juniper防火墙定义策略生效时间
  16. 电热毯亚马逊欧洲站CE认证审核标准解析
  17. matlab绘图崩溃,重新采用硬件加速绘图
  18. 程序员去外包的后遗症是什么
  19. kotlin中的var和val与编译时常量
  20. Python循环结构基础-continu/break

热门文章

  1. 七、Linux串口编程
  2. Class.getResourceAsStream和ClassLoader.getResourceAsStream方法
  3. Oracle APEX 系列文章7:Oracle APEX 18.1 新特性
  4. 南安出台行动方案推进智慧城市建设
  5. Socket编程基本流程实践
  6. web页面事件无响应,元素点击不到
  7. xcode 本地git代码管理
  8. func_num_args()
  9. oracle 查看索引类别以及查看索引字段被引用的字段方法
  10. 使用python xmodem 模块下载及上传文件