本书共分为6章,从原理到实践对并行编程技术进行了层层剖析,并通过大量实例(除GPU编程示例外,均基于Python 3)演示了每一个知识点的具体运用方式,是提升并行编程技能的一本不可多得的好书。
相信本书的出版将会填补Python在并行领域应用的一大空白,能够帮助想要从事并行编程与并行计算的读者提升实践能力,并将这一能力应用到实际的项目开发中。
5大主题,涵盖多种场景下的并行编程:线程同步、进程通信、异步编程、分布式计算、GPU编程;绝大多数示例基于Python 3
前言
计算机科学的研究不仅应该涵盖计算处理所基于的原则,还应该反映出这些领域当前的知识状态。时至今日,技术的发展要求来自计算机科学所有分支领域的专家通晓软件与硬件,它们之间的交互是理解计算处理基本原理的关键所在。
出于这个原因,本书特别关注硬件架构与软件之间的关系。
之前,程序员可以借助于硬件设计、编译器与芯片让其软件程序在不做任何修改的情况下,速度变得更快或效率更高。
这个时代已然结束。现在,如果希望程序运行速度能变得更快,那么它必须要成为一个并行程序。
虽然很多研究人员的目标是程序员不需要了解运行其程序的硬件所具有的并行性,不过要想实现这个梦想还需要很多年的时间。今天,大多数程序员还是需要透彻理解硬件与软件之间的联系,这样程序才能在现代计算机架构上高效运行。
为了介绍并行编程的概念,我们使用了 Python编程语言。 Python很有趣,且易于使用,其流行度在近几年稳步上升。 Python是由 Guido van Rossum在 10多年前开发出来的, Python语法的简洁性与易于使用的特性很大程度上来源于 ABC,这是一门于 20世纪 80年代开发出来的教学语言。
除了这个具体的上下文外,Python还被用于解决实际的问题,它从一些典型的编程语言中借鉴了很多特性,比如说 C ++、Java与 Scheme等。这是其最卓越的特性之一,使得它广受专业软件开发者、科学研究产业以及计算机科学教育者的青睐。之所以有这么多人喜欢 Python,一个原因是它在实践与概念之间提供了最佳的平衡。 Python是一门解释型语言,因此无须陷入
编译与链接的泥潭中就可以立刻动手做事情。 Python还提供了广泛的软件库,可用在从 Web开发、图形学到并行计算的各种任务中。这种侧重于实践的特性非常吸引广大读者,可以让大家运行本书所介绍的重要项目。
本书提供了大量的示例,这些示例的灵感来源于很多场景,可以用它们解决实际问题。本书介绍了并行架构的软件设计原则,并确保程序清晰可读,避免使用一些复杂技术,都是一些简单且直接的示例。每个主题都以一个完整、可运行的 Python程序的一个片段来阐述,后面跟着的是程序的输出结果。
书中各章节采用模块化的方式组织,可以从最简单的讨论跳到高级的主题,这么做也适合于那些只想学习一些特定主题的读者。
我希望本书这样的结构与内容安排能够帮助读者更好地理解和掌握并行编程技术。
本书主要内容
第 1章概览了并行编程架构与编程模型。本章介绍了 Python编程语言、语言的特性、其易于使用和学习的特点、可扩展性以及丰富的软件库与应用。此外,本章还介绍了如何在应用以及并行计算中用好 Python这个工具。
第 2章介绍了如何通过 Python线程模块来实现线程并行。通过完整的编程示例,读者将学习到如何同步和操纵线程来实现多线程应用。
第 3章介绍了基于进程的用于并行化程序的方式。本章通过完整的示例展示了如何使用 Python多线程模块。此外,本章还介绍了如何通过进程来实现通信,借助 Python的 mpi4py模块使用消息传递的并行编程范式。
第 4章介绍了并发编程的异步模式。在某些方面,它要比基于线程的方式简单一些,因为它提供了单指令流,任务会明确放弃控制而非武断地挂起。本章介绍了如何通过 Python asyncio模块将每个任务组织为一系列更小的步骤,并在异步模式下执行。
第 5章介绍了分布式计算。它指的是从逻辑上(甚至可能是地理位置上分布的)聚合几个计算单元,并以一种透明且一致的方式协同运行单个计算任务的过程。本章将会介绍 Python所提供的,使用面向对象、 Celery、SCOOP、远程过程调用的架构实现解决方案,比如,Pyro4与 RPyC。本章也介绍了其他不同的方式,如 PyCSP、Disco,后者是 Python版本的 MapReduce算法。
第 6章介绍了现代图形处理单元( GPU),它使数值计算的性能有了突破性提升,代价则是编程复杂度的增加。实际上, GPU编程模型要求程序员手工管理 CPU与 GPU之间的数据传输。本章将会通过程序示例与用例介绍如何使用 GPU卡所提供的计算能力,其中使用了强大的 Python模块: PyCUDA、NumbaPro与 PyOpenlCL。
阅读前的准备
本书所有示例都已经在 Windows 7的 32位机器上进行过测试。此外,使用 Linux环境将会对学习大有裨益。
运行示例所需的 Python版本是:
. Python 3.3(前 5章)
. Python 2.7(只有第 6章需要)
需要使用到如下模块(都是可以自由下载的):
. mpich-3.1.4
. pip 6.1.1
. mpi4py1.3.1
. asyncio 3.4.3
. Celery 3.1.18
. Numpy 1.9.2
. Flower 0.8.32(可选)
. SCOOP 0.7.2
. Pyro 4.4.36
. PyCSP 0.9.0
. DISCO 0.5.2
. RPyC 3.3.0
. PyCUDA 2015.1.2
. CUDA Toolkit 4.2.9(最低为此版本)
. NVIDIA GPU SDK 4.2.9(最低为此版本)
. NVIDIA GPU驱动
. Microsoft Visual Studio 2008 C++ Express Edition(最低为此版本)
. Anaconda Python Distribution
. NumbaPro编译器
. PyOpenCL 2015.1
. Win32 OpenCL Driver 15.1(最低为此版本)
本书面向的读者
本书是写给那些想要使用并行编程技术来编写强大且高效代码的开发者的。阅读完本书后,读者将掌握并行计算的基础知识与高级特性。 Python编程语言易于学习,即便不是专家也能够轻松理解本书所介绍的主题。
本书结构
本书包含如下组成部分。
准备工作
这部分介绍了攻略的主题,描述了如何为该攻略搭建好软件或是进行一些设置。
具体操作
这部分介绍了实现攻略所需要的步骤。
实例精解
这部分通常会对“具体操作”部分的内容进行解释和说明。
知识扩展
这部分包含了关于攻略的一些额外信息,目的在于使读者更加深入地理解攻略的内容。
参考
这部分包含一些关于攻略的参考信息。
约定
在本书中,你会看到各种样式的文本,用于区分不同类型的信息。下面对这些文本样式及其含义进行一些说明。
文本中的代码、数据库表名、目录名、文件名、文件扩展、路径名、虚拟的 URL、用户输入以及 Twitter handle会这样表示“要执行第一个示例,我们需要用到程序 helloPython-WithThreads.py.”。
代码块样式如下所示:
print ("Hello Python Parallel Cookbook!!")
closeInput = raw_input("Press ENTER to exit")
print "Closing calledProcess"
希望读者注意到代码块中的某一部分时,相关行或是代码会加粗处理:
@asyncio.coroutine
def factorial(number):
do Something
@asyncio.coroutine
任何命令行输入或是输出的样式如下所示:
C:\>mpiexec -n 4 python virtualTopology.py
警告或是重要的说明位于框中。
提示与技巧位于这个图标后。