《Solaris应用程序设计》PDF下载

  • 购买积分:12 如何计算积分?
  • 作  者:(英)格夫(Gove,Darryl)著;张伟,刘子锐,董峻峰等译
  • 出 版 社:北京:机械工业出版社
  • 出版年份:2008
  • ISBN:9787111238782
  • 页数:319 页
图书介绍:本书介绍Solaris操作系统的程序设计方法。

第1章 常规的处理器 1

1.1 本章目标 1

1.2 处理器的组成 1

1.3 时钟速率 2

1.4 乱序执行处理器 2

1.5 芯片多线程 3

1.6 执行管道 3

1.6.1 指令时延 4

1.6.2 装入/存储管道 4

1.6.3 整型操作管道 4

1.6.4 分支管道 5

1.6.5 浮点管道 5

1.7 高速缓存 6

1.8 系统交互 8

1.8.1 带宽与时延 8

1.8.2 系统总线 8

1.9 虚拟内存 9

1.9.1 概述 9

1.9.2 TLB和页面大小 10

1.10 内存的索引和标记 10

1.11 指令集架构 11

第2章 SPARC家族 12

2.1 本章目标 12

2.2 UltraSPARC家族 12

2.2.1 SPARC体系结构的历史 12

2.2.2 UltraSPARC处理器 12

2.3 SPARC指令集 13

2.3.1 SPARC指令集简介 13

2.3.2 整数寄存器 15

2.3.3 寄存器窗 16

2.3.4 浮点寄存器 17

2.4 32位和64位代码 18

2.5 UltraSPARCIⅢ系列处理器 18

2.5.1 CPU的核心 18

2.5.2 与内存的通信 18

2.5.3 预取 18

2.5.4 数据高速缓存不命中时装入操作的停顿 21

2.5.5 基于UltraSPARCIII的系统 21

2.5.6 全存储顺序 22

2.6 UltraSPARCTI 22

2.7 UItraSPARCT2. 23

2.8 SPARC64VI 23

第3章 x64处理器家族 24

3.1 本章目标 24

3.2 x64处理器家族 24

3.3 x86处理器:CISC和RISC 25

3.4 字节顺序 25

3.5 处理器指令格式 26

3.6 寄存器 27

3.7 指令集扩展与浮点计算 29

3.8 内存操作顺序 29

第4章 信息工具 31

4.1 本章目标 31

4.2 报告系统配置的工具 31

4.2.1 简介 31

4.2.2 报告一般系统信息 31

4.2.3 启用虚拟处理器 32

4.2.4 通过处理器的集合或者绑定来控制处理器的使用 32

4.2.5 报告硬件支持的指令集 33

4.2.6 报告硬件支持的TLB页面大小 34

4.2.7 报告SPARC硬件特性摘要 35

4.3 报告当前系统状态的工具 35

4.3.1 简介 35

4.3.2 报告虚拟内存的利用情况(vmstat) 35

4.3.3 报告交换文件使用情况(swap) 37

4.3.4 报告进程资源利用情况(prstat) 37

4.3.5 列出进程(ps) 39

4.3.6 定位应用的进程ID(Pgrep) 39

4.3.7 报告所有处理器的活动(mpstat) 40

4.3.8 报告内核统计(kstat) 41

4.3.9 生成系统活动报告(sar) 42

4.3.10 报告I/O活动(iostat) 44

4.3.11 报告网络活动(netstat) 45

4.3.12 snoop命令 46

4.3.13 报告硬盘空间利用情况(df) 46

4.3.14 报告文件占用的硬盘空间(du) 47

4.4 进程和处理器的专有工具 47

4.4.1 简介 47

4.4.2 进程执行时间(time、timex和ptime) 47

4.4.3 报告系统级硬件计数器的活动(cpustat) 48

4.4.4 为单个进程报告硬件性能计数器的活动(cputrack) 49

4.4.5 报告总线活动(busstat) 50

4.4.6 报告陷阱活动(trapstat) 50

4.4.7 报告进程的虚拟内存映射信息(pmap) 51

4.4.8 检测传递给进程的命令行参数(pargs) 52

4.4.9 报告进程打开的文件(pfiiles) 52

4.4.10 检查进程的当前栈(pstack) 52

4.4.11 跟踪应用执行(truss) 53

4.4.12 用dtrace探究用户代码和内核活动 54

4.5 应用相关信息 56

4.5.1 报告库链接(ldd) 56

4.5.2 报告文件内容的类型(file) 57

4.5.3 报告文件中的符号(nm) 58

4.5.4 报告库的版本信息(pvs) 58

4.5.5 检查应用、库或者目标文件的反汇编(dis) 59

4.5.6 报告应用、库或者目标文件中各种段的大小(size) 59

4.5.7 报告文件中的元数据(dumpstabs、dwarfdump、elfdump、dump和mcs) 60

第5章 编译器的使用 62

5.1 本章目标 62

5.2 三类编译选项 62

5.3 在x86平台上使用-xtarget=generic 63

5.4 优化 64

5.4.1 优化级别 64

5.4.2 -O选项的使用 65

5.4.3 -fast选项的使用 65

5.4.4 在使用-fast的同时指定体系结构 65

5.4.5 解构-fast 66

5.4.6 -fast对性能的优化(针对SunStudio12) 67

5.5 生成调试信息 67

5.5.1 调试信息选项 67

5.5.2 调试和优化 68

5.6 为应用程序选择目标机器的类型 68

5.6.1 在32位和64位之间选择 68

5.6.2 目标机器的通用类型(geneic) 69

5.6.3 使用-xcache指定缓存配置 69

5.6.4 使用-xchip来设置指令调度 70

5.6.5 -xarch和-m32/-m64. 70

5.7 代码布局优化 71

5.7.1 简介 71

5.7.2 文件间优化 72

5.7.3 映射文件 73

5.7.4 程序剖析反馈 73

5.7.5 链接时优化 76

5.8 通用的编译器优化 77

5.8.1 预取指令 77

5.8.2 启用预取指令的生成(-xprefetch) 78

5.8.3 控制激进的预取(-xprefetchlevel) 79

5.8.4 启用依赖分析(-xdepend) 79

5.8.5 处理SPARC上非对齐的存取操作(-xmemalign/-dalign) 80

5.8.6 使用-xpagesize=<size>设置页大小 81

5.9 C和C++的指针别名 82

5.9.1 关于指针的问题 82

5.9.2 诊断别名问题 84

5.9.3 使用受限指针来减少C和C++程序中的别名问题 84

5.9.4 使用-xalias_level来指定指针别名的级别 85

5.9.5 C的选项-xalias_level 85

5.9.6 C的选项-xalias_level=any 85

5.9.7 C的选项-xalias_level=basic 86

5.9.8 C的选项-xalias_level=weak 86

5.9.9 C的选项-xaliaslevel=layout 88

5.9.10 C的选项-xalias_level=strict 88

5.9.11 C的选项-xalias_level=std 88

5.9.12 C的选项-xalias_level=strong 88

5.9.13 C++的选项-xalias_level 89

5.9.14 C++的选项-xaliaslevel=simple 89

5.9.15 C++的选项-xalias_level=compatible 89

5.10 其他针对C和C++的优化 89

5.11 针对Fortran程序的优化 90

5.11.1 对齐变量来优化布局(-xpad) 90

5.11.2 用栈来存放局部变量(-xstackvar) 90

5.12 编译器指示词(pragmas) 91

5.12.1 简介 91

5.12.2 指明变量的对齐位数 91

5.12.3 指明函数访问全局变量的情况 91

5.12.4 指明函数没有副作用 92

5.12.5 指明函数很少被调用 93

5.12.6 指明针对特定循环流水线的安全级别 94

5.12.7 指明循环的单次迭代内没有访存依赖 95

5.12.8 指明循环展开的程度 95

5.13 针对C程序更好地控制别名的指示词 95

5.13.1 断言变量间别名的程度 96

5.13.2 断言变量是别名的 97

5.13.3 断言非指针变量是别名的 98

5.13.4 断言变量不会别名 98

5.13.5 断言非指针变量不会别名 99

5.14 与GCC的兼容 99

第6章 浮点数优化 100

6.1 本章目标 100

6.2 浮点数优化标记 100

6.2.1 标记-fast中的运算优化 100

6.2.2 IEEE-754与浮点运算 100

6.2.3 矢量化浮点运算(-xvector) 101

6.2.4 使用SIMD指令进行矢量运算(-xvector=simd)(仅适用于x64平台) 102

6.2.5 次正规数 103

6.2.6 将次正规数清为0(-fns) 104

6.2.7 处理非数字的值 104

6.2.8 启用浮点表达式的简化(-fsimple) 105

6.2.9 消除比较 106

6.2.10 消除不必要的计算 106

