没有合适的资源?快使用搜索试试~ 我知道了~
首页Python并行编程指南:从入门到实践
Python并行编程指南:从入门到实践
需积分: 9 2 下载量 104 浏览量
更新于2024-07-17
收藏 7.24MB PDF 举报
"《Python并行编程Cookbook》是一本专注于讲解Python语言中并行编程技巧和实践的指南。该书分为三个主要章节,旨在帮助读者深入理解并行计算的概念、内存管理和不同编程模型的应用。 第一章,"认识并行计算与Python",首先介绍了并行计算的基本概念,包括内存架构和内存管理的重要性。接着探讨了各种并行编程模型,如数据并行、任务并行和函数式编程,并强调了如何设计高效并行程序以及性能评估的方法。这一章还介绍了Python在并行世界中的角色,特别是Python的线程和进程支持。 第二章详细讲解了基于线程的并行编程。它涵盖了如何使用Python的内置线程模块创建、同步和通信线程。主题包括线程定义、线程同步机制(如Lock、RLock、信号量、条件变量和事件),以及使用`with`语句简化线程管理和queue进行线程间通信。性能评估是这部分的重要组成部分。 第三章转向基于进程的并行编程,涉及进程的创建、命名、后台运行、控制和同步。读者可以学习如何在子类中利用进程、传递对象、处理进程间的状态管理以及利用进程池提高效率。此外,书中还介绍了mpi4py模块,用于实现点对点通讯以及如何避免常见的死锁问题,如集体通讯的broadcast模式。 通过这本书,读者不仅能掌握Python在并行计算领域的核心技能,还能学习到如何在实际项目中选择合适的并行策略,以及如何优化并行程序的性能,确保在大规模数据处理和多核处理器环境中实现高效的计算。无论是初学者还是经验丰富的开发者,都能从中受益匪浅。"
资源详情
资源推荐
![](https://csdnimg.cn/release/download_crawler_static/10998591/bg10.jpg)
python-parallel-programming-cookbook-cn Documentation, 发发发布布布 1.0
1.4.2 多多多线线线程程程模模模型型型
在这个模型中,单个处理器可以有多个执行流程,例如,创建了一个顺序执行任务之后,会创建一系列可
以并行执行的任务。通常情况下,这类模型会应用在共享内存架构中。由于多个线程会对共享内存进行操
作,所以进行线程间的同步控制是很重要的,作为程序员必须防止多个线程同时修改相同的内存单元。现
代的CPU可以在软件和硬件上实现多线程。POSIX 线程就是典型的在软件层面上实现多线程的例子。Intel
的超线程 (Hyper-threading) 技术则在硬件层面上实现多线程,超线程技术是通过当一个线程在停止或等
待I/O状态时切换到另外一个线程实现的。使用这个模型即使是非线性的数据对齐也能实现并行性。
1.4.3 消消消息息息传传传递递递模模模型型型
消息传递模型通常在分布式内存系统(每一个处理器都有独立的内存空间)中应用。更多的任务可以驻留
在一台或多台物理机器上。 程序员需要确定并行和通过消息产生的数据交换。 实现这个数据模型需要在代
码中调用特定的库。 于是便出现了大量消息传递模型的实现,最早的实现可以追溯到20世纪80年代,但直
到90年代中期才有标准化的模型——实现了名为MPI (the Message Passing Interface, 消息传递接口)的事实标
准。MPI 模型是专门为分布式内存设计的,但作为一个并行编程模型,也可以在共享内存机器上跨平台使
用。
1.4.4 数数数据据据并并并行行行模模模型型型
在这个模型中,有多个任务需要操作同一个数据结构,但每一个任务操作的是数据的不同部分。 在共享内
存架构中,所有任务都通过共享内存来访问数据;在分布式内存架构中则会将数据分割并且保存到每个任
务的局部内存中。为了实现这个模型,程序员必须指定数据的分配方式和对齐方式。 现代的GPU在数据已
对齐的情况下运行的效率非常高。
12 Chapter 1. 第第第一一一章章章 认认认识识识并并并行行行计计计算算算和和和Python
![](https://csdnimg.cn/release/download_crawler_static/10998591/bg11.jpg)
python-parallel-programming-cookbook-cn Documentation, 发发发布布布 1.0
1.5 如如如何何何设设设计计计一一一个个个并并并行行行程程程序序序
并行算法的设计是基于一系列操作的,在编程的过程中必须执行这些操作来准确地完成工作而不会产生部
分结果或错误结果。并行算法地大致操作如下:
• 任务分解 (Task decomposition)
• 任务分配 (Task assignment)
• 聚合 (Agglomeration)
• 映射 (Mapping)
1.5.1 任任任务务务分分分解解解
第一阶段,将软件程序分解为可以在不同处理器执行的多个任务或一系列指令以实现并行性。下面展示了
两个方法来实现程序分解:
• 按范围分解 (Domain decomposition):使用这个分解方法,程序所需的数据会被分解;处理器会使用同
一个程序处理不同的数据。这个方法一般在需要处理大量数据的情况下使用。
• 按功能分解 (Functional decomposition):使用这个分解方法会将问题分解 为几个任务,每个任务会对可
利用的数据执行不同的操作。
1.5.2 任任任务务务分分分配配配
在这个步骤中,并行程序将任务分配给各种处理器的机制是确定的。 这个阶段非常重要,因为在这阶段会
向各个处理器之间分配工作。负载均衡是这个阶段的关键,所有处理器都应该保持工作状态,避免长时间
的空闲。 为了实现这个效果,程序员必须考虑异构系统的可能性,异构系统会尝试将任务分配给相对更适
合的处理器。 最后,为了让并行程序有更高的效率,必须尽量减少处理器之间的通讯,因为处理器之间的
通讯通常是程序变慢和资源消耗的源头。
1.5. 如如如何何何设设设计计计一一一个个个并并并行行行程程程序序序 13
![](https://csdnimg.cn/release/download_crawler_static/10998591/bg12.jpg)
python-parallel-programming-cookbook-cn Documentation, 发发发布布布 1.0
1.5.3 聚聚聚合合合
聚合,就是为了提升性能将小任务合并成大任务的过程。如果设计过程的前两个阶段是将分解问题得到的
任务数量大大超过处理器可接受的程度,或者计算机不是专门设计用于 处理大量小任务 (如GPU的架构就非
常适合处理数百万甚至上亿任务),那么过分解会导致严重的效率下降。一般情况下,这是因为任务需要跟
处理它的处理器或线程进行通讯。大多数的通讯的消耗不仅包括跟传输数据量相称的部分,还包括进行通
讯的固定部分 (如建立 TCP 连接的延迟)。如果分解的任务过小,固定消耗可能比数据量还大,可以说这样
的设计是低效的。
1.5.4 映映映射射射
在并行算法设计的映射阶段,会指定任务由哪个处理器处理。这阶段的目标是减少总体的执行时间。 在这
里需要经常做取舍,因为下面两个相互矛盾的策略:
• 需要频繁通讯的任务应该由同一个处理器处理以增强局部性。
• 可以并行执行的任务应该由多个处理器处理以增强并行性。
这就是所谓的映射问题,也是一个NP完全问题——一般情况下不能再多项式时间内解决的问题。 在大小相
等和通讯模式容易定义的任务中,映射很直接 (在这里也可以执行聚合的步骤来合并映射到相同处理器的任
务)。但是如果任务的通讯模式难以预测或者每个任务的工作量都不一样,设计一个高效的映射和聚合架构
就会变得有难度。 由于存在这些问题,负载均衡算法会在运行时识别聚合和映射策略。 最难的问题是在程
序执行期间通信量或任务数量改变的问题。针对这些问题,可以使用在执行过程中周期性运行的动态负载
均衡算法。
1.5.5 动动动态态态映映映射射射
无论是全局还是局部,对于不同的问题都有不同的负载均衡算法。全局算法需要对即将指向的计算有全局
的认识,这样通常会增加很多开销。 局部算法只需要依靠正在解决的问题的局部信息,对比全局算法能够
减少很多开销,但在寻找最佳聚合和映射的能力较差。 然而,即使映射的结果较差,节省的开销一般还是
能减少执行时间。 如果任务除了执行开始和结束几乎不和其它任务进行通讯,那么可以使用任务调度算法
简单地把任务分配给空转的处理器。 在任务调度算法中,会维护一个任务池,任务池中包含了待执行的任
务,工作单元 (一般是处理器) 会从中取出任务执行。
接下来会解释这个模型中的三个通用方法。
1.5.6 管管管理理理单单单元元元/工工工作作作单单单元元元 (Manager/worker)
这是一个基础的动态映射架构,在这个架构中工作单元会连接到一个中央管理单元中。 管理单元不停发送
任务给工作单元并收集运算结果。这个策略在处理器数量相对较小的情况下表现最好。
1.5.7 分分分层层层的的的管管管理理理单单单元元元/工工工作作作单单单元元元 (Hierarchical manager/worker)
这是拥有半分布式布局的管理单元/工作单元 的变种;工作单元会按组 划分,每一组都有器管理 单元。 当工
作单元从组管理单元获取任务时,组管理单元会和中央管理单元通讯 (或者组管理单元之间直接通讯)。通过
提前获取任务可以提升这个基础策略的性能,这就导致了通讯和计算重迭进行。这样就可以在多个管理单
元之间传播负载,如果所有工作单元都向同一个管理单元请求任务,这种策略本身就可以应付大量的处理
器。
14 Chapter 1. 第第第一一一章章章 认认认识识识并并并行行行计计计算算算和和和Python
![](https://csdnimg.cn/release/download_crawler_static/10998591/bg13.jpg)
python-parallel-programming-cookbook-cn Documentation, 发发发布布布 1.0
1.5.8 去去去中中中心心心化化化 (Decentralize)
在这个架构中,所有东西都是去中心化的。每个处理器都维护着自己的任务池并且直接和其它处理器通讯
请求任务。处理器有很多种方式选择处理器请求任务,选择哪种方式有待解决的问题决定。
1.6 如如如何何何评评评估估估并并并行行行程程程序序序的的的性性性能能能
并行编程的发展产生了对性能指标和并行程序评估软件的需求,通过评估性能才能确定该算法是否方便快
捷。 实际上,并行计算的重点是在相对较短的时间内解决体量较大的问题。为了能够达到这个目的,需要
考虑的因素有:使用的硬件类型,问题的可并行程度和采用的编程模型等。为了加速算法评估过程,引进
了基本概念分析,也就是将并行算法和原始的顺序执行做对比。通过分析和确定线程数量和/或使用的处理
器数量来确定性能。
为了进行分析,在这里介绍几个性能指标:加速比,效率和扩展性。
阿姆德尔定律 (Ahmdal’s law) 引入了并行计算的极限,来评估串行算法并行化的效率。 古斯塔夫森定律
(Gustafson’s law) 也做了相似的评估。
1.6.1 加加加速速速比比比
加速比用于衡量使用并行 方式解决问题的收益。假设使用单个处理单元解决这个问题需要的时间为 ,
使用 个相同的处理单元解决这个问题的时间为 ,那么加速比 。如果
,加速比为线性,也就是说 执行速度随着处理器数量的增加而加快。当然,这只是一个理想状态。当
为最佳串行算法 的执行时间,加速比是绝对 的,而当 为并行算法在单个处理器上的执行时间,那么加
速比是相对的。
下面概括了上述的情况:
• 为线性加速比,也是理想加速比。
• 为真实加速比
• 为超线性加速比
1.6.2 效效效率率率
在理想状态下,如果一个并行系统有 个处理单元,那么它能提供的加速比等于 。然而,这几乎是
不可能达到的。处理单元空转和通讯通常会浪费一些时间。 效率通常是用于评价处理器在执行任务时是否
被充分利用的性能指标,它跟通讯和同步所耗费的时间作比较。
1.6. 如如如何何何评评评估估估并并并行行行程程程序序序的的的性性性能能能 15
![](https://csdnimg.cn/release/download_crawler_static/10998591/bg14.jpg)
python-parallel-programming-cookbook-cn Documentation, 发发发布布布 1.0
假设效率为 ,可以通过 算出。拥有线性加速比的算法的效率 ;
在其它情况下, 会小于1。下面会定义三种情况:
• 当 ,为线性加速比。
• 当 ,为真实情况。
• 当 ,可以确定这是一个有问题的低效并行算法。
1.6.3 伸伸伸缩缩缩性性性
伸缩性用于度量并行机器高效运行的能力, 代 表跟处理器数量成比例的计算能力 (执行速度)。如果问题的规
模和处理器的数量同时增加,性能不会下降。 在依靠各种因素叠加的可伸缩系统中,可以保持相同的效率
或者有更高的效率。
1.6.4 阿阿阿姆姆姆德德德尔尔尔定定定律律律 (Ahmdal’s law)
阿姆德尔定律广泛使用于处理器设计和并行算法设计。 它指出程序能达到的最大加速比被程序的串行部分
限制。 中 指程序的串行部分。它 的意思是,例如一个程序90%的 代码都是并行
的,但仍存在10%的串行代码,那么系统中即使由无限个处理器能达到的最大加速比仍为9。
1.6.5 古古古斯斯斯塔塔塔夫夫夫森森森定定定律律律 (Gustafson’s law)
古斯塔夫森定律在考虑下面的情况之后得出的:
• 当问题的规模增大时,程序的串行部分保持不变。
• 当增加处理器的数量时,每个处理器执行的任务仍然相同。
古斯塔夫森定律指出了加速比 , 为处理器的数量, 为
加速比, 是并行处理器中的非并行的部分。作为对比,阿姆德尔定律将单个处理器的执行时间作为定量
跟并行执行时间相比。 因此阿姆德尔定律是基于固定的问题规模提出的,它假设程序的整体工作量不会随
着机器规模 (也就是处理器数量) 而改变。 古斯塔夫森定律补充了阿姆德尔定律没 有考虑解决问题所需的资
源总量的不足。古斯塔夫森定律解决了这个问题, 它表明设定并行解决 方案所允许耗费的时间的最佳方式
是考虑所有的计算资源和基于这类信息。
1.7 介介介绍绍绍Python
Python是一种动态的解释型语言,应用场景广泛。它具有以下特性:
• 简明、易读的语法
• 丰富的标准库。通过第三方的软件模块,我们可以方便地添加数据类型、函数和对象
16 Chapter 1. 第第第一一一章章章 认认认识识识并并并行行行计计计算算算和和和Python
剩余140页未读,继续阅读
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://profile-avatar.csdnimg.cn/9be348d6f94549558cdf4e9b892f681d_dashoumeixi.jpg!1)
__xa__
- 粉丝: 86
- 资源: 25
上传资源 快速赚钱
我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助
![](https://csdnimg.cn/release/wenkucmsfe/public/img/voice.245cc511.png)
最新资源
- 解决本地连接丢失无法上网的问题
- BIOS报警声音解析:故障原因与解决方法
- 广义均值移动跟踪算法在视频目标跟踪中的应用研究
- C++Builder快捷键大全:高效编程的秘密武器
- 网页制作入门:常用代码详解
- TX2440A开发板网络远程监控系统移植教程:易搭建与通用解决方案
- WebLogic10虚拟内存配置详解与优化技巧
- C#网络编程深度解析:Socket基础与应用
- 掌握Struts1:Java MVC轻量级框架详解
- 20个必备CSS代码段提升Web开发效率
- CSS样式大全:字体、文本、列表样式详解
- Proteus元件库大全:从基础到高级组件
- 74HC08芯片:高速CMOS四输入与门详细资料
- C#获取当前路径的多种方法详解
- 修复MySQL乱码问题:设置字符集为GB2312
- C语言的诞生与演进:从汇编到系统编程的革命
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
![](https://img-home.csdnimg.cn/images/20220527035711.png)
![](https://img-home.csdnimg.cn/images/20220527035711.png)
![](https://img-home.csdnimg.cn/images/20220527035111.png)
安全验证
文档复制为VIP权益,开通VIP直接复制
![](https://csdnimg.cn/release/wenkucmsfe/public/img/green-success.6a4acb44.png)