C OpenMP性能差
我有这个问题,我写了一个OpenMP程序,它必须计算C OpenMP性能差,c,matrix,parallel-processing,openmp,C,Matrix,Parallel Processing,Openmp,我有这个问题,我写了一个OpenMP程序,它必须计算m矩阵的乘积。我想给每个线程N行指定要处理的内容 这是我的代码: double val; omp_set_num_threads(4); for(i=0;i<m;i++){ #pragma omp parallel for private(f,c,k) for(f=0;f<N;f++){ //cada thread trabaja con sus 2 filas asignadas
m
矩阵的乘积。我想给每个线程N
行指定要处理的内容
这是我的代码:
double val;
omp_set_num_threads(4);
for(i=0;i<m;i++){
#pragma omp parallel for private(f,c,k)
for(f=0;f<N;f++){ //cada thread trabaja con sus 2 filas asignadas
//printf("Thread %d, fila %d matriz %d \n",omp_get_thread_num(),f,i);
for(c=0;c<N;c++){ //cada fila trabaja con todas las columnas de la matriz principal
val=0;
for(k=0;k<N;k++){
/*if(k==0){
AUX[f*N+c]=RES[f*N+k]*A[i][k*N+c];
}*/
//else{
AUX[f*N+c]=val+RES[f*N+k]*A[i][k*N+c];
val=AUX[f*N+c];
//}
}
}
for(c=0;c<N;c++){
RES[f*N+c]=AUX[f*N+c];
}
}
}
double-val;
omp_设置_数量_线程(4);
对于(i=0;i我找到了一个解决方案!),首先,我没有注意到我将数据存储到矩阵中的方式,我有很多缓存失败。因此,RES矩阵按行存储,其他矩阵按列存储
此外,我还将“val”变量设置为private。性能得到了改善。颠倒k和c loopHi@user3528438的顺序是什么意思?为(c=0)重新排列;在没有openmp的情况下,协同优化编译器可能会跳过更多冗余循环。我认为val
应该是private。