矩阵分块乘法
通常可以把一个矩阵分成多个块, 例如,
(6-4)
可以将其划分为 4个块:
(6-5)
(6-6)
分块后的矩阵记为:
(6-7)
分块矩阵乘法如下所示:
(6-7)
划分不一定需要完全等间隔, 只需要满足子矩阵乘法规则即可, 如图6-27所示。
图6-27 子矩阵划分不一定需要完全等间隔, 只需要满足子矩阵乘法规则
给定一个的矩阵切分为 行 列。
(6-8)
另一个的矩阵切分为行列。
(6-9)
则它们的乘积计算如下:
(6-10)
相应的乘法循环,代码如下。
for (int m = 0; m < M; m += Mtile) //在M维上迭代
for (int n = 0; n < N; n += Ntile) //在N维上迭代
for (int k = 0; k < K; ++k)
for (int i = 0; i < Mtile; ++i) // 计算一个图块
for (int j = 0; j < Ntile; ++j) {
int row = m + i;
int col = n + j;
C[row][col] += A[row][k] * B[k][col];
}
for (int n = 0; n < N; n += Ntile) //在N维上迭代
for (int k = 0; k < K; ++k)
for (int i = 0; i < Mtile; ++i) // 计算一个图块
for (int j = 0; j < Ntile; ++j) {
int row = m + i;
int col = n + j;
C[row][col] += A[row][k] * B[k][col];
}