2016-05-18 87 views
1

我有这个问题,我写了一个OpenMP程序,它必须计算m矩阵的乘积。我想给每个线程N行进行处理。OpenMP性能不佳

这是我的代码:

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]; 
      } 
     } 
    } 

结果是确定的,但在性能上顺序算法比较好...

我也能发的Pthread解决方案,它工作得很好,所以我想我当我并行化解决方案时出现了一些错误...

+1

颠倒k和c循环的顺序 – user3528438

+0

嗨@ user3528438你是什么意思? –

+0

重新安排'for(c = 0; c user3528438

回答

1

我找到了一个解决方案!首先,我没有注意我将数据存储到矩阵中的方式,并且我有很多缓存失败。因此RES矩阵按行存储,其他按列存储。

此外,我把私人的“val”变量。表现得到改善。