當矩陣尺寸過大時,數據的大小將超過緩存的大小,這是容易出現滿不命中現象。
將矩陣進行分塊可以解決這個問題,以下是完整的矩陣乘法代碼:
vord brck(array A, array B, array C, int n, int bsize) { int r, c, k, kk, cc; double sum; int en = bsize * (n/bsize); /* Amount that frts evenly into blocks */ for (r = 0; r < n; r++) for (c = 0; c < n; c++) C[r][c] = 0.0; for (kk = 0; kk < en; kk += bsize) { for (cc = 0; cc < en; cc += bsize) { for (r = 0; r < n; r++) { for (c = cc; c < cc + bsize; c++) { sum = C[r][c]; for (k = kk; k < kk + bsize; k++) { sum += A[r][k]*B[k][c]; } C[r][c] = sum; } } }
分析思路:
1. 矩陣分塊前后的乘法計算總數恆定不變,分塊前是n^3 。
2. 現將矩陣按mxm進行分塊,整個矩陣被分成n^2/m^2 個子矩陣,乘法計算總是 (n^2/m^2) x n x m^2 。
3. 由2可知,分塊后,矩陣以mxm為單位進行乘法運算,它被嵌套在三層循環內。
ps: 本算法分塊后的並不是正方形矩陣,而是在n行或者n列上的矩陣乘積和。優點: 每次都在相鄰位置上進行讀寫,提高了訪問性能。