OpenMP入门教程(一)
什么是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提供在其它并行区域放置并行区域
- 实际实现也可能不支持
动态线程
- API为运行环境提供动态的改变用于执行并行区域的线程数
- 实际实现也可能不支持
简单使用
在VS2017中就可以使用,具体的:新建一个C/C++程序,项目--属性--C/C++--语言--OpenMP支持,把OpenMP打开。然后编写带编译指令的并行程序,注意一定要加上<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 == )
{
nthreads = omp_get_num_threads();
printf("Number of threads = %d\n", nthreads);
} } /* All threads join master thread and disband */
return ;
}
运行结果如下:
注:我的电脑默认是4个线程,不同的电脑运行结果不同,就算是同一部电脑每次运行的结果也可能不同(4个线程并行执行,没有确定的先后顺序)
也可以直接使用gcc加上-fopenmp编译,For example:
g++ test.cpp -o test -fopenmp
./test
(不知道我的gcc不行,只能用g++,枯了)
补:直到原因了,gcc默认编译链接不会链接C++标准库,可以使用g++编译链接(如上),也可以在gcc链接时显示指定链接 -lstdc++
gcc test.cpp -o test -fopenmp -lstdc++
至于OpenMP详细的编写格式和意义可以看这篇博客。
参考资料:
1、https://blog.csdn.net/wyjkk/article/details/6612108
2、https://blog.csdn.net/HW140701/article/details/73716363
3、https://computing.llnl.gov/tutorials/openMP/#RunTimeLibrary
OpenMP入门教程(一)的更多相关文章
- OpenMP入门教程(三)
承接前面两篇,这里直接逐一介绍和使用有关OpenMP的指令和函数 Directives 1.for 作用:for指令指定紧随其后的程序的循环的迭代必须由团队并行执行,只是假设已经建立了并行区域,否则它 ...
- OpenMP 入门教程
前两天(其实是几个月以前了)看到了代码中有 #pragma omp parallel for 一段,感觉好像是 OpenMP,以前看到并行化的东西都是直接躲开,既然躲不开了,不妨研究一下: OpenM ...
- OpenMP入门教程(二)
OpenMP API概述 OpenMP由三部分组成: 编译指令(19) 运行时库程序(32) 环境变量(9) 后来的API包含同样的三个组件,只是三者的数量都有所增加. 编译器指令 OpenMP编译器 ...
- wepack+sass+vue 入门教程(三)
十一.安装sass文件转换为css需要的相关依赖包 npm install --save-dev sass-loader style-loader css-loader loader的作用是辅助web ...
- wepack+sass+vue 入门教程(二)
六.新建webpack配置文件 webpack.config.js 文件整体框架内容如下,后续会详细说明每个配置项的配置 webpack.config.js直接放在项目demo目录下 module.e ...
- wepack+sass+vue 入门教程(一)
一.安装node.js node.js是基础,必须先安装.而且最新版的node.js,已经集成了npm. 下载地址 node安装,一路按默认即可. 二.全局安装webpack npm install ...
- Content Security Policy 入门教程
阮一峰文章:Content Security Policy 入门教程
- gulp详细入门教程
本文链接:http://www.ydcss.com/archives/18 gulp详细入门教程 简介: gulp是前端开发过程中对代码进行构建的工具,是自动化项目的构建利器:她不仅能对网站资源进行优 ...
- UE4新手引导入门教程
请大家去这个地址下载:file:///D:/UE4%20Doc/虚幻4新手引导入门教程.pdf
随机推荐
- spring boot 使用过滤器
//启动类添加注解@ServletComponentScan package com.baiwang.invoice.utils; import java.io.IOException; import ...
- [Usaco2009 MAR] Earthquake Damage 2
[题目链接] https://www.lydsy.com/JudgeOnline/problem.php?id=1585 [算法] 一个最小割的经典模型 , 详见代码 时间复杂度 : O(dinic( ...
- 【转】浏览器中输入url后发生了什么
原文地址:http://www.jianshu.com/p/c1dfc6caa520 在学习前端的过程中经常看到这样一个问题:当你在浏览器中输入url后发生了什么?下面是个人学习过程中的总结,供个人复 ...
- Java-Runoob-高级教程-实例-字符串:12. Java 实例 - 字符串优化
ylbtech-Java-Runoob-高级教程-实例-字符串:12. Java 实例 - 字符串优化 1.返回顶部 1. Java 实例 - 字符串优化 Java 实例 以下实例演示了通过 Str ...
- 从0开始学习Hadoop(2)安装JDK
参考文档: 安装包方式安装:http://www.cnblogs.com/wuyudong/p/ubuntu-jdk8.html PPA方式安装:推荐 http://www.cnblogs.com/ ...
- bzoj3251
3251: 树上三角形 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 637 Solved: 262[Submit][Status][Discuss ...
- 51nod 1220 约数之和【莫比乌斯反演+杜教筛】
首先由这样一个式子:\( d(ij)=\sum_{p|i}\sum_{q|j}[gcd(p,q)==1]\frac{pj}{q} \)大概感性证明一下吧我不会证 然后开始推: \[ \sum_{i=1 ...
- UART、I2C、SPI三种协议对比
学嵌入式需要打好基础 下面我们来学习下计算机原理里的3种常见总线协议及原理 协议:对等实体之间交换数据或通信所必须遵守规则或标准的集合 1.UART(Universal Asynchronous Re ...
- nginx静态资源服务器简单配置
有时候我们可以把服务器的一些文件放在固定目录以便下载,比如image,css,js等.就可以使用nginx转发静态资源. 参考链接:https://blog.csdn.net/name_is_wl/a ...
- c语言程序设计案例教程(第2版)笔记(六)—字符串处理实例
字符串处理 功能描述:从键盘输入一个文本行后,为用户提供菜单选择,实现字符串一些操作——显示文本行.查找并替换指定子串.删除指定子串.统计指定子串数目. 实现代码: #include<stdio ...