zoukankan      html  css  js  c++  java
  • openmp并行计算

    要在Visual C++2012 中使用OpenMP其实不难,只要将 Project 的Properties中C/C++里Language的OpenMP Support开启(参数为 /openmp),就可以让VC++2005 在编译时支持OpenMP 的语法了;而在编写使用OpenMP 的程序时,则需要先include OpenMP的头文件:omp.h。
    而要将 for 循环并行化处理,该怎么做呢?非常简单,只要在前面加上一行
    #pragma omp parallel for
    就够了!
    也可以实际用一段简单的程序,来弄清楚它的运作方式。
    #include <STDIO.H>
    #include <STDLIB.H>
    void Test(int n) {
    for(int i = 0; i < 10000; ++i)
    {
    //do nothing, just waste time
    }
    printf("%d, ", n);
    }
    int main(int argc,char* argv[])
    {
    for(int i = 0; i < 10; ++i)
    Test(i);
    system("pause");
    }
    上面的程序,在 main() 是一个很简单的回圈,跑十次,每次都会调用Test()这个函数,并把是回圈的执行次数(i)传进Test() 并打印出来。想当然,它的结果会是:
    0, 1, 2, 3, 4, 5, 6, 7, 8, 9,
    而如果想利用 OpenMP把 main() 里面的回圈平行化处理呢?只需要修改成下面的样子:
    #include <omp.h>//注释掉这个头文件也可以
    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
    void Test (int n) {
    for(int i = 0; i < 10000; ++i) {
    //do nothing, just waste time
    }
    printf("%d, ", n);
    }
    int main(int argc,char* argv[]) {
    clock_t t1=clock(); //开始时钟单位是毫秒
    #pragma omp parallel for
    for(int i = 0; i < 10; ++i)
    Test( i );
    clock_t t2=clock();//结束时钟
    double d=(double)(t2-t1)/CLOCKS_PER_SEC;//转化为秒
     cout<<d<<endl;
    system("pause");
    }
    够简单吧?重头到尾,只加了两行!而执行后,可以发现结果也变了!
    0, 5, 1, 6, 2, 7, 3, 8, 4, 9,
    可以从结果很明显的发现,他没有照着0到9的顺序跑了!而上面的顺序怎么来的?其实很简单,OpenMP只是把回圈 0 - 9 共十个步骤,拆成 0 - 4, 5 - 9 两部份,丢给不同的执行绪去跑,所以数字才会出现这样交错性的输出~
    而要怎么确定真的有跑多执行绪呢?如果本来有多处理器多核心处理器或有 Hyper Thread 的话,一个单执行绪程序,最多只会把一颗核心的使用量吃完;像比如说在 Pentium 4 HT 上跑,单一执行绪的程序,在工作管理员中看到的 CPU使用率最多就是 50%。而利用 OpenMP 把回圈进行平行化处理后,就可以在执行回圈时,把两颗核心的 CPU 都榨光了!也就是CPU使用率是100%。
  • 相关阅读:
    iOS:抽屉侧滑动画两种形式(1、UIView侧滑 2、ViewController侧滑)
    深入浅出 React Native:使用 JavaScript 构建原生应用
    JQuery:通过noConflict()方法同时使用jQuery 和其他框架
    JQuery AJAX: 了解jQuery AJAX
    iOS:iOS开发非常全的三方库、插件等等
    JavaScript:实现瀑布流
    iOS:crash崩溃日志分析
    敏捷开发一千零一夜
    江恩交易战法
    苹果:贩卖高科技的美学体验
  • 原文地址:https://www.cnblogs.com/duyy/p/3727224.html
Copyright © 2011-2022 走看看