描述
开 本: 16开纸 张: 胶版纸包 装: 平装-胶订是否套装: 否国际标准书号ISBN: 9787111686088丛书名: 计算机科学丛书
在高级语言广泛应用的今天,汇编语言对于程序的关键性能部分依然至关重要。现代x86处理器的SIMD体系结构提供了强大的资源,为大数据时代的计算密集型问题提供了有效的解决方案,可应用在图像处理、音视频编码和数据挖掘等领域。
本书由上一版的x86-32全面更新至x86-64,主要面向软件开发人员,旨在通过实用的案例帮助读者快速理解x86-64汇编语言程序设计的概念,使用x86-64汇编语言以及AVX、AVX2和AVX-512指令集编写性能增强函数和算法,并利用不同的编程策略和技巧实现性能的化。书中包含大量可免费下载的源代码,便于读者实践。
通过本书,你将:
全面了解x86-64平台,包括Core体系结构、数据类型、寄存器、内存寻址模式和基本指令集,利用x86-64指令集编写可被C 等高级语言调用的函数。
深入理解AVX和AVX2,包括寄存器集、数据类型和指令集,以及数据广播、数据收集和数据排列等增强功能,学习针对打包浮点数和打包整数操作数的编程方法。
深入理解AVX-512,包括寄存器集和数据类型,以及条件执行和合并、嵌入式广播操作、指令级舍入等增强功能,学习利用这些功能进行算法优化。
本书全面更新至x86-64,主要面向软件开发人员,旨在通过实用的案例帮助读者快速理解x86-64汇编语言程序设计的概念并掌握编程方法。书中首先介绍x86-64平台,包括Core体系结构、数据类型、寄存器、内存寻址模式和基本指令集等;然后讨论AVX、AVX2和AVX-512,包括寄存器集、指令集和增强功能等,并利用这些指令集编写性能增强函数和算法;zui后讨论提高程序性能的编码策略及技巧。此外,书中包含大量可免费下载的源代码,便于读者实践。
出版者的话
译者序
前言
关于作者
关于技术评审专家
第1章 x86-64 Core体系结构 1
1.1 历史回顾 1
1.2 数据类型 3
1.2.1 基本数据类型 3
1.2.2 数值数据类型 3
1.2.3 SIMD数据类型 4
1.2.4 其他数据类型 5
1.3 内部体系结构 5
1.3.1 通用寄存器 6
1.3.2 RFLAGS寄存器 7
1.3.3 指令指针 8
1.3.4 指令操作数 9
1.3.5 内存寻址 10
1.4 x86-64与x86-32编程的区别 11
1.4.1 无效指令 12
1.4.2 不推荐的指令 13
1.5 指令集概述 13
1.6 本章小结 15
第2章 x86-64 Core程序设计:第1部分 17
2.1 简单的整数算术运算 17
2.1.1 加法和减法 18
2.1.2 逻辑运算 20
2.1.3 移位运算 22
2.2 高级整数算术运算 25
2.2.1 乘法和除法 25
2.2.2 使用混合类型的运算 28
2.3 内存寻址和条件代码 33
2.3.1 内存寻址模式 33
2.3.2 条件代码 37
2.4 本章小结 40
第3章 x86-64 Core程序设计:第2部分 42
3.1 数组 42
3.1.1 一维数组 42
3.1.2 二维数组 48
3.2 结构 56
3.3 字符串 58
3.3.1 字符计数 58
3.3.2 字符串拼接 61
3.3.3 比较数组 65
3.3.4 数组反转 68
3.4 本章小结 71
第4章 AVX指令集 72
4.1 AVX概述 72
4.2 SIMD编程概念 73
4.3 环绕与饱和算术运算 74
4.4 AVX执行环境 75
4.4.1 寄存器集 75
4.4.2 数据类型 76
4.4.3 指令语法 76
4.5 AVX标量浮点数 77
4.5.1 浮点数编程概念 78
4.5.2 标量浮点寄存器集 80
4.5.3 控制状态寄存器 80
4.5.4 指令集概述 81
4.6 AVX打包浮点值 82
4.7 AVX打包整数 85
4.8 x86-AVX和x86-SSE之间的区别 87
4.9 本章小结 88
第5章 AVX程序设计:标量浮点数 90
5.1 标量浮点算术运算 90
5.1.1 单精度浮点数运算 90
5.1.2 双精度浮点数运算 93
5.2 标量浮点值的比较和转换 97
5.2.1 浮点值比较 97
5.2.2 浮点值转换 106
5.3 标量浮点数组和矩阵 111
5.3.1 浮点数组 111
5.3.2 浮点矩阵 114
5.4 调用约定 118
5.4.1 基本堆栈帧 118
5.4.2 使用非易失性通用寄存器 122
5.4.3 使用非易失性XMM寄存器 126
5.4.4 函数序言和函数结语的宏 131
5.5 本章小结 136
第6章 AVX程序设计:打包浮点数 137
6.1 打包浮点算术运算 137
6.2 打包浮点值比较 142
6.3 打包浮点值转换 146
6.4 打包浮点数组 150
6.4.1 打包浮点平方根 150
6.4.2 打包浮点数组的小值和值 154
6.4.3 打包浮点小二乘法 158
6.5 打包浮点矩阵 163
6.5.1 矩阵转置 163
6.5.2 矩阵乘法 170
6.6 本章小结 175
第7章 AVX程序设计:打包整数 176
7.1 打包整数加法和减法运算 176
7.2 打包整数移位 181
7.3 打包整数乘法 184
7.4 打包整数图像处理 189
7.4.1 像素的小值和值 189
7.4.2 像素平均强度 196
7.4.3 像素转换 200
7.4.4 图像直方图 206
7.4.5 图像阈值化 213
7.5 本章小结 223
第8章 AVX2 224
8.1 AVX2执行环境 224
8.2 AVX2打包浮点数 224
8.3 AVX2打包整数 226
8.4 x86指令集扩展 226
8.4.1 半精度浮点数 227
8.4.2 乘法加法融合 227
8.4.3 通用寄存器指令集扩展 228
8.5 本章小结 229
第9章 AVX2程序设计:打包浮点数 230
9.1 打包浮点算术运算 230
9.2 打包浮点数组 236
9.2.1 简单计算 236
9.2.2 列均值 241
9.2.3 相关系数 246
9.3 矩阵乘法和转置 252
9.4 矩阵求逆 258
9.5 混合和排列指令 269
9.6 数据收集指令 273
9.7 本章小结 279
第10章 AVX2程序设计:打包整数 280
10.1 打包整数基础 280
10.1.1 基本算术运算 280
10.1.2 打包和解包 284
10.1.3 大小提升 289
10.2 打包整数图像处理 293
10.2.1 像素剪裁 293
10.2.2 RGB像素的小值和值 298
10.2.3 RGB图像到灰度图像的转换 304
10.3 本章小结 310
第11章 AVX2程序设计:扩展指令集 312
11.1 FMA程序设计 312
11.1.1 卷积 312
11.1.2 标量FMA 314
11.1.3 打包FMA 322
11.2 通用寄存器指令 329
11.2.1 不影响标志位的乘法和移位 329
11.2.2 增强型位操作 333
11.3 半精度浮点转换 336
11.4 本章小结 339
第12章 AVX-512 340
12.1 AVX-512概述 340
12.2 AVX-512执行环境 341
12.2.1 寄存器集 341
12.2.2 数据类型 3
自从个人计算机发明以来,软件开发人员使用x86汇编语言为各种各样的算法挑战提供了创新的解决方案。在PC时代的早期,软件开发人员常常会使用x86汇编语言编写程序的大部分代码甚至完整的应用程序。考虑到21世纪流行的高级语言(例如C 、C#、Java和Python),我们可能会惊讶地发现,许多软件开发人员仍然使用汇编语言来对程序的关键性能部分进行编码。尽管编译器多年以来有了显著的改进,能够生成空间效率和时间效率都很高的机器代码,但仍然存在这样的场景:软件开发人员有必要利用汇编语言编程的优越特点。
现代x86处理器的单指令多数据(Single-Instruction Multiple-Data,SIMD)体系结构从另一个方面解释了人们为何对汇编语言程序有着经久不衰的兴趣。支持SIMD的处理器提供了计算资源,有助于使用多个数据值同时进行计算,对于那些必须提供实时响应的应用程序而言,可以显著提高性能。SIMD体系结构也非常适合计算密集型问题领域,例如图像处理、音频和视频编码、计算机辅助设计、计算机图形学和数据挖掘。遗憾的是,许多高级语言和开发工具仍然无法完全或者部分地利用现代x86处理器的SIMD功能。相反,汇编语言则使软件开发人员能够充分利用处理器的SIMD计算资源。
现代x86汇编语言程序设计
本书是一本关于x86 64位(x86-64)汇编语言程序设计的教科书。本书的内容和组织旨在帮助读者快速理解x86-64汇编语言程序设计以及高级向量扩展(Advanced Vector Extension,AVX)的计算资源。本书还包含大量的源代码,这些源代码有助于读者学习和理解基本的x86-64汇编语言结构和SIMD编程概念。通过阅读本书,读者将能够使用x86-64汇编语言以及AVX、AVX2和AVX-512指令集编写性能增强的函数和算法。
在继续学习之前,应该明确指出,本书不包括x86-32汇编语言程序设计。本书也不讨论传统的x86技术,例如x87浮点单元、MMX和数据流SIMD扩展指令集。如果读者对这些主题感兴趣,可以参考本书第1版中的相关内容。本书没有解释操作系统中使用的x86体系结构特性或者特权指令。但是,读者需要完全理解本书中介绍的内容,才能开发用于操作系统的x86汇编语言代码。
虽然理论上我们可以使用汇编语言编写整个应用程序,但现代软件开发的苛刻要求使得这种方法不切实际,而且也不明智。作为替代,本书重点介绍如何编写x86-64汇编语言函数,这些函数可以被C 程序调用。本书使用微软的Visual Studio C 和微软宏汇编程序(MASM)编写所有的源代码示例程序。
目标读者
本书的目标读者是软件开发人员,包括:
正在为基于Windows的平台开发应用程序并希望学习如何使用x86-64汇编语言编写性能增强算法和函数的软件开发人员。
为非Windows环境开发应用程序并希望学习x86-64汇编语言编程的软件开发人员。
希望学习如何使用AVX、AVX2和AVX-512指令集创建SIMD计算函数的软件开发人员。
希望或者需要更好地了解x86-64平台及其SIMD体系结构的软件开发人员和计算机科学专业的学生。
本书的主要目标读者是Windows软件开发人员,因为源代码示例是使用Visual Studio C 和MASM开发的。由于本书大部分内容是独立于特定操作系统而组织和呈现的,因此非Windows平台的软件开发人员也可以从本书中受益。我们假设本书的读者已经具备其他高级语言的编程经验,并且对C 有基本的了解,但不需要熟悉Visual Studio或者Windows编程。
内容概述
本书的主要目的是帮助读者学习x86 64位汇编语言程序设计,以及AVX、AVX2和AVX-512指令集。本书的架构和内容都是为实现这一目标而设计的。下面将简单概述各章的学习内容。
第1章介绍x86-64平台的Core(核心)体系结构,包括对平台的基本数据类型、内部体系结构、寄存器集、指令操作数和内存寻址模式的讨论,该章还描述了Core x86-64指令集。第2章和第3章解释使用Core指令集和常见编程结构(包括数组和结构)进行x86-64汇编语言编程的基本原理。这两章(以及后续章节)中提供的源代码示例被打包为可运行的程序,这意味着读者可以运行、修改或者以其他方式尝试运行代码,从而增强学习体验。
第4章重点讨论AVX的体系结构资源,包括寄存器集、数据类型和指令集。第5章阐述如何利用AVX指令集使用单精度值和双精度值执行标量浮点运算。第6章和第7章阐述使用打包浮点数(packed floating-point)和打包整数(packed integer)操作数的AVX SIMD程序设计。
第8章介绍AVX2,并探讨了其增强功能,包括数据广播、数据收集和数据排列。第8章还将阐述乘法加法融合(Fused-Multiply-Add,FMA)操作。第9章和第10章包含源代码示例,举例说明了使用AVX2的针对打包浮点数和打包整数操作数的各种算法。第11章包括演示FMA编程的源代码示例,该章还将介绍使用通用寄存器解释x86平台扩展的示例。
第12章深入研究AVX-512体系结构的细节,介绍AVX-512的寄存器集和数据类型。该章还将阐述关键的AVX-512增强功能,包括条件执行和合并、嵌入式广播操作、指令级舍入。第13章和第14章包含许多源代码示例,用以演示如何利用这些高级功能。
第15章概述现代x86多核处理器及其底层微体系结构。该章还将概述可用于提高x86汇编语言代码性能的特定编码策略和技术。第16章讨论一些源代码示例,这些示例说明了高级x86汇编语言编程技术,包括处理器特性检测、加速内存访问和多线程计算。
附录A描述了如何使用Visual Studio和MASM执行源代码示例。附录A还给出了一个引用和资源列表,读者可以参阅这些资源,以获得有关x86汇编语言编程的更多信息。
源代码
读者可以在Apress的官网(https://www.apress.com/us/book/9781484240625)上找到本书源代码的下载信息。每一章的源代码都对应一个压缩文件,其中包含C 源代码文件和汇编语言源代码文件以及Visual Studio项目文件。压缩文件中没有提供可执行的安装程序。读者只需将每一章源代码压缩文件的内容解压到自己选择的文件夹中。
注意事项 源代码的目的是阐明与本书中所讨论的主题直接相关的编程示例。源代码很少涉及基本的软件工程问题,例如鲁棒错误处理、安全风险、数值稳定性、舍入误差、错误条件函数。如果读者决定在自己的程序中使用本书的源代码,那么需要处理这些问题。
源代码示例是在运行Windows 10 Pro 64位的PC上使用Visual Studio Professional 2017(版本15.7.1)创建的。Visual Studio官网(https://visualstudio.microsoft.com)包含有关此版本和Visual Studio其他版本的详细信息。有关Visual Studio安装、配置和应用程序开发的详细技术信息,请访问https://docs.microsoft.com/en-us/visualstudio/?view=vs-2017。
如果要运行源代码示例,那么推荐的硬件平台是一台基于x86的PC,装有Windows 10 64位操作系统,包含一个支持AVX的处理器。如果要运行使用AVX2或者AVX-512指令集的源代码示例,则需要一个与AVX2或者AVX-512兼容的处理器。读者可以使用附录A中列出的免费实用程序,以确定自己的PC支持哪些x86-AVX指令集扩展。
其他资源
AMD和英特尔都提供了一系列包罗广泛的与x86相关的编程文档。附录A列出了一些重要的资源,无论是新手还是经验丰富的x86汇编语言程序员,都会发现这些资源非常有用。在附录A列出的所有资源中,有价值的参考资料是Intel 64 and IA-32 Architectures Software Developer’s Manual-Combined Volumes: 1, 2A, 2B, 2C, 2D, 3A, 3B, 3C, 3D, and 4中的第2卷(https://www.intel.com/content/www/us/en/processors/architectures-softwaredeveloper-manuals.html)。该手册包含每个x86处理器指令的编程信息大全,包括详细的操作说明、有效操作数的列表、受影响的状态标志和潜在异常。强烈建议读者在开发自己的x86汇编语言代码来验证正确的指令用法时,充分利用这个不可或缺的参考资源。
致谢
书籍的出版和电影的制作有些类似。电影预告片颂扬主角的演技,而书籍封面宣扬作者的名气。演员和作者的努力终获得了公众的赞誉。然而,如果没有专业幕后团队的奉献精神、专业知识和创造能力,就不可能成功创作一部电影或者出版一本书籍。本书也不例外。
首先感谢Apress才华横溢的编辑团队所做的努力,特别感谢Steve Anglin、Mark Powers和Matthew Moodie。Paul Cohen一丝不苟的技术评审和切实可行的建议也非常值得称赞。还要称赞和肯定的是校对编辑Ed Kusswurm的辛勤工作和建设性的反馈。本书中的任何疏漏和不足完全由我本人负责。
我还要感谢Nirmal Selvaraj、Dulcy Nirmala、Kezia Endsley、Dhaneesh Kumar以及Apress所有制作人员所做的贡献。感谢各位同事的支持和鼓励。后,感谢我的父母Armin(RIP)和Mary以及兄弟姐妹Mary、Tom、Ed和John,感谢他们在本书写作过程中的鼓励和支持。
评论
还没有评论。