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%。
  • 相关阅读:
    Leetcode Reverse Words in a String
    topcoder SRM 619 DIV2 GoodCompanyDivTwo
    topcoder SRM 618 DIV2 MovingRooksDiv2
    topcoder SRM 618 DIV2 WritingWords
    topcoder SRM 618 DIV2 LongWordsDiv2
    Zepto Code Rush 2014 A. Feed with Candy
    Zepto Code Rush 2014 B
    Codeforces Round #245 (Div. 2) B
    Codeforces Round #245 (Div. 2) A
    Codeforces Round #247 (Div. 2) B
  • 原文地址:https://www.cnblogs.com/duyy/p/3727224.html
Copyright © 2011-2022 走看看