矩陣乘法優化之分塊矩陣


當矩陣尺寸過大時,數據的大小將超過緩存的大小,這是容易出現滿不命中現象。

將矩陣進行分塊可以解決這個問題,以下是完整的矩陣乘法代碼:

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列上的矩陣乘積和。優點: 每次都在相鄰位置上進行讀寫,提高了訪問性能。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM