【发布时间】:2012-07-14 19:03:15
【问题描述】:
我用 C++、Python 和 Java 编写了矩阵乘法程序,并测试了它们对两个 2000 x 2000 矩阵相乘的速度(请参阅post)。标准的 ikj 实现 - 在 中 - 采用:
现在我已经在 Python 和 C++ 中实现了 Strassen algorithm for matrix multiplication - 在 中 - 就像在维基百科上一样。这些是我的时间:
为什么 Strassen 矩阵乘法比标准矩阵乘法慢很多?
想法:
- 一些缓存效果
- 实施:
- 错误(生成的 2000 x 2000 矩阵是正确的)
- null 乘法(对于 2000 x 2000 -> 2048 x 2048 应该没那么重要)
这尤其令人惊讶,因为它似乎与其他人的经历相矛盾:
- Why is my Strassen Matrix multiplier so fast?
- Matrix multiplication: Strassen vs. Standard - Strassen 对他来说也较慢,但至少在同一数量级。
编辑:在我的情况下,Strassen 矩阵乘法较慢的原因是:
- 我让它完全递归(参见 tam)
- 我有两个函数
strassen和strassenRecursive。如果需要,第一个将矩阵的大小调整为 2 的幂,并调用第二个。但是strassenRecursive并没有递归调用自己,而是strassen。
【问题讨论】:
-
没查过,不过分配了很多新向量。我想内存分配时间是杀死它的原因。
-
Voo 的回答基本上也涵盖了内存分配问题,因为尽早停止递归会减少分配次数。顺便说一句:在我的计算机上,我发现截止值约为 250 是一个不错的值。
-
顺便说一句,您发布的来源不能被任何人试验,因为您不发布数据文件。这意味着除了推测之外没有人可以做任何事情。
-
@DeadMG:实际上数据文件在那里,只是在测试目录中的几个级别。
标签: c++ performance matrix multiplication strassen