(一)、openMP简述

  • Open Multiprocessing (OpenMP) 框架是一种功能极为强大的规范,可以帮助您利用 C、C++ 和 Fortran 应用程序中的多个核心带来的好处,是基于共享内存模式的一种并行编程模型, 使用十分方便, 只需要串行程序中加入OpenMP预处理指令, 就可以实现串行程序的并行化。

(二)、openMP简单使用

1、简单的HelloWord程序

  • #include <iostream>
    int main()
    {
    #pragma omp parallel
    {
    std::cout << "Hello World!\n";
    }
    }
  • #pragma omp parallel 仅在您指定了 -fopenmp 编译器选项后才会发挥作用。在编译期间,GCC 会根据硬件和操作系统配置在运行时生成代码,创建尽可能多的线程。
  • 只运行 g++ hello.cpp,只会打印出一行Hello world!
  • 运行g++ hello.cpp -fopenmp,打印出12个Hello World!(12个是因为我用的是linux服务器默认分配的)
  • 运行结果
  • user@NLP ~/vsworksapce $ g++ hello.cpp
    user@NLP ~/vsworksapce $ ./a.out
    Hello World!
    user@NLP ~/vsworksapce $ g++ hello.cpp -fopenmp
    user@NLP ~/vsworksapce $ ./a.out
    Hello World!
    Hello World!
    Hello World!
    Hello World!
    Hello World!
    Hello World!
    Hello World!
    Hello World!
    Hello World!
    Hello World!
    Hello World!
    Hello World!

2、如何自定义线程数量

  • num_threads的设置
  • omp_set_num_threads()库函数的设置
  • #include <omp.h>
    #include <iostream>
    int main()
    {
    int number_threads = ;
    omp_set_num_threads(number_threads) //方法二
    #pragma omp parallel num_threads(number_threads) //方式一
    {
    std::cout << "Hello World!\n";
    }
    }
  • OMP_NUM_THREADS环境变量的设置 (Linux下:export OMP_NUM_THREADS=4)
  • 编译器默认实现(一般而言,不指定具体线程数量的情况下,默认实现的总线程数等于处理器的核心数)

3、parallel sections 编译指示

  • pragma omp sectionspragma omp parallel之间的代码将由所有线程并行运行。pragma omp sections之后的代码块通过pragma omp section进一步被分为各个子区段。每个pragma omp section块将由一个单独的线程执行。但是,区段块中的各个指令始终按顺序运行。
  • #include <iostream>
    int main()
    {
    #pragma omp parallel
    {
    std::cout << "parallel \n";
    #pragma omp sections
    {
    #pragma omp section
    {
    std::cout << "section1 \n";
    }
    #pragma omp section
    {
    std::cout << "sectio2 \n";
    std::cout << "after sectio2 \n";
    }
    #pragma omp section
    {
    std::cout << "sectio3 \n";
    std::cout << "after sectio3 \n";
    }
    }
    }
    } //运行结果
    user@NLP ~/vsworksapce $ g++ openMP12.cpp -fopenmp
    user@NLP ~/vsworksapce $ ./a.out
    parallel
    section1
    sectio2
    after sectio2
    sectio3
    after sectio3
    parallel
    parallel
    parallel
    parallel
    parallel
    parallel
    parallel
    parallel
    parallel
    parallel
    parallel

