用于矩阵乘法的并行和分布式算法

时间:2015-09-16 15:18:43

标签: algorithm parallel-processing big-o matrix-multiplication

当我查看Matrix multiplication algorithm

的维基百科页面时出现问题

它说:

  

此算法的关键路径长度为 Θ((log n)^2) 步骤,这意味着在具有无限处理器数量的理想计算机上需要花费大量时间;因此,它在任何真实计算机上都有{strong>最大可能的加速 Θ(n3/((log n)^2))

引用来自“并行和分布式算法/共享内存并行性”一节。

由于假设存在无限处理器,乘法运算应在O(1)中完成。然后只需添加所有元素,这也应该是一个恒定的时间。因此,最长的关键路径应该是 O(1)而不是Θ((log n)^ 2)

我想知道O和Θ之间是否存在差异,我错在哪里?

问题已经解决,非常感谢@Chris Beck。答案应该分为两部分。

首先,一个低错误是我不计算总和的时间。求和在运算中考虑O(log(N))(考虑二进制加法)

其次,正如Chris指出的那样,非平凡的问题需要时间O(log(N))在处理器中。最重要的是,最长的关键路径应为O(log(N)^2),而不是O(1)

对于O和Θ的混淆,我在Big_O_Notation_Wikipedia中找到了答案。

  

Big O是比较函数最常用的渐近符号,尽管在很多情况下Big O可能会被BigThetaΘ替换为渐近更紧的边界。

我最后的结论是错的。 O(log(N)^2)不会在求和和处理器上发生,而是在我们拆分矩阵时发生。谢谢@displayName提醒我这个。此外,Chris对非平凡问题的回答对于研究并行系统仍然非常有用。感谢下面所有温暖的心脏回答者!

3 个答案:

答案 0 :(得分:3)

这个问题有两个方面,解决哪个问题将得到完全解答。

  • 为什么我们不能通过投入足够数量的处理器来将运行时间带到O(1)?
  • Matrix Multiplication的关键路径长度如何等于Θ(log 2 n)?

逐一回答问题。

无限数量的处理器

这一点的简单答案是理解两个术语即。 任务粒度任务依赖

  • 任务粒度 - 表示任务分解的精确程度。即使你有无限的处理器,对于一个问题,最大分解仍然是有限的。
  • 任务依赖关系 - 意味着只能顺序执行的步骤是什么。比如,除非您已阅读,否则无法修改输入。所以修改总是先读取输入,不能与它并行完成。

因此,对于具有四个步骤A, B, C, D的进程,使得 D依赖于C,C依赖于B而B依赖于A ,那么单个处理器将起作用与2个处理器一样快,工作速度可达4个处理器,速度与无限处理器一样快。

这解释了第一颗子弹。

并行矩阵乘法的关键路径长度

  1. 如果必须将大小为n X n的方形矩阵分成四个大小为[n/2] X [n/2]的块,然后继续分割,直到达到单个元素(或大小为{{1}的矩阵)这个树状设计的级别数是 O(log(n))
  2. 因此,对于并行的矩阵乘法,由于我们必须递归地除去大小为n的两个矩阵,直到它们的最后一个元素,它需要 O(log 2 n) 时间。
  3. 事实上,这个界限更严格,不仅仅是 O(log 2 n),而是Θ(log 2 n)的
  4. 如果我们通过使用 主定理证明运行时间,我们可以使用重复计算相同的结果:

      

    M(n)= 8 * M(n / 2)+Θ(Log n)

    这是主定理的2 - 并将运行时间设为Θ(log 2 n)

    Big O和Theta之间的区别在于Big O只告诉一个进程不会超过Big O所提到的进程,而Theta告诉我们函数不只是有一个上限,而且还有下限和什么是在Theta中提到过。因此,有效地,函数复杂度的 plot 将夹在同一个函数之间,乘以两个不同的常量,如下图所示,换句话说,函数将在同样的速度:

    enter image description here

    图片取自:http://xlinux.nist.gov/dads/Images/thetaGraph.gif

    所以,我会说,对于你的情况,你可以忽略这个符号,你不会在两者之间“严重”错误。

    总结......

    我想定义另一个名为加速或并行的术语。它被定义为最佳顺序执行时间(也称为工作)和并行执行时间的比率。在您链接到的维基百科页面上已经给出的最佳顺序访问时间是 O (N 3 。并行执行时间为 O(log 2 n)

    因此,加速是= O(n 3 / log 2 n)

    即使加速看起来如此简单和直接,但由于移动数据中固有的通信成本,实际情况下实现它非常困难。

    硕士定理

    a 是一个大于或等于1的整数, b 是一个大于1的实数。让 c 为正数实数和 d 非负实数。鉴于表格再次出现 -

    当n> 1时,

    T(n)= a * T(n / b)+ n c 。 1

    然后 n b 的力量,如果

    1. 记录 b a< c,T(n)=Θ(n c );
    2. 记录 b a = c,T(n)=Θ(n c * Log n);
    3. 记录 b a> c,T(n)=Θ(n log b a )。

答案 1 :(得分:1)

"无限数量的处理器"或许是一种不好的方式来表达它。

当人们从理论角度研究并行计算时,他们基本上想要问:假设我有更多的处理器而不是我需要的,我可以多快地做到这一点"。

这是一个明确定义的问题 - 仅仅因为你有大量的处理器并不意味着矩阵乘法是O(1)。

假设您在单个处理器上采用任何简单的矩阵乘法算法。然后我告诉你,如果你愿意的话,你可以为每一个汇编指令配备一个处理器,这样程序可以被"并行化"因为每个处理器只执行一条指令,然后与下一条指令共享其结果。

计算的时间不是" 1"循环,因为一些处理器必须等待其他处理器完成,并且这些处理器正在等待不同的处理器等。

一般来说,非平凡的问题(没有任何输入位无关的问题)在并行计算中需要时间O(log n),否则"答案"最后的处理器甚至没有时间依赖所有输入位。

O(log n)并行时间紧张的问题被认为是高度可并行化的。人们普遍猜测他们中的一些人没有这种财产。如果这不是真的,那么就计算复杂性理论而言,P会崩溃到一个较低的类,而不是猜测它。

答案 2 :(得分:1)

矩阵乘法可以使用O(logn)处理器在n^3中完成。方法如下:

输入:两个N x N矩阵M1M2M3将存储结果。

分配N个处理器以计算M3[i][j]的值。 M3[i][j]定义为Sum(M1[i][k] * M2[k][j]), k = 1..N。在第一步中,所有处理器都进行单次乘法。第一个做M1[i][1] * M2[1][j],第二个做M1[i][2] * M2[2][j],....每个处理器都保持其价值。现在我们必须总结所有这些乘法对。如果我们将求和组织到树中,我们可以在O(logn)时间内执行此操作:

     4         Stage 3
   /   \
  2     2      Stage 2
 / \   / \
1   1 1   1    Stage 1

我们使用(i, j)处理器为所有N^3并行运行此算法。