一个使用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 (https://software.intel.com/zh-cn/intel-parallel-studio-xe/) 可以知道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® Parallel Composer)

 

Figure-4



 

  

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

 

Fiugure-5

 

 

 

 



 

 
 

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

 

 

 

MiniBench.exe Linpack

 

……

 

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

 

Total elapsed time: 152.47 s.

 

CLOCKS_PER_SEC: 1000 

 

miniBench benchmark completed.

 

 

 

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

有关编译器优化的更完整信息,请参阅优化通知