1

上个月我一直在使用计算机矩阵乘法,并使用 openMP 和 eigen3 进行了一些测试。

测试是在以下机器上进行的:

电脑1:

Intel Core 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

顺序________232,75600_______________536,21400

OpenMP____________2,75764____________7,62024

特征3_____________3,35090____________1,92970

*时间以秒为单位。

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

*顺序算法与 OMP 不同,它是 mm 乘法的最简单版本,可在此处查看:http: //pastebin.com/Pc9AKAE8

*为 eigen3 测试激活了 SSE2 指令。

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

如您所见,OpenMP 版本在第一台计算机 (i7) 上比 eigen3 版本更快。但是对于计算机 2(2x Opteron),eigen3 的性能完全胜过 OpenMP 版本以及在计算机 1 中进行的所有测试。

知道为什么我会得到这个结果以及为什么计算机 1 中的 eigen3 没有计算机 2 中那么快吗?

4

1 回答 1

1

感谢您的回答。

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

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

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

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

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

于 2013-01-24T18:00:13.123 回答