受用一生的定理:阿姆达尔定律

前言

阿姆达尔定律(Amdahl's Law)提供了一个最佳情况的估算,即通过优化系统的特定部分可以提升多少系统性能,用于预测并行任务中系统性能提升的理论上限。该定律是由计算机科学家吉恩·阿姆达尔(Gene Amdahl, 1922-2015)于1967年提出的。

1. 阿姆达尔定律公式

以一个处理已知数量输入数据的程序为例。这类程序通常包含一组难以并行化的顺序语句,以及一部分可以并行化的语句。

假设为P(Parallel)可并行化代码所占总代码的比例,如果使用N(Number)计算单元而不是单个线程来解决问题,S(Speedup)为预期的加速比,阿姆达尔定律如下:

S = 1 / (1 – P + P/N)

2. 阿姆达尔定律的好处

阿姆达尔定律有助于快速评估可用于系统加速方案的利弊。通过在计算链的某个部分投入更多硬件,我们可以确定能够实现的加速倍数。

相反,我们可以利用该定律快速估算程序中哪些部分可以进行优化,从而获得最佳效果。如果我们尝试通过并行化来加速以顺序操作为主的代码部分,那么它带来的投资回报将非常有限。

3. 阿姆达尔定律的局限性

在N个处理器上并行运行代码片段很少能带来线性N倍数的速度提升。随着程序中并行执行线程数量的增加,扩展问题也开始出现。最好的情况是,运行时环境允许您将编程模型的线程映射到实际的物理中央处理单元线程和核心,但并非所有编程语言都支持此功能。

如果系统中的线程数超过处理器的可用线程数,则必须处理上下文切换。这意味着线程会被中断,其相关的内部状态会被保存,并且其缓存行(线程使用的内部 CPU 缓存)会被刷新,例如,写回内存。

然后对新线程执行相反的操作。考虑到主内存比 CPU 慢一个数量级,上下文切换会引入延迟。

此外,当多个 CPU 核心并行运行时,内存带宽也会成为一个影响因素。它们处理的数据必须从随机存取存储器加载,并且至少要将结果写回。任何上下文切换都意味着需要消耗额外的内存带宽来交换线程数据。

这就是为什么并行化带来的性能提升从未实现线性增长,即使在代码的并行化部分也是如此。阿姆达尔定律提供了一个最佳情况的估计。

4. 使用阿姆达尔定律的示例

在图像处理中,假设你的程序读取一些数据,然后对每个数据项执行独立计算。读取数据需要一分钟,在单个 CPU 线程上处理数据又需要三分钟。每个元素(图像帧)都是独立的,可以单独处理。需要多少硬件才能将执行速度提高一倍?

P是并行化的比例,它代表四分钟中的三分钟,因此P=3/4,即0.75。需要将执行速度提升一倍,因此加速比S=2。使用上述阿姆达尔定律公式并求解N,可以得到下面的公式和计算结果。

N = P / (P - 1 - 1/S) = 0.75 / (0.75 – 1 – 1/2) = 3

需要用三个处理器来解决这个问题,将数据处理时间从三分钟缩短到一分钟。然而,数据加载仍然需要一分钟。硬件成本增加了两倍,但速度却只提高了一倍。

另外,占总时间四分之一的读取数据部分不会消失,即使其余并行代码的执行速度无限快(即在零秒内)。

该定律将一个直观正确的观察形式化:如果你选取代码中可以优化的部分并无限加快其速度,最后顺序部分的执行时间将成为瓶颈。

这个网址(https://www.desmos.com/calculator/dra8fw2cea)展示了阿姆达尔定律公式的坐标图。通过点击下图左边箭头所指的按钮,就可以看到加速比S随着N的变化情况,而且也可以手动滑动来分析某一个N情况下,S随着P的影响情况。

受用一生的定理:阿姆达尔定律_第1张图片

5. 阿姆达尔定律如何影响系统架构

内存带宽瓶颈只是性能考虑因素之一,大容量存储和网络带来的延迟是另一个主要因素。例如,即使拥有最好的索引,访问数据库表也需要进行大量I/O 操作,而且每个操作都有其存储或网络延迟。

为了克服这一限制,系统架构师可以通过在内存和外部 I/O 设备之间添加更多硬件通道来增加系统的 I/O 容量,或者通过添加不同的物理主机来水平扩展系统。这种水平扩展只有在主机能够独立处理数据记录或片段的情况下才有意义。可以通过“分片”来实现这一点,这是一种常用的机制,将数据拆分成可独立处理的片段。

例如,RAID1 驱动器阵列将相同的数据存储在多个驱动器(称为镜像)中,以实现更快的读取速度。访问数据时,系统可以将访问请求分散到多个驱动器上,从而加快程序的数据访问速度。

6. 如何利用阿姆达尔定律优化你的系统

即使将无限的资源投入到处理链的某个环节,也无助于加速其余部分。优化复杂系统的第一步是仔细观察它,并确保我们了解它在各个环节的时间分配。

以代码优化为例:

第一步是在代码中添加指标,用于观察各代码环节的延迟情况。利用这些指标可能需要一些复杂的设置。最基本的方法是定期将指标数据转储到存储中。在企业环境中,程序员通常可以访问监控和遥测系统,以便了解自己代码的行为。否则,开发人员将不知道如何进行优化。更糟糕的是,他们会盲目地花费精力改进某些代码段,而这些代码段在实际应用中却并非决定性的性能因素,这通常被称为“过早优化”。

一旦收集了这些指标,开发人员可以尝试将他们的代码路径描绘成时间/性能格式的图表。例如,假设一个请求来自网络。处理此请求将创建多次数据库访问,然后进行一些计算循环。这些操作中的每一个都可以有自己的指标。识别最长的代码路径并将其分解为单独的计算和延迟时间间隔,然后集中精力找到最佳的优化候选对象。

7. 总结

阿姆达尔定律不只是只能用于计算机科学中,也可用于生活、理财、做事等方方面面。平时可以多观察、记录和分析试试。

受用一生的定理:阿姆达尔定律_第2张图片

你可能感兴趣的:(芯片行业资讯,阿姆达尔定律)