繁体   English   中英

strassen的矩阵乘法在哪里有用?

[英]Where is strassen's matrix multiplication useful?

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

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

我认为你最好的选择是看看公共图书馆,看看他们在做什么。 以BLAS为例。 我认为Matlab使用MAGMA


如果你的争论是你不认为O(n ^ 2.8)O(n ^ 3)快得多,那么这个图表会告诉你在差异变大之前n不需要非常大。

在此输入图像描述

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

  1. Strassen方法中使用的常量很高,对于典型应用,Naive方法效果更好。
  2. 对于稀疏矩阵,有更好的方法专门为它们设计。
  3. 递归中的子矩阵需要额外的空间。
  4. 由于计算机算法对非整数值的精度有限,Strassen算法中的误差大于朴素方法。

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

使用1,000 x 1,000矩阵,您可以通过七个500 x 500产品加上一些附加功能来增加它们。 这可能很有用。 可能是500 x 500。 使用10 x 10矩阵,很可能不是。 你必须先做一些实验才能停止。

但是当行数增加32倍时,Strassen的算法只能节省2倍(最好),系数增加1,024,总时间增加因子16,807而不是32,768。 在实践中,这是一个“常数因素”。 我会说你通过首先调换第二个矩阵来获得更多,这样你就可以按行相乘,然后仔细查看缓存大小,尽可能地向量化,并分布在不会踩到彼此脚的多个核心上。

  • 边际改善:确实如此,但随着矩阵尺寸的增长而增长。
  • 更高的常数因子:Strassen算法的实际实现使用传统的n ^ 3来处理特定大小以下的块,因此这并不重要。
  • 更难实施:无论如何。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM