是什么让并行编程变得困难?有人曾经说过,如果你不关心性能,并行编程很容易。你可以在一小时内编写一个并行程序。但是,如果你不在乎性能,为什么要费心写一个并行程序呢?
这本书解决了在并行编程中实现高性能的几个挑战。首先,设计具有与顺序算法相同水平的算法(计算)复杂度的并行算法可能具有挑战性。一些并行算法可以在其顺序计数器部分上增加巨大的开销,以至于它们甚至最终在更大的输入数据集上运行得更慢。
其次,许多应用程序的执行速度受内存访问速度的限制。我们将这些应用程序称为内存绑定,而不是计算绑定,后者受每字节数据执行的指令数量的限制。在内存绑定应用程序中实现高性能并行执行通常需要提高内存访问速度的新方法。
第三,并行程序的执行速度通常比其顺序计数器部分对输入数据特征更敏感。许多现实世界的应用程序需要处理具有不同特征的输入,例如不速或不可预测的数据速率,以及非常高的数据速率。并行程序的性能有时会随着这些特征而发生巨大变化。
第四,许多现实世界的问题用数学重复来描述最自然。将这些问题并行化通常需要以非直观的方式思考问题,并且在执行过程中可能需要冗余工作。
幸运的是,这些挑战中的大多数在过去是由研究人员解决的。跨应用程序域也有常见的模式,允许我们将从一个域派生的解决方案应用于其他域。这就是为什么我们将在重要的并行计算模式的背景下提出解决这些挑战的关键技术的主要原因。