2012-12-10 27 views
1

我在上个月一直在进行计算机矩阵乘法运算,并且使用openMP和eigen3进行了一些测试。Eigen3矩阵乘法性能取决于处理器?

测试在后续的机器制造:

电脑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; 
    } 
} 

结果表明后续:

_________________________Computer 1__________Computer 2

序贯________ 232,75600 ___________ 536,21400

OpenMP____________2, 75764 ____________ 7,62024

Eig EN3 _____________ 3,35090 ____________ 1,92970

*的时间以秒为单位。

*矩阵尺寸为2700 X 2500和2500×2700

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

*对于eigen3测试,激活SSE2指令。

OpenMP的*使用默认的核心,即窗口检测,包括虚拟的这个所有的核心。

正如你可以看到OpenMP的版本是第一台计算机(I7),比eigen3版本上更快。然而,对于计算机2(2个Opteron),eigen3的性能完全超过了OpenMP版本加上在计算机1中进行的所有测试。

任何想法为什么我得到这个结果以及为什么eigen3在计算机中速度不快1在电脑2中?

+1

你能否让所有的实现都使用SSE2? Opteron具有更多,更快的内存原始内存时钟抽取,这使得这是一个明显不均衡的测试。我会建议至少均衡指令集(通过编译)和使用的内核数量。 ('taskset')。 –

+0

@高性能标记我忘记补充说,顺序版本不使用我发布它的相同算法,它使用最简单的版本,它不使用任何优化。这是这个:http://pastebin.com/Pc9AKAE8这就是为什么它可能慢得多,因为它应该只使用缓存和寄存器的ram intead。 – RandomGuy

+0

@ Steve-o我会尝试在顺序和OpenMP中启用SSE并将其报告给您。所使用的核心数是openMP的默认值,这是Windows在每台计算机上检测到的所有虚拟处理器(computer_1中的8个和computer_2中的12个)。当你的意思是“原始记忆时钟泵”时,你是在谈论ram-cpu数据传输? – RandomGuy

回答

1

感谢您的回答。

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

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

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

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

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