上个月我一直在使用计算机矩阵乘法,并使用 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 中那么快吗?