繁体   English   中英

为什么Strassen矩阵乘法比标准矩阵乘法慢得多?

[英]Why is Strassen matrix multiplication so much slower than standard matrix multiplication?

我已经用C ++,Python和Java编写了用于矩阵乘法的程序,并测试了它们将两个2000 x 2000矩阵相乘的速度(请参阅post )。 标准ikj实现-在 在此处输入图片说明 - 拿:

  • C ++ :15秒( 来源
  • Python :6分13秒(

现在,我已经为矩阵乘法实现了Strassen算法 - 在此处输入图片说明 -使用Wikipedia上的Python和C ++。 这些是我的时代:

  • C ++ :45分钟( 来源
  • Python :10小时后被杀死( 来源

为什么Strassen矩阵乘法比标准矩阵乘法慢得多?


想法:

  • 一些缓存效果
  • 实现方式:
    • 错误(结果2000 x 2000矩阵正确)
    • 空乘(对于2000 x 2000-> 2048 x 2048来说不那么重要)

这尤其令人惊讶,因为它似乎与其他人的经验相矛盾:


编辑:在我的案例中,斯特拉森矩阵乘法的速度较慢的原因是:

  • 我使它完全递归(请参阅tam)
  • 我有两个函数strassenstrassenRecursive 如果需要,第一个将矩阵的大小调整为2的幂,并称为第二个。 但是strassenRecursive并不是递归地调用自己,而是strassen

基本问题是您使用strassen工具递归到叶大小为1。 Strassen的算法具有更高的Big O复杂度,但是常量在实际中确实很重要,这意味着实际上,对于较小的问题大小,最好使用标准n ^ 3矩阵乘法。

因此,要大大改善您的程序而不是这样做:

if (tam == 1) {
        C[0][0] = A[0][0] * B[0][0];
        return;
    }

if (tam == LEAF_SIZE) // iterative solution here使用if (tam == LEAF_SIZE) // iterative solution here LEAF_SIZE应该是您必须通过实验确定给定体系结构的常数。 取决于体系结构,它可能更大或更小-在某些体系结构中,strassen的常数因子是如此之大,以至于对于敏感的矩阵大小,它总是总是比简单的n ^ 3实现更糟糕。 一切取决于。

好吧,“算术运算”并不是唯一重要的事情。 并非所有其他东西都是免费的。

我天真的猜测是,所有这些内存分配和复制都比较少的算术运算更胜一筹……

特别是,当内存访问超出缓存时,它的访问可能会非常昂贵。相比之下,算术操作可能被认为是免费的:-)

尽管Strassen算法具有较小的Big O表示法,但要利用这一点,您需要将其乘以的子集太大而无法在大多数标准计算机甚至超级计算机上求解。

这样想吧

一个问题是x ^ 3,另一个是X ^ 1.6734 + 8x ^(1/2)+ x .....

暂无
暂无

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

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