目录
第1章并行计算1
1.1并行计算概述1
1.1.1并行计算的定义及摩尔定律1
1.1.2并行计算的分类2
1.1.3并行计算的优势3
1.1.4并行计算的应用分类3
1.1.5应用系统的并行性3
1.1.6并行计算的研究内容4
1.2并行程序设计策略和模型4
1.2.1设计策略4
1.2.2设计模型5
1.3进程与线程6
1.3.1进程6
1.3.2线程6
1.3.3进程或线程同步互斥的控制方法7
1.4评价指标7
1.4.1基本评估7
1.4.2系统加速比8
1.4.3系统可扩展性8
1.5并行计算机的分类9
1.5.1并行计算机的控制结构9
1.5.2地址空间10
1.5.3并行计算机系统结构模型11
1.6并行计算机系统互联15
1.6.1静态互联网络15
1.6.2动态互联网络18
1.7习题19
第2章并行算法设计基础21
2.1并行程序设计概述21
2.1.1并行算法设计难的原因212.1.2并行层次与代码粒度22
2.1.3并行语言的构造方法24
2.1.4并行程序开发策略27
2.1.5并行编程范式28
2.2并行程序设计模型30
2.2.1隐式并行30
2.2.2数据并行30
2.2.3消息传递31
2.2.4共享变量31
2.2.53种显式并行程序设计模型的主要特性32
2.3并行程序设计过程32
2.3.1划分33
2.3.2通信33
2.3.3组合33
2.3.4映射33
2.4习题34
第3章OpenMP编程36
3.1OpenMP编程基础36
3.1.1OpenMP编程定义36
3.1.2OpenMP并行编程模型36
3.1.3OpenMP程序结构37
3.2编译指导语句39
3.2.1并行域结构40
3.2.2共享任务结构41
3.2.3同步结构48
3.2.4数据处理子句54
3.3运行时库函数63
3.3.1分类与功能63
3.3.2基本函数63
3.3.3运行时库函数的注意事项67
3.4环境变量68
3.5实例68
3.5.1数值求和68
3.5.2数值积分72
3.6习题77
第4章Windows编程79
4.1Windows线程库79
4.1.1线程基本概念与内核对象79
4.1.2线程创建与生命周期管理80
4.1.3临界区的实现与优化81
4.1.4线程本地存储的实现机制81
4.1.5线程高级操作与性能优化83
4.1.6内存模型85
4.2Win32 API多线程程序设计85
4.2.1线程创建的核心机制与底层实现86
4.2.2线程属性的精细化控制87
4.2.3线程同步原语88
4.2.4线程间通信的高级模式89
4.2.5多线程程序的资源管理与异常处理90
4.3MFC线程库93
4.3.1MFC线程模型的体系结构93
4.3.2工作线程的创建与参数传递94
4.3.3UI线程的定制与消息循环95
4.3.4线程同步原语的MFC封装97
4.3.5线程间通信的最佳实践98
4.3.6性能优化与常见陷阱100
4.3.7多线程文件处理器100
4.4.NET Framework线程库101
4.4.1Thread类101
4.4.2线程池103
4.4.3任务并行库105
4.4.4异步编程模型107
4.4.5线程同步108
4.4.6线程安全集合109
4.4.7多线程编程的最佳实践110
4.5习题110
第5章Socket编程113
5.1Socket编程基础113
5.1.1什么是Socket113
5.1.2Socket的类型113
5.1.3TCP与UDP的对比114
5.1.4Socket通信的基本流程114
5.2网络模型116
5.2.1循环服务器模型117
5.2.2并发服务器模型120
5.2.3多进程与多线程模型对比125
5.3Socket API125
5.3.1套接字创建125
5.3.2地址绑定127
5.3.3监听连接129
5.3.4接受连接130
5.3.5发起连接132
5.3.6数据传输133
5.3.7关闭套接字134
5.4网络通信模式135
5.4.1阻塞I/O与非阻塞I/O135
5.4.2多进程并发与多线程并发139
5.4.3通信模式的对比与选择143
5.5编程实践144
5.5.1文件传输程序144
5.5.2聊天室程序147
5.5.3分布式计算框架雏形151
5.6习题154
第6章MPI多进程编程156
6.1MPI编程基础156
6.1.1MPI简介156
6.1.2MPI程序特点156
6.1.3MPI简单程序实现157
6.2MPI常用函数介绍158
6.2.1环境管理函数158
6.2.2点对点通信158
6.2.3集体通信函数159
6.2.4高级功能函数159
6.3MPICH安装与MPI程序运行160
6.3.1MPICH简介160
6.3.2MPICH的安装和配置160
6.3.3简单程序运行168
6.4MPI的点对点通信169
6.4.1点对点通信介绍169
6.4.2阻塞通信169
6.4.3非阻塞通信172
6.4.4简单程序说明173
6.5MPI集体通信175
6.5.1集体通信介绍175
6.5.2数据分发175
6.5.3数据收集175
6.5.4数据散发176
6.5.5全交换176
6.5.6归约与扫描177
6.5.7同步177
6.6实例177
6.6.1矩阵转置177
6.6.2矩阵分解179
6.7习题180
第7章CUDA GPU编程183
7.1GPU技术183
7.1.1GPU简介183
7.1.2GPU与并行计算184
7.2CUDA架构185
7.2.1定义CUDA中的线程、块和网格185
7.2.2将函数交付内核执行188
7.2.3主机与CUDA设备间的通信188
7.2.4CUDA线程的同步与通信188
7.2.5内核和网格189
7.2.6块189
7.2.7线程189
7.2.8CUDA C语言扩展189
7.3环境搭建190
7.3.1检查显卡支持的CUDA版本190
7.3.2安装VS 2022190
7.3.3安装CUDA190
7.3.4检测CUDA是否安装成功192
7.3.5配置VS项目194
7.4核函数196
7.4.1核函数语句格式196
7.4.2线程组织197
7.4.3核函数注意事项197
7.4.4函数执行空间标识符197
7.5CUDA程序错误检测199
7.5.1检测运行时错误的宏函数199
7.5.2检查运行时API函数199
7.5.3检查核函数200
7.6并行编程案例201
7.6.1矩阵加法201
7.6.2用块并行计算矩阵乘法203
7.6.3一般的直方图统计字母频率206
7.6.4共享内存的直方图208
7.6.5better版归约209
7.7习题211
第8章MindSpore GPU编程214
8.1环境配置214
8.1.1获取安装命令214
8.1.2安装指南214
8.2基本介绍219
8.2.1昇思MindSpore219
8.2.2设计理念220
8.2.3华为昇腾AI全栈221
8.2.4快速入门221
8.2.5张量227
8.2.6数据加载与处理231
8.2.7网络构建239
8.2.8函数式自动微分243
8.2.9模型训练247
8.2.10保存与加载252
8.2.11Graph Mode加速254
8.3并行261
8.3.1分布式并行261
8.3.2分布式并行启动方式263
8.3.3数据并行263
8.3.4算子级并行266
8.3.5优化器并行277
8.3.6流水线并行280
8.3.7并行优化策略287
8.4基于双递归搜索的多维混合并行案例288
8.4.1概述288
8.4.2操作实践288
8.5习题291
第9章安全编程原则292
9.1安全编程基本原则和最佳实践292
9.1.1核心安全原则292
9.1.2跨平台通用最佳实践294
9.1.3并行计算特有的安全原则296
9.2常见编程错误与漏洞298
9.2.1内存安全漏洞298
9.2.2并发相关漏洞300
9.2.3网络与协议漏洞302
9.2.4漏洞防御的通用策略304
9.3安全编程工具和技术304
9.3.1静态分析工具305
9.3.2动态测试技术306
9.3.3加密与安全协议库308
9.3.4工具链的协同与集成310
9.4习题311
第10章并行编程中的安全问题313
10.1竞争条件与死锁313
10.1.1竞争条件原理与类型313
10.1.2死锁的形成与预防315
10.1.3并行框架中的死锁案例316
10.2数据竞争与同步问题319
10.2.1数据竞争的本质与影响319
10.2.2同步机制的安全使用320
10.2.3检测与修复工具322
10.3并行编程中的安全漏洞与攻击324
10.3.1分布式系统特有漏洞325
10.3.2并行服务面临的攻击类型327
10.3.3漏洞与攻击的防御与加固330
10.4习题331
第11章并行安全编程案例334
11.1竞态条件与线程安全计数器334
11.1.1互斥锁保护计数器334
11.1.2交易中的安全漏洞335
11.2死锁与资源互斥338
11.2.1哲学家换礼物338
11.2.2打印机与扫描机争夺340
11.2.3十字路口交通死锁342
11.3并行导致资源泄露348
参考文献350
