我过去几个月一直在使用计算机矩阵乘法,我使用openMP和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;
}
}
结果如下:
_________________________计算机1__________计算机2
顺序________ 232,75600 ___________ 536,21400
的OpenMP ____________ 2,75764 7,62024 ____________
Eigen3 _____________ 3,35090 1,92970 ____________
*时间以秒为单位。
*矩阵尺寸为2700 x 2500和2500 x 2700.
*顺序算法与OMP不同,它是m-m乘法的最简单版本,可以在这里看到:http://pastebin.com/Pc9AKAE8。
*针对eigen3测试激活了SSE2指令。
* OpenMP使用默认核心,这是“Windows检测到的所有核心,包括虚拟核心。”
正如您所看到的,第一台计算机(i7)上的OpenMP版本比eigen3版本更快。然而,对于计算机2(2x Opteron),eigen3的性能完全优于OpenMP版本以及计算机1中的所有测试。
我知道为什么我得到这个结果以及为什么eigen3在计算机1中不如计算机2那么快?
答案 0 :(得分:1)
感谢您的回答。
顺序和并行版本之间的巨大差异是由于使用了不同的算法。顺序版本使用通常的朴素O(N ^ 3)而没有任何优化,而并行版本是优化版本 - 使用块。使用相同的算法,顺序版本时间大约是10(计算机1)和50(对于计算机2) - 抱歉应该将这些值放在第一篇文章中。
第一台和第二台计算机中Eigen3性能与OpenMP性能之间的差异似乎是由于启动的线程数与可用的物理处理器数量的关系。我们发现如果启动的线程数大于物理处理器的可用数量,Eigen3的性能会变差,而OpenMP不是这种情况
在测试中,两种情况下启动的线程数等于总处理器数(虚拟+物理)。
在计算机1中,Eigen3性能更差,因为总处理器数量(虚拟+物理 - 由于超线程)大于物理处理器数量。
在计算机2中,Eigen3的性能更好,因为处理器的总数与物理处理器的数量相同。如果我们使用物理处理器数量的两倍来获得线程数,那么Eigen3的性能也会降低,而openMP实际上会有所改善。