块矩阵乘法
Block Matrix Multiplication
我想执行一个块矩阵乘法(将一个矩阵分成多个sxs矩阵并乘以相应的块)。我编写的代码如下hennessy architecture book的样例代码:
for(int jj=0;jj<=(n/s);jj += s){
for(int kk=1;kk<=(n/s);kk += s){
for(int i=1;i<=(n/s);i++){
for(int j = jj; j<=((jj+s-1)>(n/s)?(n/s):(jj+s-1)); j++){
temp = 0;
for(int k = kk; k<=((kk+s-1)>(n/s)?(n/s):(kk+s-1)); k++){
temp += b[i][k]*a[k][j];
}
c[j][i] += temp;
}
}
}
}
其中,nxn为原矩阵的大小。A和b矩阵的大小相同。我把a b个矩阵分成大小为sxs的块。在我的程序中,我把块大小设为4。我把a b的所有元素都设为5,一个常数,n = 1000。然而,我得到错误的值在我的结果。我做错什么了吗?过去两个小时就被困在这上面了。如果可能的话,你们能帮忙吗?书中的参考代码如下:
for (jj = 0; jj <= size; jj += N) {
for (kk = 1; kk <= size; kk += N) {
for (i = 1; i <= size; i++) {
for (j = jj; j <= findMin(jj+N-1, size); j++) {
temp = 0;
for (k = kk; k <= findMin(kk+N-1, size); k++) {
temp += B[i][k] * A[j][k];
}
C[j][i] += temp;
}
}
}
}
这里,s=N, size =N/s
for(int jj=0;jj<N;jj+= s){
for(int kk=0;kk<N;kk+= s){
for(int i=0;i<N;i++){
for(int j = jj; j<((jj+s)>N?N:(jj+s)); j++){
temp = 0;
for(int k = kk; k<((kk+s)>N?N:(kk+s)); k++){
temp += a[i][k]*b[k][j];
}
c[i][j] += temp;
}
}
}
}
ax = b
错误在这一行。你有
temp += b[i][k]*a[k][j];
和
temp += b[i][k]*a[j][k];
。
如果你能把这部分放在函数中而不是这一行,那就更好了:
((jj+s-1)>(n/s)?(n/s):(jj+s-1));
乍一看,我很惊讶地看到0和1起始索引和<=循环终止测试。使用fortran或matlab代码的书籍有时会假设基于1的索引,而c/c++使用基于0的索引。
你也可以分别实现和/或测试内部的两个for循环,因为它们将用于单块矩阵乘法。
我将保持findMin函数独立,而不是在循环测试中内联它。
相关文章:
- 没有找到相关文章