【问题标题】:Amdahl's Law: matrix multiplication阿姆达尔定律:矩阵乘法
【发布时间】:2013-06-27 15:16:16
【问题描述】:

我正在尝试计算我的代码中可以并行化的部分 P,以应用阿姆达尔定律并观察理论上的最大加速。

我的代码大部分时间都花在矩阵乘法上(使用库 Eigen)。我应该认为这部分是完全可并行的吗?

【问题讨论】:

    标签: parallel-processing matrix-multiplication eigen parallelism-amdahl


    【解决方案1】:

    首先,考虑 Eigen 库如何处理矩阵乘法是合适的。

    那么,没有特征值的矩阵(mxn)-向量(nx1)乘法可以写成这样:

    1  void mxv(int m, int n, double* a, double* b, double* c)
    2  { //a=bxc
    3    int i, j;
    4
    5    for (i=0; i<m; i++)
    6    {
    7      a[i] = 0.0;
    8      for (j=0; j<n; j++)
    9        a[i] += b[i*n+j]*c[j];
    10   }
    11 }
    

    如您所见,由于没有两个乘积计算结果向量 a[] 的相同元素,并且由于 i=0...m 的元素 a[i] 的值的计算顺序不影响答案的正确性,这些计算可以在 i 的索引值上独立进行。

    然后像前一个这样的循环是完全可并行化的。在此类循环上使用 OpenMP 进行并行实现会相对简单。

    【讨论】:

      【解决方案2】:

      如果您的矩阵足够大,比方说大于 60,那么您可以在启用 OpenMP 的情况下进行编译(例如,使用 gcc 的 -fopenmp)并且产品将为您并行化。但是,通常最好在最高级别进行并行化,尤其是在矩阵不是很大的情况下。那么这取决于您是否可以识别算法中的独立任务。

      【讨论】:

        猜你喜欢
        • 2013-04-25
        • 2017-02-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-04-26
        • 2021-03-18
        • 1970-01-01
        相关资源
        最近更新 更多