6.2.11 重排运算顺序 107

6.2.12 Kahan方程 109

6.2.13 提升除法 110

6.2.14 不同浮点简化级别对括号的遵从情况 111

6.2.15 使用-fast对error的影响 112

6.2.16 指定浮点消息的触发自陷(-ftrap) 112

6.2.17 浮点异常标记 113

6.2.18 C99中的浮点异常 114

6.2.19 使用内联浮点函数模板(-xlibmil) 115

6.2.20 使用优化的数学库(-xlibmopt) 115

6.2.21 不要把单精度提升为双精度(C的-fsingle) 116

6.2.22 使用单精度存储浮点常数(适用于C的-xsfponst) 116

6.3 浮点数乘法加速指令 117

6.4 整数数学 118

6.5 使用SPARCV8代码传递浮点参数 121

第7章 库与链接 123

7.1 简介 123

7.2 链接 123

7.2.1 链接的概述 123

7.2.2 动态和静态链接 123

7.2.3 链接程序库 124

7.2.4 创建一个静态库 124

7.2.5 创建一个动态库 125

7.2.6 指定库的位置 126

7.2.7 库的延时加载 127

7.2.8 程序库的初始化和终止代码 127

7.2.9 符号作用域 128

7.2.10 程序库间入 129

7.2.11 使用调试接口 130

7.2.12 使用审计接口(AuditInterface) 131

7.3 其他一些有趣的库 132

7.3.1 C运行时库(libc和libc_psr) 132

7.3.2 内存管理库 132

7.3.3 libfast 134

7.3.4 Performance程序库 135

7.3.5 STLport4. 136

7.4 程序库调用 136

7.4.1 用于计时的程序库例程 136

7.4.2 选择最适合的程序库例程 138

7.4.3 SIMD指令以及媒体库 139

7.4.4 使用VIS指令搜索数组 139

第8章 性能分析工具 143

8.1 简介 143

8.2 SunStudio性能分析器 143

8.3 收集分析器 144

8.4 为性能分析器编译应用程序 145

8.5 使用GUI查看性能分析数据 145

8.6 Caller-Callee信息 147

8.7 使用命令行工具进行性能分析 148

8.8 分析器详解 149

8.9 UltraSPARCIH/Ⅳ处理器的分析器详解 150

8.10 使用性能计数器的分析 151

8.11 调用栈详解 152

8.12 生成映射文件 154

8.13 使用spot工具生成性能报告 155

8.14 内存访问模式分析器 157

8.15 er_kernel 163

8.16 尾部调用(Tail-Call)优化和调试 164

8.17 使用gprof收集分析信息 165

8.18 用tcov得到代码覆盖信息 167

8.19 用dtrace去收集分析数据和覆盖信息 169

8.20 编译器注解 171

第9章 校正与调试 173

9.1 简介 173

9.2 编译时间检查 173

9.2.1 简介 173

9.2.2 C语言程序的编译时间检查 173

9.2.3 使用lint检查C程序代码 173

9.2.4 C和C++编译器中常用的源程序处理选项 175

9.2.5 C++ 176

9.2.6 Fortran 177

9.3 运行时检查 178

9.3.1 边界检查 178

9.3.2 watchmalloc 180

9.3.3 其他mallocs下的调试选项 180

9.3.4 Fortran中运行时数组边界检查 181

9.3.5 运行时堆栈溢出检查 181

9.3.6 使用discover检测内存存取错误 182

9.4 使用dbx调试程序 183

9.4.1 调试编译器标识位 183

9.4.2 调试和优化 183

9.4.3 调试信息格式 184

9.4.4 调试和OpenMp 184

9.4.5 x86上的帧指针优化 184

9.4.6 在信息转储文件上运行调试程序 185

9.4.7 调试应用程序的例子 185

9.4.8 在dbx下运行一个应用程序 187

9.5 使用ATS定位优化缺陷 189

9.6 使用mdb调试 191

第10章 性能计数器度量 195

10.1 本章目标 195

10.2 读取性能计数器 195

10.3 UltraSPARCⅢ和U1traSPARCⅣ性能计数器 196

10.3.1 指令与时钟周期 196

10.3.2 数据高速缓存事件 198

10.3.3 指令缓存事件 199

10.3.4 二级高速缓存事件 200

10.3.5 高速缓存未命中事件所耗费的时钟周期 200

10.3.6 高速缓存访问度量示例 201

10.3.7 延时的综合度量 203

