【问题标题】:Where is strassen's matrix multiplication useful?施特拉森的矩阵乘法在哪里有用?
【发布时间】:2014-05-13 11:27:19
【问题描述】:

Strassen 的矩阵乘法算法与传统的O(N^3) 算法相比仅略有改进。它具有更高的常数因子并且更难实现。鉴于这些缺点,strassens 算法真的有用吗?它是否在任何矩阵乘法库中实现?另外,矩阵乘法在库中是如何实现的?

【问题讨论】:

  • 这个问题在这里并不合适,它更多的是关于算法和编程哲学,而不是关于实际代码。您是在问 Matlab 使用什么矩阵乘法算法?
  • 不,我只是想知道标准库中的矩阵乘法是如何实现的,以及是否使用了 strassen 算法。
  • 那么你不应该在 Matlab 中标记它。
  • 从我的自制实验中,Strassen 的算法在数百个数量级的大小上开始优于按定义方法。不知道图书馆。
  • 从我个人的经验以及对文献的粗浅研究来看,Strassen 的算法在不到 100 的数量级上优于 naive 方法;然而,这在很大程度上取决于内存布局和并行化程度。 Strassen 的算法实际上适合实践的事实似乎是一个不断重新发现的结果。可以在这里找到不同的讨论:tawqer.com/tag/strassen%20algorithm#.UzvndFdTtas

标签: algorithm matrix matrix-multiplication


【解决方案1】:

由于以下原因,通常不推荐 Strassen 方法用于实际应用。

  1. Strassen 方法中使用的常数很高,对于典型应用,Naive 方法效果更好。
  2. 对于稀疏矩阵,有专门设计的更好的方法 为他们。
  3. 递归中的子矩阵占用额外空间。
  4. 由于计算机算术精度有限 非整数值,较大的误差会在 Strassen 算法中累积 比朴素方法。
【解决方案2】:

所以 strassen 算法的想法是它更快(渐近地说)。如果您正在处理巨大的矩阵或大量的矩阵乘法,这可能会产生很大的不同。然而,仅仅因为它渐近地更快并不能使它成为实际上最有效的算法。有各种各样的实现注意事项,例如缓存和体系结构特定的怪癖。此外,还需要考虑并行性。

我认为最好的办法是查看公共库,看看它们在做什么。以 BLAS 为例。我认为 Matlab 使用MAGMA


如果您的论点是您不认为 O(n^2.8)O(n^3) 快得多,则此图表显示 O(n^2.8) em>n 在差异变得显着之前不需要非常大。

【讨论】:

    【解决方案3】:

    在正确的时刻停下来非常重要。

    对于 1,000 x 1,000 矩阵,您可以通过 7 个 500 x 500 乘积加上一些加法来将它们相乘。这可能很有用。也许是 500 x 500。对于 10 x 10 矩阵,很可能不会。你只需要先做一些实验,在什么时候停止。

    但是,当行数增长 32 倍、系数数增长 1,024、总时间增长 16,807 倍而不是 32,768 倍时,Strassen 的算法只能节省 2 倍(最多)。在实践中,这是一个“恒定因素”。我会说,通过首先转置第二个矩阵,您可以获得更多收益,这样您就可以逐行相乘,然后仔细查看缓存大小,尽可能矢量化,并分布在不会踩到彼此脚的多个内核上。

    【讨论】:

      【解决方案4】:
      • 边际改进:确实,但随着矩阵大小的增长而增长。
      • 更高的常数因子:Strassen 算法的实际实现对低于特定大小的块使用传统的 n^3,因此这并不重要。
      • 更难实现:随便。

      至于在实践中使用什么:首先,您必须了解将两个巨大的稠密矩阵相乘是不寻常的。更多时候,它们中的一个或两个是稀疏的、对称的、上三角形的或其他一些模式,这意味着有相当多的专用工具对于高效的大型矩阵乘法工具箱是必不可少的。话虽如此,对于巨大的稠密矩阵,施特拉森是解决方案。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-05-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-11-08
        • 2018-04-11
        相关资源
        最近更新 更多