为什么施特拉森矩阵乘法比标准矩阵乘法慢得多?

2024-01-07

I have written programs in C++, Python and Java for matrix multiplication and tested their speed for multiplying two 2000 x 2000 matrices (see post http://martin-thoma.com/matrix-multiplication-python-java-cpp/). The standard ikj-implentation - which is in enter image description here - took:

  • C++: 15 秒(Source https://github.com/MartinThoma/matrix-multiplication/blob/master/C++/ikj-algorithm.cpp)
  • Python:6分13秒(Source https://github.com/MartinThoma/matrix-multiplication/blob/master/Python/psyco-ikj-multiplication.py)

Now I have implemented the Strassen algorithm for matrix multiplication http://en.wikipedia.org/wiki/Strassen_algorithm#Source_code_of_the_Strassen_algorithm_in_C_language - which is in enter image description here - in Python and C++ as it was on wikipedia. These are the times I've got:

  • C++: 45分钟 (Source https://github.com/MartinThoma/matrix-multiplication/blob/master/C++/strassen.cpp)
  • Python:10小时后被杀死(Source https://github.com/MartinThoma/matrix-multiplication/blob/master/Python/strassen-algorithm.py)

为什么施特拉森矩阵乘法比标准矩阵乘法慢得多?


Ideas:
  • 一些缓存效果
  • Implementation:
    • 错误(生成的 2000 x 2000 矩阵是正确的)
    • 空乘(对于 2000 x 2000 -> 2048 x 2048 来说应该不那么重要)

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

  • 为什么我的 Strassen 矩阵乘法器如此快? https://stackoverflow.com/q/7827737/562769
  • 矩阵乘法:Strassen 与标准 https://stackoverflow.com/q/4304600/562769- 施特拉森对他来说也慢一些,但至少是在同一个数量级上。

编辑:在我的例子中施特拉森矩阵乘法较慢的原因是:

  • 我使它完全递归(参见 tam)
  • 我有两个功能strassen and strassenRecursive。如果需要,第一个将矩阵大小调整为 2 的幂,并调用第二个。但strassenRecursive没有递归调用自身,但是strassen.

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

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

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

use if (tam == LEAF_SIZE) // iterative solution here. LEAF_SIZE应该是一个常数,您必须针对给定的架构通过实验确定该常数。根据架构的不同,它可能更大或更小——在某些架构中,strassen 的常数因子太大,以至于对于合理的矩阵大小来说,它基本上总是比更简单的 n^3 实现更糟糕。这一切都取决于。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么施特拉森矩阵乘法比标准矩阵乘法慢得多? 的相关文章

随机推荐

  • 创建/编辑 PNG 图像的免费工具? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 有没有可用于创建和编辑 PNG 图像的免费工具 画图网 http getpaint net 会充满热情
  • Laravel:与数组的额外字段同步

    我试图将数据保存在数据透视表中 并使用一个名为 数据 的额外字段 当我保存时我有这个数组 5 gt files 4 gt pictures 3 gt tags 1 gt thumbs 我的桌子看起来像这样 项目ID 选项 ID name 上
  • 带有多重选择的 kivy spinner 小部件

    我正在寻找 Spinner 类型 或类似的东西 的 kivy 小部件 最好在 python kv 文件中 例如 我可以在其中通过复选框选择多个项目 所选项目应在元组 中可用 在图片 start png 中您将找到起始情况 表单中有一个标签和
  • 应用程序进入前台后 viewDidAppear 不会再次触发

    我在 iPhone 应用程序代码中发现了一个问题 即 viewDidAppear 方法并不总是触发 当您启动应用程序时 事件将按预期触发 但是 如果我使用能够进行多任务处理的手机关闭应用程序并重新打开 我的 viewDidAppear 事件
  • Angular js ng 重复条件 ng 类不应用 css 类

    我有一个 ng 重复 它的 ng 类在我的 css 类名称中包含连字符的情况下不应用 css 类 li item name li 我做错了什么吗 如果我将 css 类名更改为 isomeclass 它就可以工作 AngularJS v1 0
  • 将参数传递给 MVC Ajax.ActionLink

    如何将 TextBox 的值作为 ActionLink 的参数发送 我需要使用 Html TextBoxFor 控制器 操作如下所示 public class MyController public ActionRes
  • Microsoft 是否有关于不同 Windows 平台上应用程序数据与用户数据存储的最佳实践文档?

    创建面向多个 Windows 版本的应用程序时 确定应用程序特定数据应存储在何处的最佳实践是什么 具体来说 应用程序特定数据 例如应用程序配置数据 用户特定数据 设置 例如 我知道在 Windows Vista 上有可以使用的环境变量 例如
  • return 语句中的 C++ constexpr 函数

    为什么 constexpr 函数不在编译时计算 而是在运行时在 main 函数的 return 语句中计算 它尝试过 template
  • 在带有 ES 模块的 Node.js 中使用相对路径导入

    过去我用过app module path每当我想在 Node js 应用程序中使用相对路径时 如果我通过以下方式使用 ES 模块 mjs格式 如何在某个目录路径变得相对的情况下具有相同的功能 以另一种方式 我是否能够为目录分配一个别名 以便
  • 如何在solr中搜索多个方面?

    我需要在 solr 中搜索方面 如下所示 fq 国家 美国 fq 国家 加拿大 fq 主题 工业 fq 主题 政治 现在我需要搜索具有上述方面 逻辑与 和 逻辑或 的文章 假设我有以下文章 国家 美国法国 主题 英思科 国家 美国加拿大 主
  • Java 奇怪的程序输出中的移位运算符

    我遇到了以下程序 它的行为方式出乎意料 public class ShiftProgram public static void main String args int i 0 while 1 lt lt i 0 i System out
  • 尽管进程已终止,为什么 os.kill(pid, 0) 返回 None ?

    这个问题涉及到这个答案 https stackoverflow com a 13402639 1125413我的其他问题之一 在这个答案中我被告知可以使用os kill pid 0 检查子进程是否已终止 如果它还在运行 None被返回 如果
  • C# 文件关联的正确方法

    我一直在寻找一种正确的方法来使文件关联在 WinXP 及更高版本上工作 如果该关联已存在 则应将其替换 我开发的应用程序始终在管理模式下运行 因此权限应该不成问题 我遇到过一些旧帖子 其中有一些示例代码 但其中一些工作得不够好 有些则根本不
  • 更新到 macOS 13.3 无法编译 cpp

    更新到 Ventura 13 3 安装最新的 Xcode 和命令行工具后 我在编译任何 cpp 文件时收到此错误 Applications Xcode app Contents Developer Platforms MacOSX plat
  • 为什么默认参数不能依赖于非默认参数? [复制]

    这个问题在这里已经有答案了 考虑以下构造函数 class MyClass MyClass unsigned int dimension std vector vector unitaryVector dimension where unit
  • 如何根据日历模式创建事件?

    我正在尝试为某人创建一个 轮班 日历 我知道该模式从哪一天开始 并且我知道该模式的断断续续的日期 但我在将其翻译成代码时遇到了麻烦 他们工作4天 休息3天 工作4天 休息3天 工作4天 休息2天 如此循环 我需要创建一些逻辑来基于此为日历创
  • Material SearchView 实现错误

    我正在开发一个 Android 应用程序 现在一切都很好 但是当尝试使用 Google 指南实现 Material SearchView 并逐步遵循一些教程时 我无法弄清楚这个错误 菜单 main xml menu menu
  • 在 git repo 上工作,无需 cd 进入目录

    当我还没有在存储库上运行 git 命令时 我将如何运行cd进入那个目录 IE 我想跑git branch repos myrepo git 从 git 1 8 5 开始 使用 C option git C Users michael Dev
  • 如何在 C++ 中使用 XCode 4.2 设置 OpenGL 项目?

    我正在尝试使用 C 来了解一些图形 我认为最好从功能最强大的图形框架开始 因此我将使用 Lion 中包含的 OpenGL 基本上我在 XCode 4 2 中启动了一个 C 命令行工具 这就是我所做的一切 我需要以某种方式将 OpenGL 与
  • 为什么施特拉森矩阵乘法比标准矩阵乘法慢得多?

    I have written programs in C Python and Java for matrix multiplication and tested their speed for multiplying two 2000 x