4、还有一些omp_get_wtime、for、while循环中的并行处理、OpenMP critical section、OpenMP实现锁和互斥、以及firstprivatelastprivate指令等一些  openMP的使用可以参考(https://www.ibm.com/developerworks/cn/aix/library/au-aix-openmp-framework/

(三)、openMP简单测试

1、简单的测试--不限制线程数量

  • #include <omp.h>
    #include <time.h>
    #include <iostream>
    #include <ctime>
    int main()
    {
    time_t start,end1;
    time( &start );
    int a = ;
    #pragma omp parallel for
    for (int i = ; i < ; ++i)
    {
    for (int j = ; j < ; j++);
    //std::cout<< a++ << std::endl;
    }
    time( &end1 );
    double omp_end = omp_get_wtime( );
    std::cout<<std::endl;
    std::cout<<"Time_used " <<((end1 - start))<<"s"<<std::endl;
    std::cout<<"omp_time: "<<((omp_end - omp_start))<<std::endl;
    return ;
    }
  • 从下面的图表可以看出使用openMP的运行时间明显少于不使用openMP。

2、简单的测试--限制线程数量

  • #include <omp.h>
    #include <time.h>
    #include <iostream>
    #include <ctime>
    int main()
    {
    time_t start,end1;
    time( &start );
    int a = ;
    double omp_start = omp_get_wtime( );
    #pragma omp parallel for num_threads(8)
    for (int i = ; i < ; ++i)
    {
    for (int j = ; j < ; j++);
    }
    time( &end1 );
    double omp_end = omp_get_wtime( );
    std::cout<<std::endl;
    std::cout<<"Time_used " <<((end1 - start))<<"s"<<std::endl;
    std::cout<<"omp_time: "<<((omp_end - omp_start))<<std::endl;
    return ;
    }
  • 从下面的图表能够看出,线程数量对程序运行时间也是有一定的影响的,影响的大小和程序运算数据量有关。

  3、简单测试--提升数据量,限制线程数量

  • #include <omp.h>
    #include <time.h>
    #include <iostream>
    #include <ctime>
    int main()
    {
    time_t start,end1;
    time( &start );
    int a = ;
    double omp_start = omp_get_wtime( );
    #pragma omp parallel for num_threads(12)
    for (int i = ; i < ; ++i)
    {
    for (int j = ; j < ; j++);
    }
    time( &end1 );
    double omp_end = omp_get_wtime( );
    std::cout<<std::endl;
    std::cout<<"Time_used " <<((end1 - start))<<"s"<<std::endl;
    std::cout<<"omp_time: "<<((omp_end - omp_start))<<std::endl;
    return ;
    }
  • 线程数量对程序的运行时间是有影响的,如果继续提升数据运算量,openMP的实验效果会更加明显。

4、简单测试--降低数据量,限制线程数量

  • #include <omp.h>
    #include <time.h>
    #include <iostream>
    #include <ctime>
    int main()
    {
    time_t start,end1;
    time( &start );
    int a = ;
    double omp_start = omp_get_wtime( );
    #pragma omp parallel for
    for (int i = ; i < ; ++i)
    {
    for (int j = ; j < ; j++);
    }
    time( &end1 );
    double omp_end = omp_get_wtime( );
    std::cout<<std::endl;
    std::cout<<"Time_used " <<((end1 - start))<<"s"<<std::endl;
    std::cout<<"omp_time: "<<((omp_end - omp_start))<<std::endl;
    return ;
    }
  • 当数据量很小的时候,使用或者不使用openMP对于程序的运行时间影响不大。

(四)、openMP学习参考

  • 通过 GCC 学习 OpenMP 框架:https://www.ibm.com/developerworks/cn/aix/library/au-aix-openmp-framework/
  • Guide into OpenMP : http://bisqwit.iki.fi/story/howto/openmp/

基于GCC的openMP学习与测试的更多相关文章

  1. 基于GCC的openMP学习与测试(2)

    一.openMP简单测试 1.简单测试(1) #include<omp.h> #include<time.h> #include<iostream> using n ...

  2. 基于linux下的NIST数字测试包安装过程

    基于linux下的NIST数字测试包安装过程 1. 首先解决windows文件不能粘贴到Ubuntu的问题 选择利用VMware Tools进行解决 打开虚拟机VMware Workstation,启 ...

  3. 从Theano到Lasagne:基于Python的深度学习的框架和库

    从Theano到Lasagne:基于Python的深度学习的框架和库 摘要:最近,深度神经网络以“Deep Dreams”形式在网站中如雨后春笋般出现,或是像谷歌研究原创论文中描述的那样:Incept ...

  4. 【转】基于 Android NDK 的学习之旅-----数据传输(引用数据类型)

    原文网址:http://www.cnblogs.com/luxiaofeng54/archive/2011/08/20/2147086.html 基于 Android NDK 的学习之旅-----数据 ...

  5. 基于 Keras 用深度学习预测时间序列

    目录 基于 Keras 用深度学习预测时间序列 问题描述 多层感知机回归 多层感知机回归结合"窗口法" 改进方向 扩展阅读 本文主要参考了 Jason Brownlee 的博文 T ...

  6. 基于OpenCL的深度学习工具:AMD MLP及其使用详解

    基于OpenCL的深度学习工具:AMD MLP及其使用详解 http://www.csdn.net/article/2015-08-05/2825390 发表于2015-08-05 16:33| 59 ...

  7. 测试开发:从0到1学习如何测试API网关

    本文来自我的一名学员分享 日常工作中,难免会遇到临危受命的情况,虽然没有这么夸张,但是也可能会接到一个陌生的任务,也许只是对这个概念有所耳闻.也许这个时候会感到一丝的焦虑,生怕没法完成领导交给的测试任 ...

  8. 语义分割:基于openCV和深度学习(二)

    语义分割:基于openCV和深度学习(二) Semantic segmentation in images with OpenCV 开始吧-打开segment.py归档并插入以下代码: Semanti ...

  9. 语义分割:基于openCV和深度学习(一)

    语义分割:基于openCV和深度学习(一) Semantic segmentation with OpenCV and deep learning 介绍如何使用OpenCV.深度学习和ENet架构执行 ...

随机推荐

  1. django处理cookie的机制

    title: django处理cookie的机制 tags: djaogo, cookie, session grammar_cjkRuby: true --- cookie的意义 在多数日常使用的网 ...

  2. 工频相位无线同步模块PSYN5000系列在高压设备状态检测和局部放电故障定位的应用方案

    关键词: PSYN5000,无线同步模块,工频相位,局部放电,在线监测,高压设备,设备状态,故障定位. 前言: 在电力监测领域,出于方便和安全考虑,有些系统不得不采用无线通信的方式,在这样一个无线通信 ...

  3. Win7添加php环境变量.

    1) "我的电脑"右键"属性"->高级系统设置->环境变量->系统变量->Path->编辑 2) 将PHP的执行路径的目录&quo ...

  4. MSIL实用指南-生成if...else...语句

    if...else...语句是非常重要的选择语句,它的生成一般需要ILGenerator的DefineLabel方法和MarkLabel方法,以及Brtrue_S和Br_S指令. 一.DefineLa ...

  5. 阿里云API网关(3)快速入门(调用 API)

    网关指南: https://help.aliyun.com/document_detail/29487.html?spm=5176.doc48835.6.550.23Oqbl 网关控制台: https ...

  6. 运维-替换kibana徽标

    作为一名纯运维人员,想更改kibana的徽标. 并不能像开发一样去看源码并修改源码. 所以我们可以替换徽标. 先来一个效果图.我的版本是5.5.1. 具体的修改过程: 在kibana安装路径下面. o ...

  7. java 中String类的常用方法总结,带你玩转String类。

    String类: String类在java.lang包中,java使用String类创建一个字符串变量,字符串变量属于对象.String类对象创建后不能修改,StringBuffer & St ...

  8. __new__ 单例

    a.实例化类 实例化一个类时 1. 创建一个对象,调用__new__方法,如果没有会调用父类的__new__方法 2. 调用__init__方法 3. 返回对象的引用 class Dog(object ...

  9. 深入浅出Lua虚拟机

    欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 作者:郑小辉 | 腾讯 游戏客户端开发高级工程师 写在前面:本文所有的文字都是我手工一个一个敲的,以及本文后面分享的Demo代码都是我一行一 ...

  10. poj 2945 Find the Clones

    https://vjudge.net/problem/POJ-2945 题意: 给出n个长度相同的DNA序列,如果一个DNA序列出现过两次,那么就有说明它被复制了一次.问被复制0次,1次,2次--n- ...