当我查看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对非平凡问题的回答对于研究并行系统仍然非常有用。感谢下面所有温暖的心脏回答者!
答案 0 :(得分:3)
这个问题有两个方面,解决哪个问题将得到完全解答。
逐一回答问题。
这一点的简单答案是理解两个术语即。 任务粒度和任务依赖。
因此,对于具有四个步骤A, B, C, D
的进程,使得 D依赖于C,C依赖于B而B依赖于A ,那么单个处理器将起作用与2个处理器一样快,工作速度可达4个处理器,速度与无限处理器一样快。
这解释了第一颗子弹。
n X n
的方形矩阵分成四个大小为[n/2] X [n/2]
的块,然后继续分割,直到达到单个元素(或大小为{{1}的矩阵)这个树状设计的级别数是 O(log(n))。如果我们通过使用 † 主定理证明运行时间,我们可以使用重复计算相同的结果:
M(n)= 8 * M(n / 2)+Θ(Log n)
这是主定理的2 - 并将运行时间设为Θ(log 2 n)。
Big O和Theta之间的区别在于Big O只告诉一个进程不会超过Big O所提到的进程,而Theta告诉我们函数不只是有一个上限,而且还有下限和什么是在Theta中提到过。因此,有效地,函数复杂度的 plot 将夹在同一个函数之间,乘以两个不同的常量,如下图所示,换句话说,函数将在同样的速度:
图片取自: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 :(得分:1)
"无限数量的处理器"或许是一种不好的方式来表达它。
当人们从理论角度研究并行计算时,他们基本上想要问:假设我有更多的处理器而不是我需要的,我可以多快地做到这一点"。
这是一个明确定义的问题 - 仅仅因为你有大量的处理器并不意味着矩阵乘法是O(1)。
假设您在单个处理器上采用任何简单的矩阵乘法算法。然后我告诉你,如果你愿意的话,你可以为每一个汇编指令配备一个处理器,这样程序可以被"并行化"因为每个处理器只执行一条指令,然后与下一条指令共享其结果。
计算的时间不是" 1"循环,因为一些处理器必须等待其他处理器完成,并且这些处理器正在等待不同的处理器等。
一般来说,非平凡的问题(没有任何输入位无关的问题)在并行计算中需要时间O(log n)
,否则"答案"最后的处理器甚至没有时间依赖所有输入位。
O(log n)
并行时间紧张的问题被认为是高度可并行化的。人们普遍猜测他们中的一些人没有这种财产。如果这不是真的,那么就计算复杂性理论而言,P
会崩溃到一个较低的类,而不是猜测它。
答案 2 :(得分:1)
矩阵乘法可以使用O(logn)
处理器在n^3
中完成。方法如下:
输入:两个N x N
矩阵M1
和M2
。 M3
将存储结果。
分配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
并行运行此算法。