OpenMp是由OpenMP Architecture Review Board牵头提出的,并已被广泛接受的,用于共享内存并行系统的多线程程序设计的一套指导性的编译处理方案(Compiler Directive)。OpenMP支持的编程语言包括C语言C++Fortran;而支持OpenMp的编译器包括Sun Compiler,GNU Compiler和Intel Compiler等。OpenMp提供了对并行算法的高层的抽象描述,程序员通过在源代码中加入专用的pragma来指明自己的意图,由此编译器可以自动将程序进行并行化,并在必要之处加入同步互斥以及通信。当选择忽略这些pragma,或者编译器不支持OpenMp时,程序又可退化为通常的程序(一般为串行),代码仍然可以正常运作,只是不能利用多线程来加速程序执行。
中文名

共享存储并行编程
外文名

Open Multi-Processing
提出人

OpenMP Architecture 
类    型

支    持

 

1简介编辑

OpenMp提供的这种对于并行描述的高层抽象降低了并行编程的难度和复杂度,这样程序员可以把更多的精力投入到并行算法本身,而非其具体实现细节。对基于数据分集的多线程程序设计,OpenMP是一个很好的选择。同时,使用OpenMP也提供了更强的灵活性,可以较容易的适应不同的并行系统配置。线程粒度和负载平衡等是传统多线程程序设计中的难题,但在OpenMp中,OpenMp库从程序员手中接管了部分这两方面的工作。
但是,作为高层抽象,OpenMp并不适合需要复杂的线程间同步和互斥的场合。OpenMp的另一个缺点是不能在非共享内存系统(如计算机集群)上使用。在这样的系统上,MPI使用较多。

2基本使用编辑

要在Visual C++2005 中使用OpenMP其实不难,只要将 Project 的Properties中C/C++里Language的OpenMP Support开启(参数为 /openmp),就可以让VC++2005 在编译时支持OpenMP 的语法了;而在编写使用OpenMP 的程序时,则需要先include OpenMP的头文件:omp.h。
而要将 for 循环并行化处理,该怎么做呢?非常简单,只要在前面加上一行
#pragma omp parallel for
就够了!
也可以实际用一段简单的程序,来弄清楚它的运作方式。
#include <STDIO.H>
#include <STDLIB.H>
void Test(int n) {
for(int i = 0; i < 10000; ++i) {
//do nothing, just waste time
}
printf("%d, ", n);
}
int main(int argc,char* argv[]) {
for(int i = 0; i < 10; ++i)
Test(i);
system("pause");
}
上面的程序,在 main() 是一个很简单的回圈,跑十次,每次都会调用Test()这个函数,并把是回圈的执行次数(i)传进Test() 并打印出来。想当然,它的结果会是:
0, 1, 2, 3, 4, 5, 6, 7, 8, 9,
而如果想利用 OpenMP把 main() 里面的回圈平行化处理呢?只需要修改成下面的样子:
#include <omp.h>
#include <stdio.h>
#include <stdlib.h>
void Test (int n) {
for(int i = 0; i < 10000; ++i) {
//do nothing, just waste time
}
printf("%d, ", n);
}
int main(int argc,char* argv[]) {
#pragma omp parallel for
for(int i = 0; i < 10; ++i)
Test( i );
system("pause");
}
够简单吧?重头到尾,只加了两行!而执行后,可以发现结果也变了!
0, 5, 1, 6, 2, 7, 3, 8, 4, 9,
可以从结果很明显的发现,他没有照着0到9的顺序跑了!而上面的顺序怎么来的?其实很简单,OpenMP只是把回圈 0 - 9 共十个步骤,拆成 0 - 4, 5 - 9 两部份,丢给不同的执行绪去跑,所以数字才会出现这样交错性的输出~
而要怎么确定真的有跑多执行绪呢?如果本来有多处理器多核心处理器或有 Hyper Thread 的话,一个单执行绪程序,最多只会把一颗核心的使用量吃完;像比如说在 Pentium 4 HT 上跑,单一执行绪的程序,在工作管理员中看到的 CPU使用率最多就是 50%。而利用 OpenMP 把回圈进行平行化处理后,就可以在执行回圈时,把两颗核心的 CPU 都榨光了!也就是CPU使用率是100%。

3相关信息编辑

