基于GCC的openMP学习与测试

(一)、openMP简述

  • 随着CPU速度不再像以前那样显著提高,多核系统正变得越来越流行。为了利用这种能力,程序员在并行编程中变得很有知识变得越来越重要——让程序同时执行多个任务。Open Multiprocessing (OpenMP) 框架是一种功能极为强大的规范,可以帮助您利用 C、C++ 和 Fortran 应用程序中的多个核心带来的好处,是基于共享内存模式的一种并行编程模型, 使用十分方便, 只需要串行程序中加入OpenMP预处理指令, 就可以实现串行程序的并行化。
  • 现在,openMP支持不同的编译器,GCCClang++Solaris StudioIntel C CompilerMicrosoft Visual C++等。程序员在编程时,只需要在特定的源代码片段的前面加入OpenMP专用的 #pargma omp 预编译指令,就可以“通知”编译器将该段程序自动进行并行化处理,并且在必要的时候加入线程同步及通信机制。当编译器选择忽略#pargma omp预处理指令时,或者编译器不支持OpenMP时,程序又退化为一般的通用串行程序,此时,代码依然可以正常运作,只是不能利用多线程和多核CPU来加速程序的执行而已。

(二)、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服务器默认分配的
  • 运行结果
  • [email protected] ~/vsworksapce $ g++ hello.cpp
    [email protected] ~/vsworksapce $ ./a.out
    Hello World!
    [email protected] ~/vsworksapce $ g++ hello.cpp -fopenmp
    [email protected] ~/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 = 1;
      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 sections 和 pragma 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";
          }
        }
      }
    }
    //运行结果[email protected] ~/vsworksapce $ g++ openMP12.cpp -fopenmp[email protected] ~/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循环中的并行处理、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 = 0;
        #pragma omp parallel for
        for (int i = 0; i < 100; ++i)
        {
            for (int j = 0; j < 1000000000; 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 0;
    }
     
  • 使用openMp
  • 不使用openMP
  • 从代码的运行时间上可以看出使用openMP的运行时间明显少于不使用openMP。

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

  • 代码
  • #include <omp.h>
    #include <time.h>
    #include <iostream>
    #include <ctime>
    int main()
    {
        time_t start,end1;
        time( &start );
        int a = 0;
        double omp_start = omp_get_wtime( );
        #pragma omp parallel for num_threads(8)
        for (int i = 0; i < 100; ++i)
        {
            for (int j = 0; j < 1000000000; 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 0;
    }
    
  • 线程数量 = 12
  • 线程数量 = 8
  • 线程数量 = 4
  • 从线程数量测试结果能看出来,线程数量对程序运行时间也是有一定的影响的,影响的大小和程序运算数据量有关。

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

  • 代码
  • #include <omp.h>
    #include <time.h>
    #include <iostream>
    #include <ctime>
    int main()
    {
        time_t start,end1;
        time( &start );
        int a = 0;
        double omp_start = omp_get_wtime( );
        #pragma omp parallel for num_threads(12)
        for (int i = 0; i < 1000; ++i)
        {
            for (int j = 0; j < 1000000000; 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 0;
    }
    
  • 线程数量 = 4 或者,上面的是线程数量 = 4,下面的是线程数量 = 4,下面的是线程数量 = 12,能够看出来程序运行的时间是有一些差距的,如果继续提升数据运算量,openMP的实验效果会更加明显。

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

  • 代码
  • #include <omp.h>
    #include <time.h>
    #include <iostream>
    #include <ctime>
    int main()
    {
        time_t start,end1;
        time( &start );
        int a = 0;
        double omp_start = omp_get_wtime( );
        #pragma omp parallel for
        for (int i = 0; i < 1000; ++i)
        {
            for (int j = 0; j < 10000; 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 0;
    }
    
  • 当数据量很小的时候,使用或者不使用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/
时间: 2024-10-13 22:43:46

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

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

一.openMP简单测试 1.简述 openMP很多情况下对于利用多核处理器进行加速是很有效果的,然而,也有一些情况是openMP不但没有效果,甚至还有一些反作用. 2.简单测试(1) #include<omp.h> #include<time.h> #include<iostream> using namespace std; void openMP() { int i,j; for(i=0; i<200; i++) { for( j = 0; j < 1

基于 Android NDK 的学习之旅----- C调用Java

http://www.cnblogs.com/luxiaofeng54/archive/2011/08/17/2142000.html 基于 Android NDK 的学习之旅----- C调用Java许多成熟的C引擎要移植到Android 平台上使用 , 一般都会 提供 一些接口, 让Android sdk 和 jdk 实现. 下文将会介绍 C 如何 通过 JNI 层调用 Java 的静态和非静态方法. 1.主要流程 1.  新建一个测试类TestProvider.java a)       

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

原文网址:http://www.cnblogs.com/luxiaofeng54/archive/2011/08/20/2147086.html 基于 Android NDK 的学习之旅-----数据传输二(引用数据类型)(附源码) 基于 Android NDK 的学习之旅-----数据传输(引用数据类型) 接着上篇文章继续讲.主要关于引用类型的数据传输,本文将介绍字符串传输和自定义对象的传输. 1.主要流程 1.  String 字符串传输 a)         上层定义一个native的方法

基于Eclipse的Android JNI层测试应用开发过程记录

前言 本文记录一个Java层与JNI层参数与数据交互的应用程序开发过程,为实现一个功能完整的带Java与JNI的应用程序打下基础.本文假设读者已搭建好Android的Eclipse与NDK开发环境,包括通过ADB连接手机的配置. 1. 构建基本的Android应用程序 1.1 引导界面配置 打开Eclipse,"File"->"New"->"Android Application Project",在弹出界面,配置如下(红色框表示不是

OpenMP学习

当数据量较大或者时间复杂度高的时候,盲目地等待结果,开发效率极低. 听说OpenMP可以多核并行运算,加快运行速度.整理了一些OpenMP的资料,以待学习. 1.openMP的一点使用经验 2.OpenMP入门 3.OpenMP数据环境 4.第一次试用vc2010的openmp功能, 多线程并行执行for循环 5.关于linux环境下openmp的编程基础 6.通过GCC学习OpenMP框架 OpenMP学习,布布扣,bubuko.com

vue-cli 脚手架基于Nightwatch的端到端测试环境的过程

不同公司和组织之间的测试效率迥异.在这个富交互和响应式处理随处可见的时代,很多组织都使用敏捷的方式来开发应用,因此测试自动化也成为软件项目的必备部分.测试自动化意味着使用软件工具来反复运行项目中的测试,并为回归测试提供反馈. 端到端测试又简称E2E(End-To-End test)测试,它不同于单元测试侧重于检验函数的输出结果,端到端测试将尽可能从用户的视角,对真实系统的访问行为进行仿真.对于Web应用来说,这意味着需要打开浏览器.加载页面.运行JavaScript,以及进行与DOM交互等操作.

基于USB3.0的双目相机测试小结之CC1605配合CS5642 双目 500w摄像头

基于USB3.0的双目相机测试小结之CC1605配合CS5642  双目 500w摄像头 CC1605双目相机评估板可以配合使用柴草电子绝大多数摄像头应用 如:OV5640.OV5642.MT9P031.MT9V034.MT9M001.MT9F002等等 本次测试以CS5642V3摄像头为例,sensor为OV5642 测试分辨率为 1280*720:720p 1280*1024:SXGA 1920*1080:1080p 2048*1024 2048*1536:3M 测试帧率:15fps 一.U

一种基于动态插件系统的移动测试黑科技

百度MTC是业界领先的移动应用测试服务平台,为广大开发者在移动应用测试中面临的成本.技术和效率问题提供解决方案.同时分享行业领先的百度技术,作者来自百度员工和业界领袖等. 本文作者:hyxbiao && tony xin 背景 移动APP插件化是平台化产品解决系统限制(65535).模块解耦.和多团队协作的利器.它的最大特点是模块动态下发,给产品带来的收益显而易见,但是,在百度,这套系统给移动端测试技术带来了新思路 移动端线上问题定位的几个场景: 场景一: 云端用户反馈某功能不可用,RD猜

OpenMP 并行化处理测试

OpenMP 并行化处理测试 #pragma omp parallel for 这条语句是用来指定后面的for循环语句变成并行执行的,将for循环里的语句变成并行执行后效率会不会提高呢?还是测试一 下吧,测试的时候,循环最好大一些,增加计算量,不然程序耗时太短,很难区分. 1 #include <omp.h> 2 #include <stdio.h> 3 #include <sys/time.h> 4 void test() { 5 int a = 0; 6 for(i