zoukankan      html  css  js  c++  java
  • OpenMP基础使用

        OpenMP是CPU并行加速相关的编译处理方案,VS非常早的版本号就对其提供了支持,只是默认是关闭的。要开启这一支持。仅仅须要在项目的属性中设置就能够,详细选项为:配置属性->C/C++->语言 在右側列表中有一项“OpenMP 支持”。下拉选择“是(/openmp)”就能够了。

     
        事实上本人是在前几天才知道有这个东西存在的。朋友跟我说这个东西用起来相比正常的开启多线程要方便非常多。经过研究发现其确有方便之处。好吧,以下还是写一下它该怎么用吧,这里仅仅是写最主要的。当然后面用到相关的也会加上去。 

        在选择上面的选项之后。直接能够用“#pragma omp parallel for”标示给代码中的for循环加速,实比例如以下:

    #include <stdio.h> 
    #include <time.h>
    #include <stdlib.h>   
    
    void test()//纯粹浪费时间
    {
        int add = 0;
        for (int runtime = 0; runtime < 100000000; runtime++)
            add++;
        printf("%d
    ", add);
    }
    
    void main()
    {
        int beginClock = clock();//记录開始时间
    #pragma omp parallel for
        for (int testtime = 0; testtime<8; testtime++)
        {
            test();//执行计算
        }
        printf("执行时间为:%dms
    ", clock() - beginClock);//输出图像处理花费时间信息  
        system("pause");
    }
        在本人的四核八线程i7 CPU上,其执行消耗时间为261ms,假设删除掉“#pragma omp parallel for”,则执行花费时间为1816ms。相差接近七倍。而假设把main里面的循环次数改为9次。则花费时间变为477ms。可见其正的用上了CPU能支持的最多线程数(八条线程)进行了处理。 
        当然非常多须要并行的代码用for写起来会比較痛苦,这时能够用“#pragma omp parallel sections”标示将要并行运行的代码括起来,然后用”#pragma omp section”标示每一条线程的运行代码,示比例如以下:

    #include <stdio.h> 
    #include <time.h>
    #include <stdlib.h>   
    
    void test(int time)//纯粹浪费时间
    {
        int add = 0;
        for (int runtime = 0; runtime < 100000000; runtime++)
            add++;
        printf("%d
    ", time);
    }
    
    void main()
    {
        int beginClock = clock();//记录開始时间
    
        /*并行内容*/
    #pragma omp parallel sections
        {
            #pragma omp section
            {
                test(1);
            }
            #pragma omp section
            {
                test(2);
            }
            #pragma omp section
            {
                test(3);
            }
            #pragma omp section
            {
                test(4);
            }
        }
        /*并行内容*/
    
        printf("执行时间为:%dms
    ", clock() - beginClock);//输出图像处理花费时间信息  
        system("pause");
    }
        执行时间是211ms,也比单线程执行快了不少实现了并行加速。

     
        上面所说到的是OpenMP两个最为基础的使用,当然其功能远远不止这些,如怎样避免内存操作冲突之类的。后面假设实用到再放上来。





  • 相关阅读:
    servlet生命周期总结
    两周找工作有感
    PowerBuilder中新建PBL
    oracle navicat 可视化操作进行数据的修改
    oracle for update for update nowait
    表中字段为关键字,查询字段加引号
    愿你
    oracle安装注意
    随笔
    JeeSite功能模块解读,功能介绍,功能实现
  • 原文地址:https://www.cnblogs.com/yangykaifa/p/7380157.html
Copyright © 2011-2022 走看看