多执行绪的概念
OpenMP是作为共享存储标准而问世的。它是为在多处理机上编写并行程序而设计的一个应用编程接口。它包括一套编译指导语句和一个用来支持它的函数库。
当今双核、四核的 CPU 当道,而六核的CPU也已经面世多时,所以在多处理机上编写、运行并行程序会变得相当普遍。
对于一般单一执行绪(single thread)的程式,多核心处理器并没有办法提升它的处理效能;不过对於多执行绪(multi thread)的程式,就可以透过不同的核心同时计算,来达到加速的目的了!简单的例子,以单执行绪的程式来说,一件事做一次要十秒的话,要做十次,都丢给同一颗核心做的话,自然就是 10 秒 * 10 次,也就是 100 秒了;但是以多执行绪的程式来说,它可以把这一件事,分给两颗核心各自做,每颗核心各做 5 次,所以所需要的时间就只需要 50 秒!
当然,多执行绪的程式实际上没这么简单。在工作的切割、结合上,也是要多花时间的,所以在现实中,即使最佳状况,双核心的效能也不会是 1 + 1 = 2 这样的理想化。除此之外,也不是所有工作都是可以切割的!很多工作是有关联性的,这样如果直接切割给不同的处理核心各自去并行运算,出来的结果是肯定有问题的。而且,多执行绪的程式在编写、维护上,也都比单一执行绪的程式复杂上不少。
不过,如果电脑本身是多处理器多核心处理器,或是处理器拥有像 IntelHyper-ThreadingTechnology 这类的能在同一个时间处理多个执行绪的功能的话,那把各自独立的工作由单一执行绪改成多执行绪,在执行的效率上,大多还是会有增进的!
多执行绪的程式
写程序的时候该怎么去写多线程的程序呢?一般的方法,就是真的利用线程的控制,去实际在程式中去产生其他的线程来处理。像 POSIX Threads 这套 library,就是用来产生、控制执行绪的函式库。而像 Microsoft VisualStudio 2005 中,也有提供控制线程的功能。这种方法,大多就是产生多个 thread,而再由主线程把工作拆开,分给子线程去运算,最后再由主线程回收结果、整合。
但是,实际上要去控制线程是蛮麻烦的,在程序的编写上,也会复杂不少;而如果我们只是想要把一些简单的循环并行化处理,用线程库来控制,实在有点杀鸡用牛刀的感觉。这时候,用Open MP就简单多了!OpenMP 是一种能透过高阶指令,很简单地将程式并行化、多线程化的 API;在最简单的情形,甚至可以只加一行指令,就可以将循环内的程序并行化处理了!
 

并行计算

概论
▪ 高性能计算 ▪ 计算机集群 ▪ 分布式计算 ▪ 网格计算
▪ 云端运算      
 
方式
▪ Bit-level parallelism ▪ Instruction level parallelism ▪ Data parallelism ▪ 任务并行
 
理论
▪ Speedup ▪ Amdahl定理 ▪ Flynn's taxonomy ▪ Cost efficiency
▪ Gustafson定理 ▪ Karp-Flatt metric    
 
元素
▪ 进程 ▪ 线程 ▪ Fiber ▪ PRAM模型
 
协调
▪ 多处理 ▪ 多执行绪 ▪ 超执行绪 ▪ 内存一致性
▪ Cache coherency ▪ Barrier ▪ 同步化 ▪ Application checkpointing
 
编程
▪ Programming model ▪ Implicit parallelism ▪ Explicit parallelism  
 
硬件
▪ 贝奥武夫机群 ▪ 对称多处理机 ▪ Asymmetric multiprocessing ▪ Simultaneous multithreading
▪ 非均匀访存模型 ▪ Cache only memory architecture ▪ 共享内存 ▪ Distributed memory
▪ Distributed shared memory ▪ 超纯量 ▪ 向量处理机 ▪ 超级计算机
▪ Stream processing ▪ 通用图形处理器 (GPGPU)    
 
APIs
▪ POSIX Threads ▪ OpenMP ▪ 讯息传递接口 (MPI) ▪ Intel Threading Building Blocks
 
问题

▪ Embarrassingly parallel ▪ Grand Challenge ▪ Software lockout ▪ 可扩放性
▪ 竞争危害 ▪ 死锁 ▪ 确定性算法

