2011-05-14 61 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

即使你可以得到它的工作,它可能會比單線程版本慢 – 2011-05-14 22:12:05

+0

你正在訪問數組'b'範圍之外的內存。 – 2011-05-14 22:12:40

+0

大衛:我只是在做h – Ahmed 2011-05-14 22:13:35

回答

1

哎。

# 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 2011-05-14 22:16:14

+0

@Ahm there you go。 – Anycorn 2011-05-14 22:18:04

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執行result[0][c]+=a[0][j]*b[j][c]之前執行c++,並且作爲結果的超出邊界讀/寫。