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.

     

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

  • 相关阅读:
    Struts2SpringHibernate整合示例,一个HelloWorld版的在线书店(项目源码+详尽注释+单元测试)
    Java实现蓝桥杯勇者斗恶龙
    Java实现 LeetCode 226 翻转二叉树
    Java实现 LeetCode 226 翻转二叉树
    Java实现 LeetCode 226 翻转二叉树
    Java实现 LeetCode 225 用队列实现栈
    Java实现 LeetCode 225 用队列实现栈
    Java实现 LeetCode 225 用队列实现栈
    Java实现 LeetCode 224 基本计算器
    Java实现 LeetCode 224 基本计算器
  • 原文地址:https://www.cnblogs.com/shihao/p/2219118.html
Copyright © 2011-2022 走看看