2011-05-14 15 views
0

このコードはa[4][4]b[4][4]result2[4][4]などの二乗行列以外は動作しませんが、それはa[4][10]のために動作しませんでした、b[10][10]result2[4][10]非正方行列の乗算

//Init 
for(r=0;r<numrowsa;r++){ 
    for(c=0;c<numcolsa;c++){ 
     a[r][c]=rand()%101; 
    } 
} 

for(r=0;r<numrowsb;r++){ 
    for(c=0;c<numcolsb;c++){ 
     b[r][c]=rand()%101; 
    } 
} 
for(r=0;r<numrowsr;r++){ 
    for(c=0;c<numcolsr;c++){ 
     result[r][c]=0; 
    } 
} 
for(r=0;r<numrowsr2;r++){ 
    for(c=0;c<numcolr2;c++){ 
     result2[r][c]=0; 
    } 
} 
//end init 
t1=clock(); 

//trying parallel calculation 
# pragma omp parallel num_threads(4) private(j) 
{ 
    int thr = omp_get_thread_num(); 

    if(thr == 0) 
     for(c=0;c<numcolsr;c++){ 
      for(j=0 ;j<numcolsa ; j++) 
       result[0][c]+=a[0][j]*b[j][c]; 
     } 
    else if (thr ==1) 
     for(c=0;c<numcolsr;c++){ 
      for(j=0 ; j<numcolsa ; j++) 
       result[1][c]+=a[1][j]*b[j][c]; 
     } 
    else if (thr ==2) 
     for(c=0;c<numcolsr;c++){ 
      for(j=0 ; j<numcolsa ; j++) 
       result[2][c]+=a[2][j]*b[j][c]; 
     } 
    else if (thr ==3) 
     for(c=0;c<numcolsr;c++){ 
      for(j=0 ; j<numcolsa ; j++) 
       result[3][c]+=a[3][j]*b[j][c]; 
     } 
} 
t2=clock(); 
cout <<endl<< "Time"<<t2-t1<<"ms"<<endl; 

t1 = clock(); 
//trying serial calculation 
for(r=0;r<numrowsr2;r++){ 
    for(c=0;c<numcolr2;c++){ 
     for(i=0 ; i<numcolsa ; i++) 
      result2[r][c]+=a[r][i]*b[i][c]; 
    } 
} 
t2 = clock(); 

/* 
for(r=0;r<numrows;r++){ 
    for(c=0;c<numcols;c++){ 
     cout <<result[r][c]<<" "; 
     if(c == numcols-1) 
      cout << endl; 
    } 
} 
*/ 
cout <<endl<< "Time"<<t2-t1<<"ms"<<endl; 

エラーが

です

ランタイムチェックエラー変数'b'のスタックが壊れていた

何が問題なのですか?

+0

でも、動作させることができても、おそらくシングルスレッド版より遅くなるでしょう。 –

+0

配列 'b'の境界外のメモリにアクセスしています。 –

+0

David:私はちょうどhwをやっています – Ahmed

答えて

1

ouch。

# pragma omp parallel 
int t = omp_get_thread_num(); 
int nt = ...; 
for(int i=t ; i<M ; i += nt) { 
    for(int j=0 ; j<N ; ++j) { 
    for(int k=0 ; k<K ; ++k) { 
     .... 
    } 
    } 
} 
+0

いいえ私はそれを他のやり方でしたい..スレッドの各行 – Ahmed

+0

@Ahmそこに行くよ。 – Anycorn

0

あなたが書いた:

if(thr == 0) 
    for(c=0;c<numcolsr;c++){ 
     for(j=0 ;j<numcolsa ; j++) 
      result[0][c]+=a[0][j]*b[j][c]; 
    } 
else if (thr ==1) 
    for(c=0;c<numcolsr;c++){ 
     for(j=0 ; j<numcolsa ; j++) 
      result[1][c]+=a[1][j]*b[j][c]; 
    } 
// and so on 

を私はOMPの詳細は知らないが、私はcjは、スレッド間でを共有することになることを考えで正しいですか?すべてのループは同じcと同じjを使用するためです。

この場合、さまざまな競合条件が発生する可能性があります。例えば。スレッド1は、スレッド0がを実行する直前にc++を実行することができ、その結果として範囲外の読み取り/書き込みが実行されます。