第1章 计算机概要与技术 1
1.1引言 1
1.1.1计算应用的分类及其特性 2
1.1.2你能从本书学到什么 3
1.2程序概念入门 4
1.3硬件概念入门 7
1.3.1剖析鼠标 8
1.3.2显示器 8
1.3.3打开机箱 9
1.3.4数据安全 12
1.3.5与其他计算机通信 13
1.3.6处理器和存储器制造技术 14
1.4性能 15
1.4.1性能的定义 15
1.4.2性能的测量 17
1.4.3 CPU性能及其因素 18
1.4.4指令的性能 19
1.4.5经典的CPU性能公式 19
1.5功耗墙 21
1.6沧海巨变:从单处理器向多处理器转变 23
1.7实例:制造以及AMD Opteron X4基准 25
1.7.1 SPEC CPU基准测试程序 27
1.7.2 SPEC功耗基准测试程序 28
1.8谬误与陷阱 29
1.9本章小结 31
1.10拓展阅读 32
1.11练习题 32
第2章 指令:计算机的语言 42
2.1引言 42
2.2计算机硬件的操作 43
2.3计算机硬件的操作数 46
2.3.1存储器操作数 47
2.3.2常数或立即数操作数 49
2.4有符号和无符号数 50
2.5计算机中指令的表示 54
2.6逻辑操作 59
2.7决策指令 61
2.7.1循环 62
2.7.2 case/switch语句 64
2.8计算机硬件对过程的支持 65
2.8.1使用更多的寄存器 66
2.8.2嵌套过程 68
2.8.3在栈中为新数据分配空间 69
2.8.4在堆中为新数据分配空间 70
2.9人机交互 72
2.10 MIPS中32位立即数和地址的寻址 75
2.10.1 32位立即数 75
2.10.2分支和跳转中的寻址 76
2.10.3 MIPS寻址模式总结 78
2.10.4机器语言解码 79
2.11并行与指令:同步 81
2.12翻译并执行程序 83
2.12.1编译器 84
2.12.2汇编器 84
2.12.3链接器 85
2.12.4加载器 87
2.12.5动态链接库 87
2.12.6启动一个Java程序 88
2.13以一个C排序程序为例 89
2.13.1 swap过程 89
2.13.2 sort过程 90
2.14数组与指针 95
2.14.1用数组实现clear 96
2.14.2用指针实现clear 96
2.14.3比较两个版本的clear 97
2.15 高级内容:编译C语言和解释Java语言 98
2.16实例:ARM指令集 98
2.16.1寻址模式 99
2.16.2比较和条件分支 100
2.16.3 ARM的特色 100
2.17实例:x86指令集 101
2.17.1 Intel x86的改进 101
2.17.2 x86寄存器和数据寻址模式 103
2.17.3 x86整数操作 104
2.17.4 x86指令编码 106
2.17.5 x86总结 107
2.18谬误与陷阱 107
2.19本章小结 108
2.20拓展阅读 110
2.21练习题 110
第3章 计算机的算术运算 135
3.1引言 135
3.2加法和减法 135
3.2.1多媒体算术运算 137
3.2.2小结 138
3.3乘法 139
3.3.1顺序的乘法算法和硬件 139
3.3.2有符号乘法 141
3.3.3更快速的乘法 142
3.3.4 MIPS中的乘法 142
3.3.5小结 142
3.4除法 143
3.4.1除法算法及其硬件结构 143
3.4.2有符号除法 145
3.4.3更快速的除法 146
3.4.4 MIPS中的除法 146
3.4.5小结 147
3.5浮点运算 148
3.5.1浮点表示 149
3.5.2浮点加法 152
3.5.3浮点乘法 154
3.5.4 MIPS中的浮点指令 157
3.5.5算术精确性 162
3.5.6小结 164
3.6并行性和计算机算术:结合律 165
3.7实例:x86的浮点 165
3.7.1 x86浮点体系结构 166
3.7.2 Intel SIMD流扩展2(SSE2)浮点体系结构 167
3.8谬误与陷阱 168
3.9本章小结 170
3.10拓展阅读 172
3.11练习题 173
第4章 处理器 182
4.1引言 182
4.1.1一个基本的MIPS实现 183
4.1.2实现方式概述 183
4.2逻辑设计惯例 185
4.3建立数据通路 187
4.4一个简单的实现机制 192
4.4.1 ALU控制 192
4.4.2主控制单元的设计 194
4.4.3数据通路的操作 197
4.4.4控制的结束 199
4.4.5为什么不使用单周期实现方式 201
4.5流水线概述 202
4.5.1面向流水线的指令集设计 205
4.5.2流水线冒险 205
4.5.3对流水线概述的小结 210
4.6流水线数据通路及其控制 211
4.6.1图形化表示的流水线 219
4.6.2流水线控制 222
4.7数据冒险:转发与阻塞 225
4.8控制冒险 234
4.8.1假定分支不发生 234
4.8.2缩短分支的延迟 235
4.8.3动态分支预测 237
4.8.4流水线小结 239
4.9异常 240
4.9.1异常在MIPS体系结构中的处理 241
4.9.2在流水线实现中的异常 242
4.10并行和高级指令级并行 245
4.10.1推测的概念 246
4.10.2静态多发射处理器 247
4.10.3动态多发射处理器 250
4.11实例:AMD Opteron X4(Barcelona)流水线 253
4.12高级主题:通过硬件设计语言描述和建模流水线来介绍数字设计以及更多流水线示例 255
4.13谬误与陷阱 255
4.14本章小结 256
4.15拓展阅读 257
4.16练习题 257
第5章 大容量和高速度:开发存储器层次结构 280
5.1引言 280
5.2 cache的基本原理 283
5.2.1 cache访问 285
5.2.2 cache缺失处理 288
5.2.3写操作处理 289
5.2.4一个cache的例子:内置FastMATH处理器 290
5.2.5设计支持cache的存储系统 292
5.2.6小结 294
5.3 cache性能的评估和改进 295
5.3.1通过更灵活地放置块来减少cache缺失 297
5.3.2在cache中查找一个块 300
5.3.3替换块的选择 302
5.3.4使用多级cache结构减少缺失代价 302
5.3.5小结 305
5.4虚拟存储器 305
5.4.1页的存放和查找 308
5.4.2缺页 309
5.4.3关于写 312
5.4.4加快地址转换:TLB 312
5.4.5集成虚拟存储器、FLB和cache 315
5.4.6虚拟存储器中的保护 317
5.4.7处理TLB缺失和缺页 318
5.4.8小结 322
5.5存储器层次结构的一般架构 323
5.5.1问题1:一个块可以被放在何处 323
5.5.2问题2:如何找到一个块 324
5.5.3问题3:当cache缺失时替换哪一块 325
5.5.4问题4:写操作如何处理 325
5.5.5 3 C:一种理解存储器层次结构行为的直观模型 326
5.6虚拟机 328
5.6.1虚拟机监视器的必备条件 329
5.6.2指令集系统结构(缺乏)对虚拟机的支持 329
5.6.3保护和指令集系统结构 329
5.7使用有限状态机来控制简单的cache 330
5.7.1一个简单的cache 330
5.7.2有限状态机 331
5.7.3一个简单的cache控制器的有限状态机 333
5.8并行与存储器层次结构:cache一致性 334
5.8.1实现一致性的基本方案 335
5.8.2监听协议 335
5.9高级内容:实现cache控制器 336
5.10实例:AMD Opteron X4 (Barcelona)和Intel Nehalem的存储器层次结构 337
5.10.1 Nehalem和Opteron的存储器层次结构 337
5.10.2减少缺失代价的技术 339
5.11谬误和陷阱 340
5.12本章小结 342
5.13拓展阅读 343
5.14练习题 343
第6章 存储器和其他I/O主题 345
6.1引言 355
6.2可信度、可靠性和可用性 357
6.3磁盘存储器 359
6.4快闪式存储器 362
6.5连接处理器、内存以及I/O设备 363
6.5.1互联基础 364
6.5.2 x86处理器的I/O互联 365
6.6为处理器、内存和操作系统提供I/O设备接口 366
6.6.1给I/O设备发送指令 367
6.6.2与处理器通信 368
6.6.3中断优先级 369
6.6.4在设备与内存之间传输数据 370
6.6.5直接存储器访问和内存系统 371
6.7 I/O性能度量:磁盘和文件系统的例子 372
6.7.1事务处理I/O基准程序 372
6.7.2文件系统和WebI/O的基准程序 373
6.8设计I/O系统 373
6.9并行性与I/O:廉价磁盘冗余阵列 374
6.9.1无冗余(RAID 0) 376
6.9.2镜像(RAID 1) 376
6.9.3错误检测和纠错码(RAID 2) 376
6.9.4位交叉奇偶校验(RAID 3) 376
6.9.5块交叉奇偶校验(RAID 4) 376
6.9.6分布式块交叉奇偶校验(RAID 5) 377
6.9.7 P+Q冗余(RAID 6) 378
6.9.8 RAID小结 378
6.10实例:Sun Fire x4150服务器 379
6.11高级主题:网络 383
6.12谬误与陷阱 383
6.13本章小结 386
6.14拓展阅读 387
6.15 练习题 387
第7章 多核、多处理器和集群 394
7.1引言 394
7.2创建并行处理程序的难点 396
7.3共享存储多处理器 398
7.4集群和其他消息传递多处理器 400
7.5硬件多线程 403
7.6 SISD、MIMD、SIMD、SPMD和向量机 404
7.6.1在x86中的SIMD:多媒体扩展 405
7.6.2向量机 406
7.6.3向量与标量的对比 407
7.6.4向量与多媒体扩展的对比 408
7.7图形处理单元简介 408
7.7.1 NVIDIA GPU体系结构简介 410
7.7.2深入理解GPU 411
7.8多处理器网络拓扑简介 412
7.9多处理器基准测试程序 415
7.10 Roofline:一个简单的性能模型 417
7.10.1 Roofline模型 418
7.10.2两代Opteron的比较 419
7.11实例:使用屋顶线模型评估四种多核处理器 422
7.11.1 4个多核系统 422
7.11.2稀疏矩阵 424
7.11.3结构化网格 425
7.11.4生产率 426
7.12谬误与陷阱 427
7.13本章小结 428
7.14拓展阅读 429
7.15 练习题 429
附录A图形和计算GPU 439
A.1引言 439
A.1.1 GPU发展简史 439
A.1.2异构系统 440
A.1.3 GPU发展成了可扩展的并行处理器 440
A.1.4为什么使用CUDA和GPU计算 440
A.1.5 GPU统一了图形和计算 441
A.1.6 GPU可视化计算的应用 441
A.2 GPU系统架构 441
A.2.1异构CPU-GPU系统架构 442
A.2.2 GPU接口和驱动 443
A.2.3图形逻辑流水线 443
A.2.4将图形流水线映射到统一的GPU处理器 443
A.2.5基本的统一GPU结构 444
A.3可编程GPU 445
A.3.1为实时图形编程 446
A.3.2逻辑图形流水线 446
A.3.3图形渲染程序 447
A.3.4像素渲染示例 447
A.3.5并行计算应用编程 448
A.3.6使用CUDA进行可扩展并行编程 449
A.3.7一些限制 453
A.3.8体系结构隐含的问题 453
A.4多线程的多处理器架构 454
A.4.1大规模多线程 454
A.4.2多处理器体系结构 455
A.4.3单指令多线程(SIMT) 456
A.4.4 SIMT warp执行和分支 457
A.4.5管理线程和线程块 457
A.4.6线程指令 458
A.4.7指令集架构(ISA) 458
A.4.8流处理器(SP) 461
A.4.9特殊功能单元(SFU) 461
A.4.10与其他多处理器的比较 461
A.4.11多线程多处理器总结 462
A.5并行存储系统 462
A.5.1 DRAM的考虑 462
A.5.2 cache 463
A.5.3 MMU 463
A.5.4存储器空间 463
A.5.5全局存储器 463
A.5.6共享存储器 464
A.5.7局部存储器 464
A.5.8常量存储器 464
A.5.9纹理存储器 464
A.5.10表面 465
A.5.11 load/store访问 465
A.5.12 ROP 465
A.6浮点算术 465
A.6.1支持的格式 465
A.6.2基本算术 465
A.6.3专用算术 466
A.6.4性能 467
A.6.5双精度 467
A.7资料:NVIDIA GeForce 8800 468
A.7.1流处理器阵列(SPA) 468
A.7.2纹理/处理器簇(TPC) 469
A.7.3流多处理器(SM) 470
A.7.4指令集 471
A.7.5流处理器(SP) 471
A.7.6特殊功能单元(SFU) 471
A.7.7光栅化 471
A.7.8光栅操作处理器(ROP)和存储系统 471
A.7.9可扩展性 472
A.7.10性能 472
A.7.11密集线性代数性能 472
A.7.12 FFT性能 473
A.7.13排序性能 474
A.8资料:将应用映射到GPU 474
A.8.1稀疏矩阵 475
A.8.2在共享存储器中进行缓存 477
A.8.3扫描和归约 478
A.8.4基数排序 480
A.8.5 GPU上的N- Body应用 482
A.9谬误与陷阱 486
A.10小结 489
A.11拓展阅读 489
附录B汇编器、链接器和SPIM仿真器 490
B.1引言 490
B.1.1什么时候使用汇编语言 493
B.1.2汇编语言的缺点 493
B.2汇编器 494
B.2.1目标文件的格式 495
B.2.2附加工具 496
B.3链接器 498
B.4加载 499
B.5内存的使用 499
B.6过程调用规范 500
B.6.1过程调用 502
B.6.2过程调用举例 503
B.6.3另外一个过程调用的例子 505
B.7异常和中断 507
B.8输入和输出 509
B.9 SPIM 511
B.10 MIPS 82000汇编语言 513
B.10.1寻址方式 514
B.10.2汇编语法 515
B.10.3 MIPS指令编码 515
B.10.4指令格式 516
B.10.5常数操作指令 520
B.10.6比较指令 520
B.10.7分支指令 521
B.10.8跳转指令 523
B.10.9陷阱指令 523
B.10.10取数指令 525
B.10.11保存指令 526
B.10.12数据传送指令 527
B.10.13浮点运算指令 528
B.10.14异常和中断指令 532
B.11小结 533
B.12参考文献 533
B.13练习题 533