特征3矩阵乘法性能取决于处理器



在过去的几个月里,我一直在研究计算机矩阵乘法,并使用openMP和本征3进行了一些测试。

测试在以下机器上进行:

计算机1:

英特尔酷睿i7-3610QM CPU@2,30GHz/6 GB ddr3

计算机2:

六核AMD Opteron(tm)处理器2435 2.60 GHz(2个处理器)/16 GB

对于openMP,使用了以下矩阵矩阵乘法算法:

void matrix4openmp(void)
{
int j;
#pragma omp parallel for 
for (j=0;j<N; j+=2){
double v1[N],v2[N];
int i,k;
for (i=0;i<N; i++){
v1[i]=b[i][j];
v2[i]=b[i][j+1];
}
for (i=0; i<N;i+=2){
register double s00,s01,s10,s11;
s00=s01=s10=s11=0.0;
for (k=0;k<N;k++){
s00 += a[i]  [k] * v1[k];
s01 += a[i]  [k] * v2[k];
s10 += a[i+1][k] * v1[k];
s11 += a[i+1][k] * v2[k];
}
c[i]  [j]   =s00;
c[i]  [j+1] =s01;
c[i+1][j]   =s10;
c[i+1][j+1]   =s11;
}
}

结果如下:

_________________________计算机1 __________计算机2

顺序________ 23275600 ___________ 53621400

OpenMP ____________ 275764 ____________ 762024

特征3 _____________ 335090 ____________ 192970

*时间以秒为单位。

*矩阵尺寸分别为2700 x 2500和2500 x 2700。

*顺序算法与OMP不同,它是m-m乘法的最简单版本,可以在这里看到:http://pastebin.com/Pc9AKAE8.

*SSE2指令被激活用于本征3测试。

*OpenMP使用默认内核,这是窗口检测到的所有内核,包括虚拟内核。

正如你所看到的,OpenMP版本在第一台计算机(i7)上比本征3版本更快。然而,对于计算机2(2x Opteron),本征3的性能完全优于OpenMP版本以及计算机1中进行的所有测试。

知道为什么我得到这个结果吗?知道为什么本征3在计算机1中没有在计算机2中那么快吗?

感谢您的回答。

顺序版本和并行版本之间的巨大差异是由于使用了不同的算法。顺序版本使用通常的天真O(N^3),没有任何优化,而并行版本是优化版本——使用块。使用相同的算法,顺序版本时间约为10(计算机1)和50(计算机2)——对不起,应该在第一篇文章中输入这些值。

在第一台和第二台计算机中,Eigen3性能与OpenMP性能之间的差异似乎是由于启动的线程数量与可用的物理处理器数量之间的差异。我们发现,如果启动的线程数量大于可用的物理处理器数量,则Eigen3的性能会变得更差,而OpenMP 的情况并非如此

在测试中,两种情况下启动的线程数都等于处理器总数(虚拟+物理)。

在计算机1中,特征3的性能更差,因为总处理器的数量(虚拟+物理-由于超线程)大于物理处理器的数量。

在计算机2中,Eigen3的性能更好,因为处理器的总数与物理处理器的数量相同。如果我们将物理处理器数量的两倍用于线程数量,则Eigen3的性能也会降低,而openMP实际上会略有改进。

最新更新