代码之家  ›  专栏  ›  技术社区  ›  KcFnMi

矩阵乘法性能,int与double

  •  1
  • KcFnMi  · 技术社区  · 8 年前

    我正在尝试使用MPI进行矩阵乘法,并想寻求一些帮助来理解一个问题。机器有6个核心,32kb一级缓存,256kb二级缓存和15mb三级缓存。乘法是这样的:

    vector<vector<double>>多个MPI(vector<vector<double>>m,
    矢量<矢量<double>>n){
    int rows=m.size();
    int大小=n.大小();
    vector<vector<double>>r(行,vector<double>(大小));
    
    对于(int i=0;i<rows;++i)
    对于(int k=0;k<size;++k)
    对于(int j=0;j<size;++j)
    r[i][j]+=m[i][k]*n[k][j];
    返回R;
    }
    < /代码> 
    
    

    我对int有相同的理解。

    vector<vector<int>>多向量MPI(vector<vector<int>>m,vector<vector<int>>n);
    < /代码> 
    
    

    然后我做了一些绘图,不同的线条颜色表示节点的数量。

    下图显示了两个int矩阵相乘所花费的时间:

    下面的图表显示了两个双矩阵相乘的时间:

    为什么在双例中4和6个节点的时间相同?我是否遇到了内存带宽的限制?

    我在最后一个小时内试了多次,结果都一样。还用topbut to my eyes I'm alone there检查了机器负载。

    vector<vector<double>> mult_mpi(vector<vector<double>> m, 
                                    vector<vector<double>> n) { 
        int rows = m.size();
        int size = n.size();
        vector<vector<double>> r(rows, vector<double>(size));
    
        for (int i = 0; i < rows; ++i) 
            for (int k = 0; k < size; ++k) 
                for (int j = 0; j < size; ++j) 
                    r[i][j] += m[i][k] * n[k][j];
        return r;
    }
    

    我也有同样的int:

    vector<vector<int>> mult_mpi(vector<vector<int>> m, vector<vector<int>> n);
    

    然后我做了一些绘图,不同的线颜色表示节点的数量。

    下图显示了两个int矩阵相乘所花费的时间:

    enter image description here

    下图显示了两个双矩阵相乘所花费的时间:

    enter image description here

    为什么在双例中4和6个节点的时间相同?我是否遇到了内存带宽的限制?

    我在最后一个小时内试了多次,结果都一样。还检查了机器负载top但在我看来,只有我一个人在那里。

    1 回复  |  直到 8 年前
        1
  •  1
  •   Sigi    8 年前

    您确定您没有安排4K矢量的分配时间吗?

    vector<vector< >> 不是挤压最佳性能的合适类型。矩阵乘法是关于内存访问的可伸缩性和“计算密度”的最佳操作之一。实际上,操作数按o(n^3)缩放,而数据数按o(n^2)缩放。

    事实上,它被用来作为基准 top500 fastest systems 在地球上: HPL 是“高性能linpack”的一种,是线性代数的参考实现。猜猜看…基准中使用的运算是dgemm,即“双精度通用矩阵乘法”。

    dgemm是blas库中操作的名称,实际上是线性代数的标准。现在有许多本地优化的blas库,要么是商业的(intel mkl,ibm essl,…),要么是开源的。( ATLAS ,但它们都使用相同的原始BLAS接口(原来是Fortran,现在也是C)。(注: the original implementation 未优化)

    基于BLAS,还有 LAPACK 库:系统解算器,特征系统,…还有优化的lapack库,但通常90%的性能被使用优化的blas库压缩。

    我非常了解一个(不是唯一一个…hpl是另一个强大的基于MPI的并行库,它是 SCALAPACK 它包含了PBLA(平行BLAS),并且在其中…优化和并行版本的dgemm等。

    scalapack附带 SLUG 在这里您可以找到一个关于块循环分布的很好的解释,这是用于压缩并行系统上最佳性能排列线性代数问题的数据分布策略。

    但是,要获得最佳性能,您需要将MPI可执行文件链接到本地优化的BLAS库。或者写自己的,但你并不孤单,所以不要重新发明轮子。

    局部优化是通过访问矩阵获得的,而不是通过行、列,而是通过块。通过调整块大小以优化缓存和/或TLB的使用(我记得刚才的libgoto,另一个BLAS库,它经过优化以最小化TLB未命中,在某些系统上达到并超过了Intel MKL…前段时间)查找更多信息,例如 ATLAS paper .

    无论如何,如果你真的想…我开始分析其他车轮是如何锻造的,然后再尝试制造我的车轮;)