一个使用Intel® Parallel Studio优化Minibench的例子
COSBI OpenSourceMark是清晰的,全面的开放源码的基准,含Windows*的图形用户界面框架,许多测试是在Delphi中写于2005年,但现在大部分测试支持Visual Studio* C和C + + 。开发者可以从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.
有兴趣的同仁可以按照以上方法,修改其它的测试子集。