C 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

我有这个问题,我写了一个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
            //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。