OpenMP

转载 2015年11月18日 10:49:19

OpenMP

2008-8-10   version 1.0

 

1        简介

www.openmp.org

GNU的gomp项目;

Include <omp.h>;编译参数-fopenmp打开openmp,如果使用-lgomp则编译成单线程版本;

条件编译 #ifdef _OPENMP

声明并行区,由编译器和运行时库确定线程的创建、终止、调度和数量,并行区结束后线程挂起等待进入下一并行区;

Intel编译器的OMP开关,关上时将编译成非并行代码,-Qopenmp

2        将for并行化

#pragma omp parallel for

1,  比较操作不能为!=和==;

2,  步长必须为循环不变量;

3,  单入口单出口,不能有break和goto

循环多线程化需要避免“迭代相关”,要求循环执行的次序可以被任意打乱和组织,而不必安装常规的循环变量依次变化的方式执行;

循环并行化的一种方式是:把循环均分成n段,每段由一个线程并行执行;

消除迭代相关的一种方法:手动对循环分段,再使用section指令,每段一个section:

#pragma omp section

3        Private子句

将被多线程共享,而逻辑上独立的变量使用private;private变量会在每个线程中保存一个副本,并使用默认值初始化;

int x;

#pragma omp parallel for private(x)

for(…){

       x = …

}

上面也可以通过将x声明到循环体内解决

4        Schedule子句控制调度

schedule(kind[,chunksize])

l         static调度策略,循环被近乎均分的方式分配给各线程,一般不指定块大小;

l         dynamic,使用内部任务队列,线程执行完被分配的块后再从队列中取新的任务执行;

l         guided,与dynamic类似,但先取较大块后逐渐减小,以减少访问内部队列的次数;

l         runtime,运行时通过环境变量确定具体调度策略,如:

export OMP_SCHEDULE=dynamic,16

5        reduction子句

sum = 0

#pragma omp parallel for reduction(+:sum)

for(…)

       sum = sum + fun(k);

这样编译器生成每个线程的sum副本,并按一定规则附相应初始值,循环完成时再将它们合并到原始的sum变量;类似“+”的操作还可以有-/*/&/等;

6        Barrier栅障——线程同步

For循环与section结构中隐含使用了栅障,nowait子句去除它

#pragma omp for nowait

#pragma omp barrier            显示使用栅障

 

7        并行区中的串行区

只由一个线程执行一次

#pragma omp master            只由主线程执行

#pragma omp single              只由一个线程执行一次

8        临界区与原子操作

#pragma omp critical

#pragma omp critical(name)         命名临界区,这样该临界区就可以在多处被引用了

#pragma omp atomic                   只能是简单操作

9        函数

需要#include <omp.h>,不建议使用;

omp_set_num_threads(n)

omp_get_thread_num()                              线程编号

omp_get_num_procs()                               CPU数量

10  If子句

#pragma omp parallel for if(n>100)             n>100时才执行并行化

11  环境变量

OMP_SCHEDULE

OMP_NUM_THREADS                      默认线程数

 

 

OpenMP简介和计算实例

OpenMP是一种基于共享存储系统之上的并行编程标准,OpenMP标准提供了更为简单的编程模型,更易于编程,但是OpenMP完全依赖用户保证制导的正确性。本文以计算π值为例,给出4种OpenMP编程的...
  • u014768676
  • u014768676
  • 2015年04月15日 21:38
  • 1945

OPENMP 实现快速排序

// qwe.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include void quickSort(int *num,int low,...
  • laojiaqi
  • laojiaqi
  • 2014年06月22日 13:22
  • 2911

vs2013 openmp例子

OpenMP是一种面向共享内存以及分布式共享内存的多处理器多线程并行编程语言。 我的开发环境是Windows、VS2013、双核处理器。 2. 创建一个名为OpenMP的空控制...
  • judyge
  • judyge
  • 2015年04月14日 14:03
  • 2557

OpenMP入门(1)创建一个简单的OpenMP程序与其编译

在C/C++和Fortran中,都有编译器支持OpenMP,这里我们举一个简单的C程序的例子test.c :#ifdef _OPENMP #include #endifint main(){ #pr...
  • liuxingrui4p
  • liuxingrui4p
  • 2015年03月07日 18:00
  • 3137

OpenMP: 多线程文件操作

项目背景:       为了提升项目的运行效率,考虑多线程技术。最近OpenMP技术很热,咱也凑凑热闹,也为了充分发挥电脑硬件的能力。 硬件:      酷睿2双核 2.2GHz      3G 内存...
  • Augusdi
  • Augusdi
  • 2013年04月15日 22:29
  • 2011

OpenMP: OpenMP学习的几个例子

学习了openmp的使用方法,按照教程中的sample自己写了几个小代码。我的理解就是openMP对并行计算进行了抽象,使得程序员能很容易的写出并行计算的代码,并解决了线程粒度和负载均衡的问题。对比与...
  • Augusdi
  • Augusdi
  • 2013年04月15日 21:55
  • 1590

OpenMP: OpenMP并行程序设计

OpenMP并行程序设计(一)OpenMP是一个支持共享存储并行设计的库,特别适宜多核CPU上的并行程序设计。今天在双核CPU机器上试了一下OpenMP并行程序设计,发现效率方面超出想象,因此写出来分...
  • Augusdi
  • Augusdi
  • 2013年04月16日 09:27
  • 5596

使用OpenMP给程序加速

最近面试总是谈到效率问题,这个问题以前一直没考虑过,就是稀里糊涂的写。之前有看到过OpenMP,也不曾深究,看到这篇博客关于OpenMP写的非常详细,就转来慢慢学习吧。 OpenMP语法简介...
  • CSDNMicrosoftCSDN
  • CSDNMicrosoftCSDN
  • 2015年01月29日 20:53
  • 3130

OpenCV中OpenMP的使用

vs2010中调用openMP,并添加头文件#include   代码来源: 作者:gnuhpc 出处:http://www.cnblogs.com/gnuhpc/   #include "std...
  • wangyaninglm
  • wangyaninglm
  • 2015年03月02日 17:04
  • 4532

Xcode安装使用OpenMP

OpenMP是能让程序并行化的一个框架,在编写OpenCV程序的过程中,有很多关于图片的操作,非常耗时,但同时也存在大量可以并行的模块,我们在Xcode上集成OpenMP框架,并且通过简单的几行代码就...
  • lkj345
  • lkj345
  • 2016年11月13日 15:55
  • 2787
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:OpenMP
举报原因:
原因补充:

(最多只允许输入30个字)