在过去的几个月里,我一直在使用计算机矩阵乘法技术,并使用openMP和eigen3进行了一些测试。
试验是在下列机器上进行的:
计算机1:
英特尔核心i7-3610qmcpu@2,30 GB /6 GB ddr3
计算机2:
六核AMD (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
Sequential________232,75600___________536,21400
OpenMP____________2,75764____________7,62024
Eigen3_____________3,35090____________1,92970
*时间以秒为单位。
*矩阵尺寸分别为2700×2500和2500×2700。
*序列算法与OMP不同,它是m乘法的最简单的版本,可以在这里看到:http://pastebin.com/Pc9AKAE8。
*启动eigen3测试的SSE2 2指令。
*OpenMP使用默认内核,这是windows检测到的所有核心,包括虚拟内核。
如您所见,OpenMP版本在第一台计算机(i7)上比eigen3版本更快。然而,对于计算机2(2xOpteron),eigen3的性能优于OpenMP版本加上在计算机1中所做的所有测试。
知道我为什么得到这个结果吗?为什么eigen3在计算机1中的速度不如在计算机2中那么快?
发布于 2013-01-24 18:00:13
谢谢你的回答。
顺序版本和并行版本之间的巨大差异是由于使用了不同的算法。顺序版本使用通常的天真O(N^3)而不进行任何优化,而并行版本则是优化版本--使用块。使用相同的算法,顺序版本时间约为10 (计算机1)和50 (计算机2) -对不起,应该将这些值放在第一篇文章中。
在第一台和第二台计算机中,Eigen3性能与OpenMP性能之间的差异似乎是由于启动的线程数量与可用物理处理器的数量有关。我们发现,如果启动的线程数量大于可用物理处理器的数量,Eigen3的性能会变得更差,而OpenMP的情况并非如此。
在测试中,为这两种情况启动的线程数等于总处理器数(虚拟+物理)。
在计算机1中,Eigen3性能更差,因为总处理器(虚拟+物理--由于超线程)的数量大于物理处理器的数量。
在计算机2中,Eigen3性能更好,因为处理器总数与物理处理器数量相同。如果我们将物理处理器数量的两倍用于线程数,那么Eigen3的性能也会下降,openMP实际上也会略有改善。
https://stackoverflow.com/questions/13799333
复制相似问题