走出并行计算的误区,你应该在什么时候用它?

    xiaoxiao2021-04-15  326

    Anmol Rajpurohit

    Anmol Rajpurohit :当一件任务能被分割为多个独立处理(不必进行信息沟通与资源共享)的子任务,并行执行会是一个绝佳选择。

    即便这样,效率,即如何高效地执行,仍是一个关键问题。这关乎能否真正实现并行化理论上的优点。

    实际情况中,绝大多数代码都有需要串行执行的部分。可并行的子任务,也需要某种形式的数据传输同步。因此,相比串行而言,预测并行化到底能否让算法运行地更快是一件十分困难的事。

    相比按序处理任务所需要的计算周期,并行执行总是有额外代价——起码包含把任务分割为子任务,以及把它们的结果整合起来。并行计算相比串行的性能,在很大程度上是由一个因素决定的:上述额外步骤耗费的时间,与并行执行节省的时间这两者之间的差。

    值得注意的是,并行化的带来的额外步骤并不局限于代码运行之时,还包括编写并行计算代码所需的额外时间,以及修复漏洞(并行 vs. 串行)。

    有一项评估并行化表现的理论方法广为人知——Amdahl’s law。它用下面的公式来度量并行执行子任务带来的加速(多处理器) vs. 串行运行(单个处理器):

    Slatency 是执行整个任务的理论加速;

    s 是任务里受益于额外系统资源那部分的加速;

    p 是受益于额外系统资源那部分所占的执行时间的比例。

    为认识到 Amdahl’s Law 的意义,请看下面的图表。它展示了不同处理器核心数对应的理论加速。当然,这是基于所执行的任务所能达到的不同并行化程度。

    有一件事需要提醒诸位:并不是所有代码都能被高效地并行。能在多处理器核心上实现理论上的加速水平,这样的代码可谓是凤毛麟角。这是由于串行部分、内部信息交换成本等天然限制。通常,大型数据集才是并行执行的理想情形。但开发者不应该摄像并行化能带来性能提升,而应该在搞并行化之前,先在任务的子集上对并行和串行谁优谁劣做一个比较。

    本文作者:三川 本文转自雷锋网禁止二次转载, 原文链接 相关资源:七夕情人节表白HTML源码(两款)

    最新回复(0)