このコードは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'
のスタックが壊れていた
何が問題なのですか?
でも、動作させることができても、おそらくシングルスレッド版より遅くなるでしょう。 –
配列 'b'の境界外のメモリにアクセスしています。 –
David:私はちょうどhwをやっています – Ahmed