【问题标题】:Is there a way to optimize vector-matrix multiplication other than using loop unrolling?除了使用循环展开之外,还有其他方法可以优化向量矩阵乘法吗?
【发布时间】:2016-06-12 02:26:16
【问题描述】:

有很多方法可以提高矩阵-矩阵乘法的性能(例如,使用第二个矩阵的转置来利用参考的局部性,使用像 Strassen 这样的算法方法等)

但是有没有办法提高向量矩阵乘法的性能呢? (即使在 google 上搜索它也会重定向到矩阵-矩阵乘法改进方法。)我知道我们可以使用loop unrolling 来获得一些性能改进,但是还有其他方法吗?

【问题讨论】:

    标签: algorithm performance optimization matrix


    【解决方案1】:

    我认为不存在通用解决方案。但是我们可以通过对向量使用快速内存​​、缓存内存属性等来关注计算方式的特定特征来加速计算。

    【讨论】:

      【解决方案2】:

      根据定义,矩阵向量乘法是一系列不相关的点积。由于它们不相关,因此可以并行执行。

      GPU matrix-vector product (gemv)gem? 操作的不同 GPU 并行化进行了非常漂亮和详细的比较。

      与任何与 GPU 相关的问题一样,问题需要足够严重,以保证一开始就需要 GPU 调用的设置开销。据推测,如果矩阵的列维度足够长,即使 CPU 线程并行化也可以加快速度。


      一个不同的方向与你写的关于循环展开的内容有关。循环展开只是利用了计算机体系结构的一些知识,即缓存未命中可以安全地在这里乱序执行

      // Code fragment for calculating the ith product entry.
      for(size_t j = 0; j < n, j += 4)
      {
          sum0 += m[i][j] * v[j];
          sum1 += m[i + 1][j] * v[j];
          sum2 += m[i + 2][j] * v[j];
          sum3 += m[i + 3][j] * v[j];
      }
      

      BLAS 库,例如 OpenBLAS 执行更多此类微优化,其中一些依赖于非常特定于架构的功能。

      【讨论】:

      • 我一直在寻找不使用并行性的东西(因此没有尝试 GPU)。还是谢谢!
      • 没问题。祝你好运。
      【解决方案3】:

      过去我使用过一维矩阵,它比二维矩阵访问起来要快得多。它们也没有那么难使用,您可以使用以下方式访问每个元素:

      int i, j;
      for (i = 0; i < COLUMN_LENGTH; i++)
      {
          for (j = 0; j < ROW_LENGTH; j++)
          {
              printf("%f\n", A[i * ROW_LENGTH + j]);
          }
      }
      

      这是一个行优先的有序矩阵。

      数学库LAPACK 是您可以在您的应用程序中使用的东西,矩阵函数已针对各种架构进行了高度调整。否则,您可以阅读源代码,这可能会为您自己的优化提供一些想法。

      【讨论】:

      • 在不使用库的情况下,我试图自己进行改进。我会尝试一维数组的东西,看看它的表现如何。
      猜你喜欢
      • 2022-01-04
      • 2018-03-01
      • 2015-12-08
      • 1970-01-01
      • 2012-10-10
      • 1970-01-01
      • 1970-01-01
      • 2019-09-14
      • 2017-07-18
      相关资源
      最近更新 更多