zoukankan      html  css  js  c++  java
  • 一个使用Intel® Parallel Studio优化Minibench的例子

    COSBI OpenSourceMark是清晰的,全面的开放源码的基准,Windows*的图形用户界面框架,许多测试是在Delphi中写于2005年,但现在大部分测试支持Visual Studio* CC + + 。开发者可以从http://sourceforge.net/projects/opensourcemark/files/ 下载miniBench_v1.0 for Visual Studio* 2005 (cosbi.zip) 

    如果你的开发环境是Visual Studio* 2008,miniBench.sln转换为支持的格式并不太困难。

     

    miniBench 包含了很多测试子集,如FFT,Fibonacci,Flops,Linpack,等。使用”minBench.exe –help” 可以看到所有子集的列表。 这里,仅对Linpack子集的代码进行分析,以期抛砖引玉之意。 

    使用Intel® Parallel Amplifier (http://software.intel.com/en-us/intel-parallel-studio-home/) 可以知道cLinpack::daxpy() 占用了很多时间,而且代码是串行的。

     

    Figure-1

     

     深入调查代码行的性能数据,可知循环体的代码可以被串行化。

     Figure-2

     

     先记录一下优化前的数据,

     MiniBench.exe Linpack

    ……

    =====================================

    Total elapsed time: 157.17 s.

    CLOCKS_PER_SEC: 1000

    miniBench benchmark completed.

     

    在源代码前加入OpenMP的代码,使之并行化。(我使用的是Intel® Core i7 处理器,4个核带超线程)

     

     if( mRolling == eRolled )

     {

    omp_set_num_threads(8);

    #pragma omp parallel for schedule(static, 4)

            for (i = 0;i < n; i++)

            {

                    dy[i] = dy[i] + da*dx[i];

            }

     } else

     {

            m = n % 4;

            if ( m != 0)

            {

                    for (i = 0; i < m; i++)

                            dy[i] = dy[i] + da*dx[i];                       

                    if (n < 4) return;

            }

    #pragma omp parallel for schedule(static, 4)

            for (i = m; i < n; i++ /*i = i + 4*/)

            {

                    dy[i] = dy[i] + da*dx[i];

    //                dy[i+1] = dy[i+1] + da*dx[i+1];

    //                dy[i+2] = dy[i+2] + da*dx[i+2];

    //                dy[i+3] = dy[i+3] + da*dx[i+3];

    //                

            }

     } // if

     

    在编译之前,需加入”OpenMP Support” C/C++ - "Language"

     

    Figure-3

     

    还需要加上编译器的开关”/Qopenmp-report2” (我使用的是Intel(R) Parallel Composer)

    Figure-4

      

    这样你就可以看到并行化是否成功了。

    Fiugure-5

     

    最后重新运行程序,比较结果。有些提高,但是有限-可能是每次函数调用,循环的次数只有”99”

     

    MiniBench.exe Linpack

    ……

    =====================================

    Total elapsed time: 152.47 s.

    CLOCKS_PER_SEC: 1000 

    miniBench benchmark completed.

     

    有兴趣的同仁可以按照以上方法,修改其它的测试子集。

  • 相关阅读:
    IOS 作业项目(1) 关灯游戏 (百行代码搞定)
    Object-C 基础笔记5---Category
    Object -c基础知识(5)--release 之后 retainCount为何为1
    Foundation--NSString , array and Dictionary
    Foundation--结构体
    Object-C 基础笔记4---ARC内存管理
    141. Linked List Cycle
    139. Word Break
    138. Copy List with Random Pointer
    133. Clone Graph
  • 原文地址:https://www.cnblogs.com/shihao/p/2219118.html
Copyright © 2011-2022 走看看