很容易找到并理解Amadahl定律的函数定义,但我能找到的所有工作实例都太模糊或太过学术/不可思议,因为我的小豌豆大脑无法理解。
Amadahl定律采用参数:F
,无法通过多线程改进的任务的百分比,以及N
,即使用的线程数。
如何以任何准确度计算F
?
如何查看一段代码并确定是否可以通过多线程改进?
答案 0 :(得分:1)
相对容易说出代码的哪些部分肯定不会受益于多线程:顺序部分。如果你必须按顺序执行一系列小步骤,多线程将无济于事,因为你总是需要在开始下一步之前等待一步。在这个意义上,许多常见任务(必然)不是顺序的:例如,在列表中搜索多个项目。如果要从列表中提取每个红色项目,可以在多个线程中共享列表的一部分,并将每个部分中的所有红色项目收集到最终结果列表中。并发编程的难点在于找到有效的方法来解决实际问题。
在较低级别,您可以讨论数据依赖性:如果特定指令或块使用该块的计算结果,则它取决于前一个块。所以(伪代码):
Block one:
load r1 into r2
add r1 to r3 into r4
Block two:
load r4 into r1
add 3 to r4 into r4
第二块取决于第一块:它们必须按顺序执行。这里:
Block one:
load r1 into r2
add r1 to r3 into r4
Block two:
load r1 into r3
add 3 to r1 into r1
情况并非如此。这对并发性并不直接有用,但希望它能更具体地说明这一点。它还说明了处理并发性的另一个问题:作为抽象块功能,这两个可以并行运行,但在这里给出的具体示例中,它们正在读/写一些相同的寄存器,因此编译器/管道器/无论如何都需要做更多的工作让他们一起跑。这一切都非常复杂,但在http://www.amazon.com/Computer-Architecture-Quantitative-Approach-Edition/dp/1558605967中得到了很好的报道。
其他哪些部分不会受益于多线程取决于您的编程环境和机器架构。
至于如何获得一个百分比,在实际案例中可能有一些挥手 - 我怀疑你会得到一个精确的数字。如果将代码划分为功能单元并分析每个代码中的执行时间,那么将为您提供大致适当的权重。然后,如果一个占用90%执行时间的部分可以通过多线程进行改进,那么您可以说90%的“任务”可以得到改善。
答案 1 :(得分:0)
如果要查看多线程可以改进的内容,您应该查看算法而不是代码。
通常,并行算法应该从头开始设计为并行。 “并行化”代码而不是算法本身要困难得多。
查看内存访问中的依赖关系(空间依赖关系),查看操作序列(时间依赖关系),了解您的计算机体系结构,并了解如何为您的任务构建正确的算法。
根据公式本身 - Wiki有很好的解释http://en.wikipedia.org/wiki/Amdahl's_law
答案 2 :(得分:0)
Amdahl将所有工作分为两组:完全可并行化,完全不可并行化。
将后者视为你无法摆脱的工作。你可以摆脱前者完美的海湾添加资源。
如果您读取文本文件并逐行处理,则永远不能按顺序读取文件以解析行。但是,您可以并行化各个行。如果读取文件需要1秒,那么你的代码将永远不会比这更快。
对于真实代码,您可以连接分析器以查看每个部分花费的时间。希望您可以将每个部分分类为其中一个类别。完成后,您可以轻松估算加速速度,并且非常准确。