注重体验与质量的电子书资源下载网站
分类于: 其它 人工智能
简介
目录
前言
第1章绪论
1.1并行和向量化的作用
1.2为什么要并行或向量化
1.3为什么向量化或并行难
1.4并行的替代方法
1.5进程、线程与处理器
1.6并行硬件平台
1.7向量化和多核技术不是万能的
1.8本章小结
第2章现代处理器特性
2.1指令级并行
2.1.1指令流水线
2.1.2乱序执行
2.1.3指令多发射
2.1.4分支预测
2.1.5VLIW
2.2向量化并行
2.2.1SIMD
2.2.2SIMT
2.3线程级并行
2.3.1内核线程和用户线程
2.3.2多线程编程库
2.3.3多核上多线程并行要注意的问题
2.3.4多线程程序在多核和单核上运行的不同
2.4缓存
2.4.1缓存层次结构
2.4.2缓存一致性
2.4.3缓冲不命中
2.4.4写缓存
2.4.5越过缓存
2.4.6硬件预取
2.4.7缓存结构
2.4.8映射策略
2.5虚拟存储器和TLB
2.6NUMA技术
2.7本章小结
第3章算法性能和程序性能的度量与分析
3.1算法分析的性能度量标准
3.1.1时间复杂度与空间复杂度
3.1.2实现复杂度
3.2程序和指令的性能度量标准
3.3程序性能优化的度量标准
3.3.1加速比与并行效率
3.3.2Amdahl定律和Gustafson定律
3.4程序性能分析实用工具
3.5本章小结
第4章串行代码性能优化
4.1系统级别
4.2应用级别
4.3算法级别
4.4函数级别
4.4.1函数调用参数
4.4.2内联小函数
4.5循环级别
4.5.1循环展开
4.5.2循环累积
4.5.3循环合并
4.5.4循环拆分
4.6语句级别
4.6.1减少内存读写
4.6.2选用尽量小的数据类型
4.6.3结构体对齐
4.6.4表达式移除
4.6.5分支优化
4.6.6优化交换性能
4.7指令级别
4.8本章小结
第5章依赖分析
5.1指令级依赖
5.1.1结构化依赖
5.1.2数据依赖
5.1.3控制依赖
5.2循环级依赖
5.2.1循环数据依赖
5.2.2循环控制依赖
5.3寄存器重命名
5.4本章小结
第6章并行编程模型及环境
6.1并行编程模型
6.1.1指令级并行
6.1.2向量化并行
6.1.3易并行
6.1.4任务并行
6.1.5数据并行
6.1.6循环并行化
6.1.7流水线并行
6.1.8区域分解并行
6.1.9隐式和显式并行化
6.1.10SPMD
6.1.11共享存储器并行
6.1.12分布式存储器并行
6.2常见并行编程环境
6.2.1MPI
6.2.2OpenMP
6.2.3fork/pthread
6.2.4CUDA
6.2.5OpenCL
6.2.6OpenACC
6.2.7NEON内置函数
6.2.8SSE/AVX内置函数
6.3本章小结
第7章并行算法设计方法
7.1划分
7.1.1分而治之
7.1.2划分原则
7.1.3常见划分方法
7.1.4并行性和局部性
7.2通信
7.2.1操作的原子性
7.2.2结果的可见性
7.2.3顺序一致性
7.2.4函数的可重入与线程安全
7.2.5volatile关键字
7.2.6锁
7.2.7临界区
7.2.8原子操作
7.2.9栅栏
7.3结果归并
7.4负载均衡
7.4.1静态负载均衡
7.4.2动态负载均衡
7.4.3动态负载均衡算法的一般步骤
7.5本章小结
第8章并行算法缺陷
8.1启动结束时间
8.2负载均衡
8.3竞写
8.4锁
8.4.1死锁
8.4.2活锁
8.5饿死
8.6伪共享
8.7原子操作
8.8存储器栅栏
8.9缓存一致性
8.10顺序一致性
8.11volatile同步错误
8.12本章小结
第9章并行编程模式实践
9.1map模式
9.2reduce模式
9.3结合map和reduce模式
9.4scan模式
9.5zip/unzip模式
9.6流水线模式
9.7本章小结
第10章如何并行遗留代码
10.1找出软件的计算热点
10.2判断是否并行化热点
10.3设计算法并实现
10.3.1选择何种工具进行向量化或并行化
10.3.2重构热点代码
10.3.3依据硬件实现算法
10.4将实现后的代码嵌入原软件
10.4.1混合编译
10.4.2动态链接库
10.5示例:如何并行化word2vec
10.6本章小结
第11章超级并行
11.1超级并行方式编程
11.1.1进程+线程
11.1.2进程+GPU线程
11.1.3线程+GPU线程
11.1.4线程+向量指令
11.1.5进程+线程+向量指令
11.1.6进程+线程+GPU线程
11.2矩阵乘法
11.2.1多机CPU矩阵乘法
11.2.2单机多GPU矩阵乘法
11.2.3多机多GPU矩阵乘法
11.3本章小结
第12章并行算法设计的一般准则
12.1并行算法设计14准则
12.2本章小结
附录A整型数据与浮点数据
第1章绪论
1.1并行和向量化的作用
1.2为什么要并行或向量化
1.3为什么向量化或并行难
1.4并行的替代方法
1.5进程、线程与处理器
1.6并行硬件平台
1.7向量化和多核技术不是万能的
1.8本章小结
第2章现代处理器特性
2.1指令级并行
2.1.1指令流水线
2.1.2乱序执行
2.1.3指令多发射
2.1.4分支预测
2.1.5VLIW
2.2向量化并行
2.2.1SIMD
2.2.2SIMT
2.3线程级并行
2.3.1内核线程和用户线程
2.3.2多线程编程库
2.3.3多核上多线程并行要注意的问题
2.3.4多线程程序在多核和单核上运行的不同
2.4缓存
2.4.1缓存层次结构
2.4.2缓存一致性
2.4.3缓冲不命中
2.4.4写缓存
2.4.5越过缓存
2.4.6硬件预取
2.4.7缓存结构
2.4.8映射策略
2.5虚拟存储器和TLB
2.6NUMA技术
2.7本章小结
第3章算法性能和程序性能的度量与分析
3.1算法分析的性能度量标准
3.1.1时间复杂度与空间复杂度
3.1.2实现复杂度
3.2程序和指令的性能度量标准
3.3程序性能优化的度量标准
3.3.1加速比与并行效率
3.3.2Amdahl定律和Gustafson定律
3.4程序性能分析实用工具
3.5本章小结
第4章串行代码性能优化
4.1系统级别
4.2应用级别
4.3算法级别
4.4函数级别
4.4.1函数调用参数
4.4.2内联小函数
4.5循环级别
4.5.1循环展开
4.5.2循环累积
4.5.3循环合并
4.5.4循环拆分
4.6语句级别
4.6.1减少内存读写
4.6.2选用尽量小的数据类型
4.6.3结构体对齐
4.6.4表达式移除
4.6.5分支优化
4.6.6优化交换性能
4.7指令级别
4.8本章小结
第5章依赖分析
5.1指令级依赖
5.1.1结构化依赖
5.1.2数据依赖
5.1.3控制依赖
5.2循环级依赖
5.2.1循环数据依赖
5.2.2循环控制依赖
5.3寄存器重命名
5.4本章小结
第6章并行编程模型及环境
6.1并行编程模型
6.1.1指令级并行
6.1.2向量化并行
6.1.3易并行
6.1.4任务并行
6.1.5数据并行
6.1.6循环并行化
6.1.7流水线并行
6.1.8区域分解并行
6.1.9隐式和显式并行化
6.1.10SPMD
6.1.11共享存储器并行
6.1.12分布式存储器并行
6.2常见并行编程环境
6.2.1MPI
6.2.2OpenMP
6.2.3fork/pthread
6.2.4CUDA
6.2.5OpenCL
6.2.6OpenACC
6.2.7NEON内置函数
6.2.8SSE/AVX内置函数
6.3本章小结
第7章并行算法设计方法
7.1划分
7.1.1分而治之
7.1.2划分原则
7.1.3常见划分方法
7.1.4并行性和局部性
7.2通信
7.2.1操作的原子性
7.2.2结果的可见性
7.2.3顺序一致性
7.2.4函数的可重入与线程安全
7.2.5volatile关键字
7.2.6锁
7.2.7临界区
7.2.8原子操作
7.2.9栅栏
7.3结果归并
7.4负载均衡
7.4.1静态负载均衡
7.4.2动态负载均衡
7.4.3动态负载均衡算法的一般步骤
7.5本章小结
第8章并行算法缺陷
8.1启动结束时间
8.2负载均衡
8.3竞写
8.4锁
8.4.1死锁
8.4.2活锁
8.5饿死
8.6伪共享
8.7原子操作
8.8存储器栅栏
8.9缓存一致性
8.10顺序一致性
8.11volatile同步错误
8.12本章小结
第9章并行编程模式实践
9.1map模式
9.2reduce模式
9.3结合map和reduce模式
9.4scan模式
9.5zip/unzip模式
9.6流水线模式
9.7本章小结
第10章如何并行遗留代码
10.1找出软件的计算热点
10.2判断是否并行化热点
10.3设计算法并实现
10.3.1选择何种工具进行向量化或并行化
10.3.2重构热点代码
10.3.3依据硬件实现算法
10.4将实现后的代码嵌入原软件
10.4.1混合编译
10.4.2动态链接库
10.5示例:如何并行化word2vec
10.6本章小结
第11章超级并行
11.1超级并行方式编程
11.1.1进程+线程
11.1.2进程+GPU线程
11.1.3线程+GPU线程
11.1.4线程+向量指令
11.1.5进程+线程+向量指令
11.1.6进程+线程+GPU线程
11.2矩阵乘法
11.2.1多机CPU矩阵乘法
11.2.2单机多GPU矩阵乘法
11.2.3多机多GPU矩阵乘法
11.3本章小结
第12章并行算法设计的一般准则
12.1并行算法设计14准则
12.2本章小结
附录A整型数据与浮点数据