OpenMp 基本的更多相关文章

  1. 应用OpenMP的一个简单的设计模式

    小喵的唠叨话:最近很久没写博客了,一是因为之前写的LSoftmax后馈一直没有成功,所以在等作者的源码.二是最近没什么想写的东西.前两天,在预处理图片的时候,发现处理200w张图片,跑了一晚上也才处理 ...

  2. openmp 的使用

    http://blog.csdn.net/gengshenghong/article/details/7003110 说明:这部分内容比较基础,主要是分析几个容易混淆的OpenMP函数,加以理解. ( ...

  3. OpenMP编程总结表

    本文对OpenMP 2.0的全部语法——Macro(宏定义).Environment Variables(环境变量).Data Types(数据类型).Compiler Directives(编译指导 ...

  4. OpenMP共享内存并行编程详解

    实验平台:win7, VS2010 1. 介绍 平行计算机可以简单分为共享内存和分布式内存,共享内存就是多个核心共享一个内存,目前的PC就是这类(不管是只有一个多核CPU还是可以插多个CPU,它们都有 ...

  5. OpenMP并行构造的schedule子句详解 (转载)

    原文:http://blog.csdn.net/gengshenghong/article/details/7000979 schedule的语法为: schedule(kind, [chunk_si ...

  6. 利用OpenMP实现埃拉托斯特尼(Eratosthenes)素数筛法并行化 分类: 算法与数据结构 2015-05-09 12:24 157人阅读 评论(0) 收藏

    1.算法简介 1.1筛法起源 筛法是一种简单检定素数的算法.据说是古希腊的埃拉托斯特尼(Eratosthenes,约公元前274-194年)发明的,又称埃拉托斯特尼筛法(sieve of Eratos ...

  7. 大数据并行计算利器之MPI/OpenMP

    大数据集群计算利器之MPI/OpenMP ---以连通域标记算法并行化为例 1 背景 图像连通域标记算法是从一幅栅格图像(通常为二值图像)中,将互相邻接(4邻接或8邻接)的具有非背景值的像素集合提取出 ...

  8. android studio ndk使用openMP

    好久没碰ndk了,之前都是在eclipse下写makefile配置c++程序的,现在发现主流都是用android studio,eclipse俨然已经被遗弃了,正好最近项目需要用openMP做算法加速 ...

  9. opencv 3.0 DPM Cascade 检测 (附带TBB和openMP加速)

    opencv 3.0 DPM cascade contrib模块 转载请注明出处,楼燚(yì)航的blog,http://www.cnblogs.com/louyihang-loves-baiyan/ ...

  10. openMP的一点使用经验【非原创】

    按照百科上说的,针对于openmp的编程,最简单的就是在开头加个#include<omp.h>,然后在后面的for上加一行#pragma omp parallel for即可,下面的是较为 ...

随机推荐

  1. 如何解决svn图标不显示呢?

    svn图标不显示解决 确保设置正确: 右键->TortoiseSVN->setting->Icon Overlays->Status cache->default/She ...

  2. mybati之day02

    今天开始讲解mybatis的第二天内容  一,拼接sql 在mapper.xml中,会多次使用到同一条sql片段,这时为了简便书写,将其定义出来 <sql id="base_sql&q ...

  3. NumberBox( 数值输入框) 组件

    本节课重点了解 EasyUI 中 NumberBox(数值输入框)组件的使用方法,这个组件依赖于 ValidateBox(验证框)组件.一. 加载方式//class 加载方式<input typ ...

  4. 关于SQL中数据类型(float和real)和 .NET Framework 中数据类型(float和double)的问题

    今天同学写程序遇到一个问题,MSSQL里的数据是 float 类型,在 .NET Framework 中用的时候也转换成 float 类型,结果报错,类型转换异常,明明是相同的类型,为什么会异常 在w ...

  5. statusBarOrientation设备状态

    判断设备的状态   UIApplication* app = [UIApplication sharedApplication]; // 判断设备方向状态,做响应的操作 if(app.statusBa ...

  6. iOS_SN_百度地图基本使用(1)

    上次用了一次百度地图,一直没有记笔记,今天记一笔. 以前没有用过百度地图的时候,听做这方面的朋友说百度地图有不少的坑,但是我做的时候没有遇到太大的坑,主要是要注意官方文档的注意事项,还有配置环境开发中 ...

  7. 关于textarea标签在谷歌跟火狐可以拖动大小

    关于textarea标签在谷歌和火狐可以拖动大小 而在IE是不会出现这种情况的 解决的方法:我们给这个标签加个 resize: none; 就可以解决了

  8. linux上 安装并 运行opencv

    我是在树莓派上安装的. 1.先安装依赖项 OpenCV 2.2以后版本需要使用Cmake生成makefile文件,因此需要先安装cmake. sudo apt-get install build-es ...

  9. CentOS 7 之找回失落的ifconfig

    自5号凌晨安装完centos7 minimal之后,一直没有机会时间(懒惰)来玩玩这个,实在惭愧,今天是周六,天下着小雨,所以收拾一下心情来学学一下这个系统: 开机登陆进去,想看看ip多少,于是很自然 ...

  10. ECstore报表不显示解决

    最近研究ECSTORE发现后台报表显示空白,Google了一下发现N多统一的做法,直接往表里插几条数据.呵呵,更深入一点 1.要显示报表功能首先要确保已经配置好contab的定时任务,定时任务能够执行 ...