2016-05-18 13 views
1

私はこの問題を抱えており、mマトリックスの製品を計算するOpenMPプログラムを書いています。私は処理する各スレッド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]; 
      } 
     } 
    } 

結果はOKですが、パフォーマンスにシーケンシャルアルゴリズムが優れている...

私ものPthread液を作り、それは私が私だと思うので、正常に動作します私が解決策を並列化したときに何らかの間違いがありました...

+1

kとcループの順序を逆にする – user3528438

+0

こんにちは@ user3528438どういう意味ですか? –

+0

'for(c = 0; c user3528438

答えて

1

私は解決策を見つけました!最初に、データを行列に格納する方法には注意を払わなかったので、キャッシュが大量に失敗しました。 RESマトリクスは行ごとに格納され、その他は列によって格納されます。

また、「val」変数をプライベートにします。パフォーマンスが向上しました。

関連する問題