我在上个月一直在进行计算机矩阵乘法运算,并且使用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中?
你能否让所有的实现都使用SSE2? Opteron具有更多,更快的内存原始内存时钟抽取,这使得这是一个明显不均衡的测试。我会建议至少均衡指令集(通过编译)和使用的内核数量。 ('taskset')。 –
@高性能标记我忘记补充说,顺序版本不使用我发布它的相同算法,它使用最简单的版本,它不使用任何优化。这是这个:http://pastebin.com/Pc9AKAE8这就是为什么它可能慢得多,因为它应该只使用缓存和寄存器的ram intead。 – RandomGuy
@ Steve-o我会尝试在顺序和OpenMP中启用SSE并将其报告给您。所使用的核心数是openMP的默认值,这是Windows在每台计算机上检测到的所有虚拟处理器(computer_1中的8个和computer_2中的12个)。当你的意思是“原始记忆时钟泵”时,你是在谈论ram-cpu数据传输? – RandomGuy