矩阵乘法优化之分块矩阵

当矩阵尺寸过大时,数据的大小将超过缓存的大小,这是容易出现满不命中现象。

将矩阵进行分块可以解决这个问题,以下是完整的矩阵乘法代码:

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列上的矩阵乘积和。优点: 每次都在相邻位置上进行读写,提高了访问性能。

 

原文链接: https://www.cnblogs.com/wlzy/p/8997483.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍

    矩阵乘法优化之分块矩阵

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/273414

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月14日 下午11:36
下一篇 2023年2月14日 下午11:36

相关推荐