基于GCC的openMP学习与测试

Posted bamtercelboo

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了基于GCC的openMP学习与测试相关的知识,希望对你有一定的参考价值。

一、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 < 10; j++)
                j++;
        }
    }
    
    int main()
    {
        time_t start,end1;
        time( &start );
        double omp_start = omp_get_wtime( );
        int N = 100000000;
        int i,j;
        #pragma omp parallel
        for(int m = 0; m < N ; m++)
        {
            openMP();
    
        }
    
       double omp_end = omp_get_wtime( );
        time( &end1 );
        std::cout<<"used_times "<<end1 - start<<"\\n";
       std::cout<<"omp_times "<<omp_end - omp_start<<"\\n";
    
        return 0;
    }
    View Code

 

  •     
  • 从上面可以看出,使用openMP并行化程序并没有比不使用openMP的要快,甚至线程数量越大的情况下,运行时间反而越长。
  • 这是因为,数据量巨大,线程数量越多的时候,程序分配并行程序的时间越多,导致程序的运行时间变慢。这种情况下,使用openMP设置的线程数量越多,效果会越差。

    3、简单测试(2)

  • #include<omp.h>
    #include<time.h>
    #include<iostream>
    using namespace std;
    
    void openMP()
    {
        int i,j;
        for(i=0; i<200000000; i++)
        {
            for( j = 0; j < 100; j++)
                j++;
        }
    }
    
    int main()
    {
        time_t start,end1;
        time( &start );
        double omp_start = omp_get_wtime( );
        int N = 1;
        int i,j;
        #pragma omp parallel for
        for(int m = 0; m < N ; m++)
        {
            openMP();
    
        }
    
       double omp_end = omp_get_wtime( );
        time( &end1 );
        std::cout<<"used_times "<<end1 - start<<"\\n";
       std::cout<<"omp_times "<<omp_end - omp_start<<"\\n";
    
        return 0;
    }
    View Code
  • 从上面的图表可以看出,使用openMP以及扩大线程数量与不使用openMP的程序运行时间相差无几
  • 这是因为循环一次的情况下,openMP无论设置了多少个线程,所使用的CPU利用率,系统最大会分配给100%,也就是一个线程的CPU利用率,也就和不使用openMP没有什么差别,这种情况下,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学习与测试的主要内容,如果未能解决你的问题,请参考以下文章

通过 GCC 学习 OpenMP 框架

如何正确升级OpenMP版本?

使用 OpenMP 4.0 (gcc 4.8.4) 而不是 OpenMP 3.1 (gcc 4.9.2) 时速度会降低

存储在数组中的值在OpenMP gcc中更改

我是不是必须在 Ubuntu 18.04 上从源代码构建 gcc-10 才能卸载 OpenMP GPU 目标?

并行程序设计导论学习笔记——OpenMP