(一)、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. 使用URL访问http服务器

    一.概念定义 1.URI - 通用资源标识符 URI通常由三部分组成, 资源访问机制 存放资源的主机名 资源自身名称 如: http://www.baidu.com/html http://www.b ...

  2. linux环境安装mysql,以及mysql基本的终端操作命令

    linux环境下安装mysql服务器.客户端mysql简单的终端操作指令(使用数据库.简单的增删改查和备份恢复)1 SQL: Structured Query Language 结构化查询语言. 运用 ...

  3. 南京邮电大学java第一次实验报告

    实 验 报 告 ( 2017 / 2018学年 第2学期) 课程名称 JAVA语言程序设计 实验名称 Java集成开发环境的安装与使用. Java变量.表达式与控制结构 实验时间 2018 年 4 月 ...

  4. POJ- 1094 Sorting It All Out---拓扑排序是否唯一的判断

    题目链接: https://vjudge.net/problem/POJ-1094 题目大意: 该题题意明确,就是给定一组字母的大小关系判断他们是否能组成唯一的拓扑序列.是典型的拓扑排序,但输出格式上 ...

  5. [转]Python爬虫框架--pyspider初体验

    标签: python爬虫pyspider 2015-09-05 10:57 9752人阅读 评论(0) 收藏 举报  分类: Python(8)  版权声明:本文为博主原创文章,未经博主允许不得转载. ...

  6. SQL Server 2008 R2 安装注意事项

    上个星期自己第一次安装SQL Server 2008 R2,安装失败几次,结果用了将近1天的时间安装,最后成功了. 心得:1.安装SQL Server 2008 R2时,最好在第一次就安装成功.在百度 ...

  7. JQ五星好评效果

    $(".list-txt ul").find("li").click(function(){    if($(this).index()==0){       ...

  8. [LeetCode] Sliding Window Median 滑动窗口中位数

    Median is the middle value in an ordered integer list. If the size of the list is even, there is no ...

  9. mysql5.5以上 用户的操作

    mysql5.5以上 用户的操作(转)   1.创建用户 create user 'username'@'host' identified by 'password'; 参数说明: username: ...

  10. 【webstorm使用手册】如何安装插件

    Files->Settings, 搜索"plugin",如图,