2011-05-14 55 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++,并且作为结果的超出边界读/写。