我正在使用 OpenMP 编写一个矩阵乘法程序,为了缓存方便,实现乘法 A x B(转置)行 X 行而不是经典的 A x B 行 x 列,以提高缓存效率。这样做我遇到了一个有趣的事实,对我来说是不合逻辑的:如果在这段代码中我并行化外部循环,则程序比我将 OpenMP 指令放在最内部的循环中要慢,在我的计算机中,时间是 10.9 秒对 8.1 秒。
//A and B are double* allocated with malloc, Nu is the lenght of the matrixes
//which are square
//#pragma omp parallel for
for (i=0; i<Nu; i++){
for (j=0; j<Nu; j++){
*(C+(i*Nu+j)) = 0.;
#pragma omp parallel for
for(k=0;k<Nu ;k++){
*(C+(i*Nu+j))+=*(A+(i*Nu+k)) * *(B+(j*Nu+k));//C(i,j)=sum(over k) A(i,k)*B(k,j)
}
}
}