openmp简单介绍以及使用实例(整理)
2017-03-25 11:37
423 查看
OpenMp是由OpenMP Architecture Review Board牵头提出的,并已被广泛接受的,用于共享内存并行系统的多处理器程序设计的一套指导性的编译处理方案(Compiler Directive)。OpenMP支持的编程语言包括C语言、C++和Fortran;而支持OpenMp的编译器包括Sun Compiler,GNU Compiler和Intel Compiler等。OpenMp提供了对并行算法的高层的抽象描述,程序员通过在源代码中加入专用的pragma来指明自己的意图,由此编译器可以自动将程序进行并行化,并在必要之处加入同步互斥以及通信。当选择忽略这些pragma,或者编译器不支持OpenMp时,程序又可退化为通常的程序(一般为串行),代码仍然可以正常运作,只是不能利用多线程来加速程序执行。
要在Visual C++2013 中使用OpenMP其实不难,只要将 Project 的Properties中C/C++里Language的OpenMP Support开启(参数为 /openmp),就可以让VC++2013 在编译时支持OpenMP 的语法了;而在编写使用OpenMP 的程序时,则需要先include OpenMP的头文件:omp.h。
而要将 for 循环并行化处理,该怎么做呢?非常简单,只要在前面加上一行
就够了!
也可以实际用一段简单的程序,来弄清楚它的运作方式。
上面的程序,在 main() 是一个很简单的回圈,跑十次,每次都会调用Test()这个函数,并把是回圈的执行次数(i)传进Test() 并打印出来。想当然,它的结果会是:
0, 1, 2, 3, 4, 5, 6, 7, 8, 9,
而如果想利用 OpenMP把 main() 里面的回圈平行化处理呢?只需要修改成下面的样子:
够简单吧?重头到尾,只加了两行!而执行后,可以发现结果也变了!
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%。
要在Visual C++2013 中使用OpenMP其实不难,只要将 Project 的Properties中C/C++里Language的OpenMP Support开启(参数为 /openmp),就可以让VC++2013 在编译时支持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%。
相关文章推荐
- mongodb简单介绍以及使用整理1
- mongodb简单介绍以及使用整理2
- 实例简单介绍SVN使用
- ArcGIS Runtime SDKs介绍以及简单的实例
- Core Animation基础介绍、简单使用CALayer以及多种动画效果
- XSD(XML Schema Definition)用法实例介绍以及C#使用xsd文件验证XML格式
- delphi下使用indy进件socket通信的简单实例介绍
- Dom 学习总结以及实例的使用介绍
- Core Animation基础介绍、简单使用CALayer以及多种动画效果
- JAVA线程池介绍以及简单实例
- win7生成生成Detours.lib以及简单使用实例
- win7生成生成Detours.lib以及简单使用实例
- Android深入浅出系列之实例应用—简单的手指拖动图片,图片滑来滑去显示应用Gallery和BaseAdapter以及ImageView的使用
- Core Animation基础介绍、简单使用CALayer以及多种动画效果
- C#关于log4net(Log For Net)的使用 简单说明以及介绍
- win7生成生成Detours.lib以及简单使用实例
- 约束类型介绍以及使用整理
- win7生成生成Detours.lib以及简单使用实例
- XSD(XML Schema Definition)用法实例介绍以及C#使用xsd文件验证XML格式
- CoreAnimation基础介绍、简单使用CALayer以及多种动画效果