【发布时间】:2012-11-13 15:20:41
【问题描述】:
我用 C++ 编写了两个矩阵乘法程序:Regular MM (source) 和 Strassen 的 MM (source),它们都对大小为 2^kx 2^k 的方阵进行运算(换句话说,偶数大小的方阵) )。
结果很糟糕。对于 1024 x 1024 矩阵,Regular MM 采用 46.381 sec,而 Strassen 的 MM 采用 1484.303 sec (25 minutes !!!!)。
我试图使代码尽可能简单。在网上找到的其他 Strassen 的 MM 示例与我的代码没有太大区别。 Strassen 的代码的一个问题是显而易见的——我没有切换到常规 MM 的截止点。
我的 Strassen 的 MM 代码还有什么其他问题???
谢谢!
直接链接到来源
http://pastebin.com/HqHtFpq9
http://pastebin.com/USRQ5tuy
编辑1。 拳头,很多很好的建议。感谢您抽出宝贵时间分享知识。
我实施了更改(保留了我的所有代码),添加了截止点。 2048x2048 矩阵的 MM,截止 512 已经给出了很好的结果。 普通MM:191.49s 施特拉森的 MM:112.179s 很显着的提高。 结果是使用 Visual Studio 2012 在配备英特尔迅驰处理器的史前联想 X61 平板电脑上获得的。 我会做更多的检查(以确保我得到正确的结果),并将公布结果。
【问题讨论】:
-
@LuchianGrigore:哦,这很微妙。并且可能也是问题的很大一部分。可能比我实际发现的问题更大。
-
@Mysticial 我假设其中一种算法是缓存无意识的,因为尺寸固定为 2^k。可能是错的。
-
@LuchianGrigore:一种算法非常简单(并且不会忘记缓存)。另一个也不是缓存遗忘,尽管它应该快很多。
-
@LuchianGrigore:不幸的是,我相信施特拉森的算法是一种递归的分治算法。我怀疑它可以用于非 2 的幂。但我也怀疑 OPs 的实现不能。
-
@newprint 那么好吧,原因是here
标签: c++ performance optimization matrix-multiplication strassen