10.3.8 内存带宽消耗综合度量 204

10.3.9 预读高速缓存事件 205

10.3.10 性能计数器预读和未预读的比较 207

10.3.11 写高速缓存事件 208

10.3.12 处理器阻塞事件所消耗的时钟周期 209

10.3.13 分支预测失误 210

10.3.14 内存控制器事件 210

10.4 UltraSPARCIV和UltraSPARCIV+上的性能计数器 211

10.4.1 简介 211

10.4.2 UltraSPARCIV+上的三级高速缓存 211

10.4.3 内存控制器事件 212

10.5 UltraSPARCT1上的性能计数器 212

10.5.1 硬件性能计数器 212

10.5.2 UltraSPARCT1时钟周期预算 214

10.5.3 内核的性能计数器 215

10.5.4 计算系统带宽消耗 215

10.6 UltraSPARCT2性能计数器 216

10.7 SPARC64VI性能计数器 216

10.8 Opteron性能计数器 217

10.8.1 简介 217

10.8.2 指令 218

10.8.3 指令高速缓存事件 218

10.8.4 数据高速缓存事件 219

10.8.5 TLB事件 220

10.8.6 分支事件 221

10.8.7 阻塞所消耗的时钟周期 221

第11章 源代码优化 223

11.1 概述 223

11.2 传统优化方法 223

11.2.1 简介 223

11.2.2 循环展开和流水线作业 223

11.2.3 循环剥离、融合及分割 224

11.2.4 循环交换和分块 225

11.2.5 循环不变量提升 227

11.2.6 公共子表达式消除 227

11.2.7 强度削弱 227

11.2.8 函数克隆 228

11.3 数据的局部性、带宽以及延时 228

11.3.1 带宽 228

11.3.2 整数数据 229

11.3.3 存储流 230

11.3.4 手动预取 231

11.3.5 延时 233

11.3.6 拷贝和移动内存 237

11.4 数据结构 238

11.4.1 结构重组 238

11.4.2 结构体预取 241

11.4.3 对结构体优化性能的考虑 244

11.4.4 矩阵及其访问 244

11.4.5 多个流 246

11.5 抖动 246

11.5.1 概述 246

11.5.2 数据TLB性能计数器 248

11.6 写后读 249

11.7 存储队列 251

11.7.1 停顿 251

11.7.2 检测存储队列停顿 251

11.8 If语句 253

11.8.1 简介 253

11.8.2 条件移动 253

11.8.3 SPARC处理器上的未对齐内存访问 256

11.9 32位应用程序中的文件处理 259

11.9.1 文件描述符的限制 259

11.9.2 在32位应用程序中处理大文件 260

第12章 多核、多进程与多线程 263

12.1 简介 263

12.2 进程、线程、处理器、内核与芯片多线程 263

12.3 虚拟化 265

12.4 横向以及纵向扩展 266

12.5 并行计算 266

12.6 用多进程扩展处理性能 267

12.6.1 多进程 267

12.6.2 多进程协同 268

12.6.3 使用MPI的并行计算 271

12.7 多线程应用程序 274

12.7.1 使用Pthread进行并行处理 274

12.7.2 线程局部存储 275

12.7.3 互斥锁 277

12.7.4 使用原子操作 281

12.7.5 伪共享 283

12.7.6 一个多线程程序的内存分布 285

12.8 使用OpenMP并行化应用程序 287

12.9 用OpenMP编译指令来并行化循环代码 288

12.10 使用OpenMPAPI 290

12.11 代码段并行化 290

12.12 应用程序的自动并行化 291

12.13 对多线程应用程序进行性能分析 293

12.14 检测多线程应用程序中的数据竞争 295

12.15 调试多线程代码 296

12.16 将一个顺序执行程序并行化 298

12.16.1 程序实例 298

12.16.2 优化对顺序执行程序的性能影响 300

12.16.3 对顺序执行程序进行性能分析 300

12.16.4 展开关键循环 301

12.16.5 用Pthreads实现并行化 303

12.16.6 使用OpenMP并行化 304

12.16.7 自动并行化 305

12.16.8 用OpenMP进行负载均衡 308

12.16.9 线程间共享数据 308

12.16.10 使用OpenMP在线程之间共享变量 310

第13章 性能分析 313

13.1 简介 313

13.2 算法和复杂度 313

13.3 串行代码调优 316

13.4 并行性的探索 318

13.5 为CMT处理器进行优化 319