购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

第二部分
OpenMP通用核心

在本书的这一部分,我们将介绍OpenMP通用核心。它包括了绝大多数OpenMP程序员一直使用的编译指令、子句、库例程、环境变量和相关概念。

我们在第4章首先概述了OpenMP和OpenMP程序中管理线程的基本机制。OpenMP的这些基本线程管理功能,可以涵盖广泛的并行算法。

然后,我们进入第5章,介绍大多数程序员认为的OpenMP的“面包和黄油”:并行循环。使用共享工作循环构造,我们在代码中找到计算密集型循环,并将循环迭代分配给一组线程。当我们从一个循环到下一个循环时,它提出了一种直接的、增量的并行方法;并行化代码,直到达到我们的性能目标。在许多情况下,增量式、循环式并行并不能带来最佳性能。为了从并行算法中获得最大的收益,经常需要融合循环,重组数据以优化内存移动,或者完全改变底层算法。然而,增量式循环并行是开始使用OpenMP的好方法,在许多情况下,这是程序员愿意做的所有事情。

一旦有线程在一个地址空间内运行,你很快就会遇到线程之间如何共享数据所产生的问题。这就是第6章我们讨论OpenMP数据环境时的主题。这个主题是极其重要的,因为OpenMP程序中的许多错误都来自管理数据环境的错误。

通用核心的另一部分是任务级并行,这是第7章的主题。并行循环和显式管理的线程涵盖了广泛的算法。然而,对于那些并行性不在 for-loops 中,而是在不太规则的结构中,如具有未知先验长度的 while-loops 或递归算法的情况,它们可能具有挑战性。在这些情况下,并行性最好通过由线程组管理的动态任务队列来解决。随着并行计算的应用超越了作为科学计算核心的基本微分方程求解器,这种并行风格迅速发展。

在第8章中,我们探讨多线程程序中具有挑战性错误的另一个主要来源:当线程间共享的变量被读取时,管理哪些值可以返回的规则。这套规则被称为内存一致性模型。我们解释了OpenMP通用核心中使用的简化内存模型以及这个模型的局限性。

我们在第9章以快速回顾通用核心来结束这部分内容。根据多年使用OpenMP的经验,我们相信大多数程序员很少需要OpenMP通用核心没有涉及的内容。因此,首先掌握通用核心,只有在需要的时候,才会超越通用核心的内容。 6whbZGXmuCKg4AFOTCYiIq4Trr2miA2QrxBPnYUxjf2gQ7I7W/QfmqB/ZVjQRJ2H

点击中间区域
呼出菜单
上一章
目录
下一章
×