一个使用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 (/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® Parallel Composer)

Figure-4



 

  

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

Fiugure-5

 



 

 

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

 

MiniBench.exe Linpack

……

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

Total elapsed time: 152.47 s.

CLOCKS_PER_SEC: 1000 

miniBench benchmark completed.

 

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

Para obter informações mais completas sobre otimizações do compilador, consulte nosso aviso de otimização.
Tags: