并行计算作业一·
- 格式:docx
- 大小:149.11 KB
- 文档页数:3
并行计算实验报告一江苏科技大学计算机科学与工程学院实验报告评定成绩指导教师实验课程:并行计算宋英磊实验名称:Java多线程编程学号: 姓名: 班级: 完成日期:2014年04月22日1.1 实验目的(1) 掌握多线程编程的特点;(2) 了解线程的调度和执行过程;(3) 掌握资源共享访问的实现方法。
1.2 知识要点1.2.1线程的概念(1) 线程是程序中的一个执行流,多线程则指多个执行流;(2) 线程是比进程更小的执行单位,一个进程包括多个线程;(3) Java语言中线程包括3部分:虚拟CPU、该CPU执行的代码及代码所操作的数据。
(4) Java代码可以为不同线程共享,数据也可以为不同线程共享; 1.2.2 线程的创建(1) 方式1:实现Runnable接口Thread类使用一个实现Runnable接口的实例对象作为其构造方法的参数,该对象提供了run方法,启动Thread将执行该run方法;(2) 方式2:继承Thread类重写Thread类的run方法;1.2.3 线程的调度(1) 线程的优先级, 取值范围1,10,在Thread类提供了3个常量,MIN_PRIORITY=1、MAX_ PRIORITY=10、NORM_PRIORITY=5;, 用setPriority()设置线程优先级,用getPriority()获取线程优先级; , 子线程继承父线程的优先级,主线程具有正常优先级。
(2) 线程的调度:采用抢占式调度策略,高优先级的线程优先执行,在Java 中,系统按照优先级的级别设置不同的等待队列。
1.2.4 线程的状态与生命周期说明:新创建的线程处于“新建状态”,必须通过执行start()方法,让其进入到“就绪状态”,处于就绪状态的线程才有机会得到调度执行。
线程在运行时也可能因资源等待或主动睡眠而放弃运行,进入“阻塞状态”,线程执行完毕,或主动执行stop方法将进入“终止状态”。
1.2.5 线程的同步--解决资源访问冲突问题(1) 对象的加锁所有被共享访问的数据及访问代码必须作为临界区,用synchronized加锁。
高等计算机体系结构作业6:预取和并行1预取 I 20分假如你是一位架构师,正在为你的机器设计预取引擎。
你先在机器上使用跨度预取器执行了A和B两个应用。
应用A:uint8_t a[1000];sum = 0;for (i = 0; i < 1000; i += 4){sum += a[i];}应用B:uint8_t a[1000];sum = 0;for (i = 1; i < 1000; i *= 4){sum += a[i];}i 和 sum在寄存器中,数组a在内存中,一个cache块大小为4个字节。
(a) 使用跨度预取器,应用A和B的预取精度和覆盖率分别是多少?这个跨度预取器检测两次连续访存的跨度,从当前访问的cache块按照这个跨度预取下一个cache块。
答:应用A可以看到执行了1000/4=250次,第一次去内存取数组,而cache块大小为4字节32位,数组访问每次间隔为4,数组存储单位为无符号的8位,刚好每次访存时候都是一个cache块,因此第一次和第二次会访存形成跨度为4的预取模式。
访问序列为a[0],a[4], a[8],…,a[996],预取序列从a[8],…,a[996],a[1000](访问a[996]时候会预取a[1000]),因此有249个块被预取,248个块被使用,所以预取精度为248/249=99.6%,cache块缺失250次,预取消除块缺失有248次,因此覆盖率为248/250=99.20%应用B访问为a[1],a[4], a[16], a[64], a[256],由于访存的跨度不是常数,所以所有预取都没命中,因此覆盖率和命中率都为0。
(b) 请分别为应用A和B建议能获得更好的精度和覆盖率的预取器i) 应用A答:预取器总是预取下一个块的方式,这样的话a[4]这个块在a[0]访问的时候就会被预取,从而使得预取精度提高到为249/250,覆盖率为249/250。
并行计算实验一报告广东技术师范学院实验报告计算机科学与学院: 计算机科学学院专业: 班级: 成绩: 技术姓名: 学号: 组别: 组员: 实验地点: 工业中心203 实验日期: 指导教师签名: 预习情况操作情况考勤情况数据处理情况实验 (一) 项目名称: 建立并行计算平台一、实验目的在一个局域网中建立能够互相通信的两台计算机,为以后实验建立一个实验平台。
二、实验内容:1.1 系统要求安装MPICH for Microsoft Windows 对系统有如下要求:Windows NT4/2000/XP 的Professional 或Server 版(不支持Windows 95/98) 所有主机必须能够建立TCP/IP 连接MPICH 支持的编译器有:MS VC++ 6.x,MS VC++.NET,Compaq Visual Fortran 6.x,Intel Fortran,gcc ,以及g77 。
安装MPICH ,必须以管理员的身份登录。
1.2 安装以管理员的身份登录每台主机,在所有主机上建立一个同样的账户(当然也可以每个机器使用不同的用户名和账户,然后建立一个配置文件,使用命令行的方式运行程序),然后,运行下载的安装文件,将MPICH 安装到每台主机上。
打开“任务管理器”中的“进程”选项卡,查看是否有一个mpd.exe 的进程。
如果有的话说明安装成功。
以后每次启动系统,该进程将自动运行。
打开任务管理器如下:1.3 注册与配置安装好MPICH 之后还必须对每台计算机进行注册和配置才能使用。
其中注册必须每台计算机都要进行,配置只要在主控的计算机执行就行了。
注册的目的是,将先前在每台计算机上申请的账号与密码注册到MPICH 中去,这样MPICH 才能在网络环境中访问每台主机。
配置方法:运行“mpich\mpd\bin\MPIRegister.exe”首先会提示输入用户账号,然后会提示输入两边密码,之后会问你是否保持上面的设定。
程序设计员实操考核中的并行计算题目分析1. 引言在程序设计员的实操考核中,常常会出现并行计算题目。
并行计算是指将任务分解为多个子任务,并通过多个计算资源同时执行这些子任务,从而加快计算速度的一种方式。
在解决并行计算题目时,我们需要分析题目要求,设计合适的并行计算方案,并实现代码。
本文将分析并行计算题目的一般要求,并提供解题思路和实现步骤,以帮助程序设计员应对实操考核中的并行计算题目。
2. 并行计算题目的一般要求并行计算题目通常涉及大规模数据集或复杂的计算任务。
题目要求程序设计员使用并行计算的方法,实现高效的算法,以尽快完成任务。
常见的并行计算题目包括并行排序、并行搜索、并行矩阵计算等。
这些题目往往要求程序设计员在指定的时间内完成任务,并给出正确的结果。
3. 解题思路解决并行计算题目的一般思路如下:3.1. 分析题目要求首先,需要仔细阅读并理解题目要求。
明确题目所给的输入数据、输出结果和任务要求,以便后续的设计和实现。
3.2. 设计并行计算方案根据题目要求和任务性质,设计合适的并行计算方案。
方案的设计应充分考虑任务的拆分、任务间的协作和数据通信等因素,并尽量减少计算资源的闲置和通信开销。
3.3. 实现并行计算代码根据设计的并行计算方案,编写并行计算代码。
这包括任务的划分、任务间的协作和数据通信的实现等。
在实现过程中,需要注意线程或进程之间的同步和互斥,避免数据竞争和死锁等问题。
3.4. 调试和优化完成并行计算代码后,需要进行调试和优化。
调试可以通过输出中间结果、查看代码执行日志和使用调试工具等方式进行。
优化可以通过调整任务划分策略、改进计算算法和优化数据通信等方法实现。
调试和优化的目标是提高并行计算的效率和准确性。
3.5. 运行和验证完成优化后的并行计算代码后,可以进行运行和验证。
通过对给定测试数据的运行和结果进行验证,检查代码的正确性和性能是否符合要求。
4. 实现步骤在解决并行计算题目时,可以按照以下步骤进行实现:1.阅读并分析题目要求,理解任务的性质和要求。
python 并行计算例子
Python 中有几种方式可以实现并行计算。
下面我将介绍其中的一种方法,使用 Python 的 multiprocessing 库。
以下是一个简单的例子,我们将使用 multiprocessing 库来并行计算一个简单的函数。
```python
import multiprocessing
import time
定义一个函数,这个函数将由多个进程并行执行
def square(n):
return n n
创建一个进程池,包含4个进程
pool = (processes=4)
使用进程池来并行执行我们的函数
results = (square, range(10))
打印结果
print(results)
```
在这个例子中,我们首先导入了 multiprocessing 库,然后定义了一个简单的函数 `square`,这个函数将一个数字平方。
然后我们创建了一个进程池,这个进程池包含4个进程。
我们使用进程池的 `map` 方法来并行执行我们的 `square` 函数。
最后,我们打印出结果。
注意,由于 Python 的全局解释器锁(GIL)的存在,Python 的多线程并不能实现真正的并行计算。
因此,对于 CPU 密集型任务,使用multiprocessing 库是一个更好的选择。
1.并行算法设计主要有哪些方法,各种方法的特点是什么?①串行程序的直接并行化:检查和开拓现有串行算法中固有的并行性,直接将其并行化。
一个显著优点是:算法的稳定性,收敛性等问题在串行算法中已有结论②从问题描述开始设计并行算法:从问题本身的描述出发,从头设计一个全新的并行算法③借用已有的算法求解新问题:借助已有的并行算法求解新问题,方法描述:找出求解问题和某个已解决问题之间的联系;改造或利用已知算法应用到求解问题上。
2.并行算法的设计过程主要分为哪几个阶段,各阶段主要完成什么工作,各阶段之间的有什么关系?设计过程分为四步:任务划分(Partitioning 划分) 、通信分析(Communication 通信) 、任务组合(Agglomeration 组合) 、处理器映射(Mapping 映射)。
各阶段的任务:划分:将计算任务分解成小任务,以尽量开拓并行执行的可能性;通信:确定小任务需要进行的通信,为组合做准备;组合:将一些小任务组合成大任务以减少通信开销;映射:将组合后的任务分配到处理器上,其目标是使总执行时间和通信开销尽量小,使处理器的利用率尽量高3.并行算法设计技术要有哪些?并说明各种技术主要的设计思想划分设计技术、分治设计技术、平衡树设计技术、倍增设计技术、流水线设计技术、破对称技术划分设计技术:划分技术的基本出发点是有效利用空闲处理器、大问题求解需要提高求解速度。
具体划分方法包括均匀划分、平方根划分、对数划分、功能划分等。
分治技术:分治技术是一种问题求解的方法学,其思想是将原来的大问题分解成若干个特性相同的子问题分而治之。
流水线技术:设计思想是将算法流程划分成p个前后衔接的任务片断,每个任务片断的输出作为下一个任务片断的输人;所有任务片断按同样的速率产生出结果。
倍增技术:又称指针跳跃技术,适用于处理以链表或树之类表示的数据结构。
每当递归调用时,要处理的数据之间的距离将逐步加倍,经过k步后就可完成距离为2*的所有数据的计算。
一、前言随着计算科学领域的不断发展,对于高性能计算的需求也越来越迫切。
在众多高性能计算方法中,多作业多线程并行计算方法得到了广泛应用。
本文将重点探讨在fortranmpi中实现多作业多线程并行计算的方法和技巧。
二、fortranmpi概述fortranmpi是一种结合了fortran语言和消息传递接口(MPI)的并行计算框架。
fortranmpi可以实现在多个CPU或者多台计算机上进行协同计算,充分发挥计算资源的潜力。
三、多作业多线程并行计算方法1. 任务拆分在fortranmpi中,多作业多线程并行计算首先需要进行任务的拆分。
通常可以将一个大型计算任务分解成多个小任务,然后分配给不同的CPU或计算节点进行并行计算。
这样可以提高计算效率,缩短计算时间。
2. 数据通信在多作业多线程并行计算过程中,不同CPU或计算节点之间需要进行数据通信。
数据通信是并行计算的关键环节之一,它直接影响到整个计算的性能和效率。
通过fortranmpi提供的数据传输接口,可以实现不同节点之间的数据交换和同步,从而完成整体计算任务的协同工作。
3. 负载均衡在进行多作业多线程并行计算时,往往需要考虑到不同作业之间的负载均衡问题。
通过合理的任务分配和调度,可以使得不同作业之间的计算负载更加均衡,充分发挥计算资源的利用率。
4. 结果合并在并行计算完成后,不同作业的计算结果需要进行合并,得到最终的整体计算结果。
这需要进行数据的收集和整合处理,通过fortranmpi提供的结果合并接口,可以实现不同作业计算结果的汇总和整合。
四、fortranmpi多作业多线程并行计算实例下面我们通过一个简单的实例来演示在fortranmpi中实现多作业多线程并行计算的方法。
```fortranprogram parallelputationimplicit noneinclude 'mpif.h'integer :: ierr, rank, size, i, n, local_sum, total_suminteger, parameter :: n_global = 1000call MPI_INIT(ierr)call MPI_COMM_SIZE(MPI_COMM_WORLD, size, ierr)call MPI_COMM_RANK(MPI_COMM_WORLD, rank, ierr)n = n_global / sizelocal_sum = 0do i = rank*n + 1, (rank+1)*nlocal_sum = local_sum + iend docall MPI_REDUCE(local_sum, total_sum, 1, MPI_INTEGER, MPI_SUM, 0, MPI_COMM_WORLD, ierr)if (rank == 0) thenprint*, "The total sum is ", total_sumend ifcall MPI_FINALIZE(ierr)end program parallelputation```在上面的fortran代码中,我们使用了MPI库进行了多作业多线程并行计算任务的拆分、数据通信、数据合并和负载均衡。
并⾏算法 并发算法虽然可以充分的发挥多核CPU的性能。
但不幸的是,并⾮所有的计算都可以改造成并发的形式。
简单来说,执⾏过程中有数据相关性的运算都是⽆法完美并⾏化的。
假如现在有两个数C和B,如果我们要计算(B+C)*B/2,那么这个运⾏过程就是⽆法并⾏的。
原因是,如果B+C没有执⾏完成,则永远都算不出(B+C)*B,这就是数据的相关性。
如果线程执⾏时,所需要的数据存在这种依赖关系,那么,就没有办法将它们进⾏完美的并⾏化。
那遇到这种情况,有没有什么补救措施呢?答案是肯定的,那就是借鉴⽇常⽣产中的流⽔线思想。
⽐如,现在要⽣产⼀批⼩玩偶。
⼩玩偶的制作分为4个步骤,第⼀,要组装⾝体;第⼆,要在⾝体上安装四肢和头部,第三,给组装完成的玩偶穿上⼀件漂亮的⾐服,第四,包装出货。
为了加快制作玩具的速度,我们不可能叫四个⼈同时加⼯⼀个玩具,因为这四个步骤有着严重的依赖关系。
如果没有⾝体,就没法安装四肢,如果没有组装完成,就不能穿⾐服,如果没有穿上⾐服,就不能包装发货。
因此,找四个⼈来做⼀个玩偶是没有意义的。
但是,如果现在要制作的不是⼀个玩偶,⽽是⼀万个玩偶,那就情况不同了。
这样的话,你就可以找四个⼈,⼀个⼈只负责组装⾝体,完成后交给第⼆个⼈;第⼆个⼈只负责安装四肢,交付给第三个⼈,第三个⼈只负责穿⾐服,并交付给第四个⼈;第四个⼈只负责包装发货。
这样所有的⼈都能⼀起⼯作,共同完成任务,⽽整个时间也缩短到原来的1/4左右,这就是流⽔线的思想,⼀旦流⽔线满载,每次只需要⼀步就可以完成⼀个玩偶。
类似的思想可以借鉴到程序开发中。
即使(B+C)*B/2⽆法并⾏,但是如果你㤇计算⼀⼤堆的B和C的值,你就可以把它流⽔线化。
⾸先把计算过程拆分为三个步骤: P1:A=B+C P2:D=A*B P3:D=D/2上述的步骤中P1、P2和P3均可以在单独的线程中计算,并且每个线程只负责⾃⼰的⼯作,此时,P3计算的结果就是最终需要的答案。
并行计算数列求和
并行计算是一种计算方法,它将一个大的计算任务分解成若干个小的子任务,并同时使用多个计算资源(如处理器、线程等)来执行这些子任务。
这种计算方法可以显著提高计算效率,特别是在处理大规模数据集或进行复杂计算时。
数列求和是指将一个数列中的所有数字加起来。
这个计算任务可以通过并行计算来加速,特别是当数列非常大时。
下面是一个使用Python的并行计算库multiprocessing来实现数列求和的示例代码:
python
import multiprocessing
def sum_sequence(sequence):
return sum(sequence)
if __name__ == '__main__':
# 定义数列
sequence = list(range(1, 100001))
# 创建进程池
pool = multiprocessing.Pool()
# 使用map函数将数列拆分成多个子任务,并使用多个进程并行执行这些任务
result = pool.map(sum_sequence, [sequence[i:i+5000] for i in range(0, len(sequence), 5000)])
# 将所有子任务的结果相加得到最终结果
final_result = sum(result)
print(f"The sum of the sequence is {final_result}")。
并行编程模型
1. 概述
并行编程模型 是并行计算,尤其是并行软件的基础,也是并行硬件系统的导向。并行编程模型可以按照以下
几种方式进行表述:
(1)数据并行和任务并行:根据并行程序是强调相同任务在不同数据单元上并行,还是不同任务在相同或不
同数据上实现并行执行,可以将并行性分为两类:数据并行和任务并行。由于数据并行能获得的并行粒度比任务并
行高,因此可以扩展并行机上的大多数程序采取数据并行方式。但是任务并行在软件工程上有很重要的作用,它可
以使不同的组件运行在不同的处理单元集合上,从而获得模块化设计。人们越来越趋向予将并行程序组织成为由数
据并行组件组成的任务并行组合物。
(2)显式并行和隐式并行:并行编程系统可以根据支持显式或隐式并行编程模型来对其进行分类。显式并行
系统要求编程人员直接制定组成并行计算的多个并发控制线程的行为;隐式并行系统允许编程人员提供一种高层的、
指定程序行为但不显示表示并行的规范,它依赖于编译器或底层函数库来有效和正确地实现并行。越来越普遍的一
种做法就是将算法设计的复杂性集成到函数库上,这样可以通过一系列对函数库的调用来开发应用程序。通过这种
方式,可以在一种显式并行框架中获得隐式并行的某些好处。
(3)共享存储和分布存储:在共享存储模型中,程序员的任务就是指定一组通过读写共享存储进行通信的进
程的行为。在分布存储模型中,进程只有局部存储,它必须使用诸如消息传递或远程过程调用等机制来交换信息。
很多多核处理器体系结构都同时支持这两种模型。
共享存储体系结构下的并行编程模型主要是共享变量编程模型,它具有单地址空间、编程容易、可移植性差
等特点,其实现有OpenMP和Pthreads等。分布式存储体系结构下的并行编程模型主要有消息传递编程模型和分
布式共享编程模型两种:消息传递编程模型的特点是多地址空间、编程困难、可移植性好,其实现有MPI, PVM等;
分布式共享编程模型是指有硬件或软件的支持,在分布式体系结构下实现的具有共享变量编程模型特点的编程模型。
后者可以分别按照硬件或软件的实现分为DSM和SVM,其实现有TreadMark和JiaJia等,目前研究热点的分割全
局地址空间(PGAS)模型的研究有 UPC等代表,具有很强的发展潜力。
2. 并行编程模型的性的评价指标
(1)时间:程序串行运行时间是指在串行计算机上,程序从开始到运行结束所用的时间。并行运行程序是从并
行计算开始时刻到最后的处理器完成运算所经过的时间。
(2)总并行开销:并行系统的开销函数或总开销为由所有处理器话费的总时间,除去在单个处理器上求解相同
问题时最快的串行算法所需要的时间。所有处理器所用总时间减去完成有用工作所花费的时间,剩余部分即是开销。
(3)加速比:在单个处理器上求解问题所花的时间与用p个相同处理器并行计算机求解同一问题所花时间之比。
(4)效率:处理器被有效利用部分时间的度量,它定义为加速比与处理器数目的比率。在理想的并行系统中,
加速比等于p,效率等于1。实际上,加速比小于p而效率在0和1之间,它依赖于处理器被利用的效率。
(5)成本:并行运行时间与所用处理器数目的乘积。成本反映每个处理器求解问题所花费时间的总和。
另外,移植性、伸缩性和对各类语言的支持度也是评价指标。
3.影响并行编程模型性能的关键因素
多核处理器系统采用单芯片多处理器核的设计,这些处理器核相互独立,每个拥有一套完整的硬件执行环境,
可以同时执行多道指令。在高速缓存设计方面,每个核拥有独立的片上缓存和共享的最后一级缓存。基于多核处理
器的系统特征,影响并行程序性能的因素主要包括存储带宽、片上缓存一致性和负载均衡。
(1)存储带宽。在多核系统中,最后一级缓存是被各个核所共享的,如果位于同核上的多个线程同时对不同
的数据集进行操作,将会导致最后一级缓存与主存之间频繁地传送数据。由于在主存和缓存之间传送数据的速度远
小于CPU的计算速度,因此有限的存储带宽成为了影响多核环境下并行程序性能的瓶颈。
(
2)片上缓存一致性。所谓片上缓存一致性,是指多核系统中各个核的片上缓存位于相同存储空间上的数据必
须保持一致。虽然多核系统共享的cache体系结构在最后一级cache上减少了cache一致性问题,但由于每个核
都拥有独立的cache,很可能出现一个核上的cache数据和另一个核上不一致的现象,这通常发生在位于不同核
上运行的两个线程写入位于同一cache行上的两个数据,即使某个线程所需的位于某个cache块中的数据没有被
重写过,但存储系统还是会把该cache块标记无效,这就是通常意义上的伪共享问题Ⅲ。如果这样的多个核同时
写入位于同一cache行上数据的操作非常频繁,将会严重影响程序的性能。
(3)负载均衡。在多核系统中,各核负载是否均衡也是影响程序性能的一个重要因素。如果出现某一核上在进行
计算的同时另一核空闲等待的情况,那么这样的负载是不均衡的,多核资源的利用率是不高的。
4.关键因素的相关优化技术及分析比较
(1)如何减少有限存储带宽上的竞争。对于多个核同时在一个大数据集上进行操作的情况,如果数据集的大小超
过最后一级共享缓存的容量,由于不同核操作的数据不同,将会在主存和高速缓存之间频繁地传送数据,我们使
用cache块技术有效减少不必要的数据传送捌。即将一个大的数据集划分为多个比最后一级缓存容量小的子数据
集,在各核上运行的线程对一个子数据集计算完毕后,继续对下一个子数据集进行计算,直到所有子数据集计算
完毕为止。使用cache块技术虽然会增加同步开销,但可以有效减少存储竞争,提升程序性能。图所示是在二级
缓存为2MB的双核CPU环境下不同大小数据集上进行500次循环读写操作分别采用cache块技术和简单平均划
分数据集的运行时间对比。从图中我们可以看到一旦数据集大小超过了最后一级缓存的容量,由于各核上执行的
是反复读写的操作,导致了在主存和最后一级缓存之间频繁地传送数据,而采用cache块划分的并行处理方式就
能有效减少不必要的数据传送,提升程序性能。
(2)如何减少片上缓存的一致性。如前所述,片上缓存的不一致性是由于多核处理器环境下不同核上的线程对处于同一
cache行上的数据进行写操作,导致硬件逻辑将cache块标记为无效而在主存与cache传送数据所带来的开销。通常情
况下有两种方法可以处理这样的问题,一个是将不同核上需要经常执行写操作的数据分配到不同的cache行上,另一个
是将不同线程操作的共享变量拷贝到本地局部变量中,这样就不会导致某一核对某一地址数据进行写操作时导致其他核
片上缓存失效的情况发生。
(3)如何使各核负载均衡。多核环境下程序在各核上任务分配是否均衡在很大程度上影响着程序的性能。对于一个给
定的任务,如果各核工作负载均衡,可以更充分地利用多核资源,提升程序性能。比如对于有I/0操作的任务,可以将
计算任务和I/0任务合理地分配给各核,而不是某一个核上计算任务过多,而某一个核上I/0任务过多导致CPU过多
地去等待。具体的方法可以使用线程的亲属属性,即将某一线程绑定到一个具体的核上去运行。
5.小结
本文首先对编程模型的定义以及分类进行了描述,把当前的编程模型的种类进行了概述。然后对并行编程模型的性
能的评价指标进行了详细的描述,通过性能指标来判断不同编程模型的优缺点。有许多影响并行编程模型功能的因素,
通过这些因素来制定相关的优化技术,从而来改善并行编程模型的性能。
参考文献:
1.Akhtef S,Robert J.多核程序设计技术——通过软件多线程提升性能【M】.北京:电子工业出版社。2007.
2.MPI与OpenMP并行程序设计(C语言版),Michael J. Quinn著,陈文光等译,清华大学出版社。
3.并行计算综论,Jack Dongarra等著,莫则尧等译,电子工业出版社。
4.并行计算系列丛书,陈国良,高等教育出版社。
5.并行计算导论(中、英文版均有),AnanthGrama等著,机械工业出版社。