ARM嵌入式系统编程与优化
作者 : [美]詹森 D.巴克斯(Jason D. Bakos)著
译者 : 梁元宇 译
丛书名 : 计算机科学丛书
出版日期 : 2017-09-11
ISBN : 978-7-111-57803-1
定价 : 59.00元
教辅资源下载
扩展信息
语种 : 简体中文
页数 : 213
开本 : 16
原书名 : Embedded Systems: ARM Programming and Optimization
原出版社:
属性分类: 教材
包含CD :
绝版 :
图书简介

现代电子工业得益于两大技术:ARM处理器和Linux操作系统。几乎所有的现代移动设备都是基于ARM处理器的,同时,这些处理器上运行的大多是Linux操作系统。因此,掌握基于ARM和Linux的嵌入式系统设计和开发是非常重要的。本书结合ARM体系结构和Linux工具,讲解程序设计的不同特性将如何对处理器性能产生影响。书中证明,存在一种方法,在不改变程序语义的前提下,允许程序员通过修改代码来实现对性能的重要影响。用于描述和证明这种方法的实际应用包括:图像变换、分形生成、图像卷积和计算机视觉等。本书不仅能够帮助读者理解计算机体系结构和应用设计的基础知识,还提供了设计嵌入式软件的实用技巧。

图书特色

移动互联网时代,几乎所有移动设备都是基于ARM处理器的,并且这些处理器上运行的大多是嵌入式Linux操作系统。本书结合ARM架构和Linux工具,关注以性能为导向的嵌入式编程,深入讲解如何通过对数据、算法和存储等层面的优化,最终实现性能的显著提升。
相比于侧重高性能计算的并行编程课程,本书则聚焦嵌入式计算,特别是在实践案例的设计上,摒弃了LED控制和FFT优化等枯燥项目,而是选取计算机视觉、分形生成、图像变换等有趣的应用,读者可在Raspberry Pi等平台上动手运行并比较不同算法,达到事半功倍的学习效果。
本书特色
涵盖ARMv6和ARMv7-A两种ARM指令集架构,以及ARM11、Cortex-A9和Cortex-A15三种ARM内核。
高效利用Linux工具,包括GCC编译和调试工具、性能监控工具、OpenMP多核运行时环境和视频帧缓冲等。
书中程序在目前大多数低成本的Linux/ARM嵌入式开发板上均可正常运行,方便读者进行实践。
作者简介
詹森 D. 巴克斯(Jason D. Bakos) 美国南卡罗来纳大学计算机科学与工程系副教授,其研究方向包括高性能计算、异构网络和计算机体系结构等。2009年曾获得美国国家科学基金会(NSF)事业奖,现为ACM会刊《可重构技术与系统》的副主编。

图书前言

多年来,我一直工作在可重构计算领域。可重构计算领域的目标是开发有效的工具和方法,以促进现场可编程门阵列(FPGA)作为协处理器在高性能计算机系统中的使用。
这个学科的主要挑战之一是“程序设计问题”,即FPGA的实际应用从根本上受到烦琐和容易出错的程序模型的限制。这个问题值得我们特别关注,因为它是技术优势所导致的结果:FPGA实现了细粒度并发操作,这样程序员可以控制芯片中每个电路的同步行为。然而,这种控制还要求程序员管理细粒度的控制,例如片上存储使用和路由拥塞。另一方面,CPU程序只需要考虑每一行代码的可能CPU状态,片上资源在硬件运行时将自动管理。
最近我意识到,现代嵌入式系统可能很快就会面临类似的程序设计问题。电池技术仍然相对滞后,并且在用近6年时间实现了从65nm到28nm的制造工艺后,摩尔定律的发展速度开始明显减缓。与此同时,消费者已经开始期待嵌入式系统功能的不断进步,例如能够在一副眼镜上的处理器中运行实时增强现实(AR)软件。
鉴于这些能源效率和性能的要求,许多嵌入式处理器厂商正在为微体系结构寻求更节能的方法,并经常涉及对并行类型的选择,而这一类型是不能从软件中自动提取的。这就需要程序员协助编写并行代码。这带来了很多问题:程序员要在资源和能量均有限的平台上兼顾功能和性能,要知道,在这个平台上可能包括从多核到GPU着色器单元等各种并行资源。
许多大学已经开展了“统一”的并行编程课程,这些课程涵盖了从分布式系统到多核处理器的并行编程系列。然而,教授这类主题的角度通常是高性能计算而非嵌入式计算。
随着最近Raspberry Pi等先进嵌入式平台的爆发,我意识到需要开发针对嵌入式系统性能的编程课程,这些课程应涵盖从计算机体系结构到并行编程的相关主题。我也想纳入一些有趣的相关项目和课程的案例研究,这样可以避开枯燥的传统嵌入式系统课程项目(例如闪烁的LED)和并行编程课程(例如编写和优化快速傅里叶变换)。
在自己的嵌入式系统课程中使用这些想法时,我经常发现学生们会争相实现最快的图像旋转或最快的曼德布罗特集合生成器。这种竞争也激发了学生的学习热情。
如何使用本书
本书面向初级或高级本科计算机科学或计算机工程课程。虽然嵌入式系统课程可能关注控制理论、机器人技术、低功耗设计、实时系统或其他相关的主题,但本书旨在介绍轻量级片上系统嵌入式处理器上的以性能为导向的编程。
本书应该结合Raspberry Pi等嵌入式设计平台一起使用,这样学生可以评估书中所述的实践和方法。
在使用本书时,学生应该预先学习C编程语言和Linux操作系统的基本知识,并了解诸如任务同步等基本的并发。
教辅支持
可访问网站booksite.elsevier.com/9780128003428查看本书的幻灯片、习题答案和勘误表。
致 谢
Embedded Systems: ARM Programming and Optimization
感谢帮助我完成本书的几位学生。
2013年春季和夏季,本科生Benjamin Morgan、Jonathan Kilby、Shawn Weaver、Justin Robinson以及Amadeo Bellotti评估了Raspberry Pi Broadcom BCM2835和Xilinx Zynq 7020上的DMA控制器和性能监控单元。
2014年夏季,本科生Daniel Clements帮助我开发了在ARM11、ARM Cortex A9和ARM Cortex A15上使用Linux perf_event的统一方法。Daniel还评估了图像技术的OpenCL运行时,以及描述了在ODROID XU Exynos 5平台上的PowerVR 544 GPU的性能特点。
2015年夏季,本科生Friel“Scottie”Scott帮助我评估了ODROID XU3平台上的Mali T628 GPU,并且校对了第5章的内容。
许多关于计算机视觉算法存储优化的见解来自我的研究生Fan Zhang的关于德州仪器关键数字信号处理器架构的自动优化模板循环的论文。
感谢以下评论者,他们在本书的编写过程中提供了反馈、见解以及有用的建议:
Miriam Leeser,美国东北大学
Larry D. Pyeatt,美国南达科他矿业理工学院
Andrew N. Sloss,美国华盛顿大学,同时在ARM公司做顾问工程师
Amr Zaky,美国圣塔克拉拉大学
感谢Morgan Kaufmann出版公司,感谢Nate McFadden在整个写作过程中给予我的不断鼓励和无限耐心。特别感谢Nate对于本书内容所持的开放和灵活的态度,这使我在写作时能够不断跟进新发布的基于ARM的嵌入式开发平台。也要感谢Sujatha Thirugnana Sambandam的细心编辑,还要感谢Mark Rogers为本书设计封面。

上架指导

计算机/嵌入式

封底文字

【同此书影印书56528】

移动互联网时代,几乎所有移动设备都是基于ARM处理器的,并且这些处理器上运行的大多是嵌入式Linux操作系统。本书结合ARM架构和Linux工具,关注以性能为导向的嵌入式编程,深入讲解如何通过对数据、算法和存储等层面的优化,最终实现性能的显著提升。

相比于侧重高性能计算的并行编程课程,本书则聚焦嵌入式计算,特别是在实践案例的设计上,摒弃了LED控制和FFT优化等枯燥项目,而是选取计算机视觉、分形生成、图像变换等有趣的应用,读者可在Raspberry Pi等平台上动手运行并比较不同算法,达到事半功倍的学习效果。

本书特色:
·涵盖ARMv6和ARMv7-A两种ARM指令集架构,以及ARM11、Cortex-A9和Cortex-A15三种ARM内核。
·高效利用Linux工具,包括GCC编译和调试工具、性能监控工具、OpenMP多核运行时环境和视频帧缓冲等。
·书中程序在目前大多数低成本的Linux/ARM嵌入式开发板上均可正常运行,方便读者进行实践。

作者简介

[美]詹森 D.巴克斯(Jason D. Bakos)著:
【加照片】詹森 D.巴克斯(Jason D. Bakos) 美国南卡罗来纳大学计算机科学与工程系副教授,研究方向包括高性能计算、异构网络和计算机体系结构等。2009年曾获得美国国家科学基金会(NSF)事业奖,现为ACM会刊《可重构技术与系统》的副主编。

译者序

这是我独立翻译的第一本书。虽然我对Linux和ARM的了解并不是那么精深,但想来这样一本300多页的介绍主流ARM嵌入式系统的书,翻译起来应该没多大难度。很遗憾,随着翻译工作的进行,我发现自己的技术储备并不充足。
虽然本书篇幅不长,但介绍了非常多的内容。本书的大部分章节都在介绍ARM技术及主流的优化方法,作者对各种知识点的介绍都很简洁,有些地方只是点到为止,甚至只是给出一些基本思路。读者不必因为不明白其中的某些细节而感到沮丧,把本书看作一个学习ARM嵌入式系统的快速通道就好。在此基础上,对于感兴趣的内容,自己再进一步深入学习。
虽然翻译过程没有想象的那样顺利,但我本人还是收获颇丰。收获之一便是对ARM嵌入式系统有了更多的了解。另一个收获是,我发现本书还涉及异构并行等前沿概念,满足了我学习新事物的好奇心。
目前该领域相关的图书资料还相当缺乏,本书作者显然想在第一时间和大家分享他的知识,因此本书难免存在不足之处,有些地方尚有一定的改进空间。在翻译过程中,我已经修正了多处比较明显的小错误,但因为自身水平和精力有限,所以可能会在翻译过程中引入新的错误,恳请广大读者不吝赐教。
最后要感谢机械工业出版社华章分社的编辑在审校等环节的辛勤付出。

梁元宇
2017年7月于南京

图书目录

出版者的话
译者序
前言
致谢
第1章 Linux/ARM嵌入式平台 1
1.1 以性能为导向的编程 2
1.2 ARM技术 3
1.3 ARM简史 4
1.4 ARM编程 4
1.5 ARM体系集架构 5
1.5.1 ARM通用寄存器 5
1.5.2 状态寄存器 6
1.5.3 内存寻址模式 7
1.5.4 GNU ARM汇编 8
1.6 汇编优化1:排序 8
1.6.1 参考实现 8
1.6.2 汇编实现 9
1.6.3 结果验证 11
1.6.4 分析编译器生成的代码 13
1.7 汇编优化2:位操作 15
1.8 代码优化目标 16
1.8.1 减少执行指令数 16
1.8.2 降低平均CPI 16
1.9 使用性能计数器的运行时分析 18
1.9.1 ARM性能监控单元 18
1.9.2 Linux Perf_Event 18
1.9.3 性能计数器的基础架构 19
1.10 检测存储器带宽 22
1.11 性能测试结果 25
1.12 性能界限 25
1.13 基本指令集 26
1.13.1 整型算术指令 26
1.13.2 按位逻辑指令 26
1.13.3 移位指令 27
1.13.4 移动指令 27
1.13.5 加载和存储指令 28
1.13.6 比较指令 28
1.13.7 分支指令 29
1.13.8 浮点指令 29
1.14 小结 30
习题 31
第2章 多核和数据层优化:OpenMP和SIMD 33
2.1 本书所涉及的优化技术 33
2.2 阿姆达尔定律 34
2.3 测试内核:多项式评估 35
2.4 使用多核:OpenMP 37
2.4.1 OpenMP指令 37
2.4.2 范围 39
2.4.3 其他OpenMP指令 42
2.4.4 OpenMP同步 42
2.4.5 调试OpenMP代码 44
2.4.6 OpenMP并行循环编译指令 46
2.4.7 OpenMP与性能计数器 48
2.4.8 OpenMP支持霍纳内核 48
2.5 性能界限 48
2.6 性能分析 49
2.7 GCC中的内联汇编语言 50
2.8 优化1:降低每f lop的指令数 51
2.9 优化2:降低CPI 54
2.9.1 软件流水线 54
2.9.2 软件流水线的霍纳方法 57
2.10 优化3:使用SIMD时的每指令多f lop 63
2.10.1 ARM11的VFP短向量指令 65
2.10.2 ARM Cortex的NEON指令 67
2.10.3 NEON内联函数 69
2.11 小结 70
习题 71
第3章 算法优化和Linux帧缓冲 72
3.1 Linux帧缓冲 72
3.2 仿射图像变换 74
3.3 双线性插值 74
3.4 浮点图像变换 75
3.4.1 加载图像 76
3.4.2 渲染帧 78
3.5 浮点性能分析 82
3.6 定点运算 82
3.6.1 定点与浮点:准确度 83
3.6.2 定点与浮点:范围 83
3.6.3 定点与浮点:精度 83
3.6.4 使用定点 84
3.6.5 高效定点加法 84
3.6.6 高效定点乘法 87
3.6.7 确定小数点的位置 89
3.6.8 图像变换的范围和准确度要求 90
3.6.9 将浮点值转换为定点值的运算 90
3.7 定点性能 92
3.8 实时分形生成 92
3.8.1 像素着色 94
3.8.2 放大 94
3.8.3 范围和准确度要求 95
3.9 小结 96
习题 96
第4章 存储优化和视频处理 99
4.1 模板循环 99
4.2 模板案例:均值滤波器 100
4.3 可分离滤波器 100
4.3.1 高斯模糊 101
4.3.2 Sobel滤波器 103
4.3.3 Harris角点检测器 104
4.3.4 Lucas-Kanade光流 106
4.4 二维滤波器的存储访问行为 108
4.4.1 二维数据展示 108
4.4.2 按行滤波 108
4.4.3 按列滤波 109
4.5 循环分块 110
4.6 分块和模板晕区 112
4.7 二维滤波实现案例 112
4.8 视频帧的捕获和转换 116
4.8.1 YUV和色度抽样 116
4.8.2 将分块导出到帧缓冲区 118
4.9 Video4Linux驱动和API 119
4.10 使用二维分块滤波器 122
4.11 应用可分离的二维分块滤波器 123
4.12 顶层循环 124
4.13 性能结果 124
4.14 小结 124
习题 125
第5章 利用OpenCL进行嵌入式异构编程 127
5.1 GPU微体系结构 128
5.2 OpenCL 128
5.3 OpenCL编程模型、语法及摘要 129
5.3.1 主机/设备编程模型 129
5.3.2 错误检查 130
5.3.3 平台层:初始化平台 131
5.3.4 平台层:初始化设备 133
5.3.5 平台层:初始化上下文 135
5.3.6 平台层:内核控制 136
5.3.7 平台层:内核编译 137
5.3.8 平台层:设备存储分配 140
5.4 内核工作负荷分配 141
5.4.1 设备存储区 142
5.4.2 内核参数 143
5.4.3 内核向量化 145
5.4.4 霍纳内核的参数空间 146
5.4.5 内核属性 147
5.4.6 内核调度 147
5.5 霍纳方法的OpenCL实现:设备码 152
5.6 性能结果 156
5.6.1 参数探索 156
5.6.2 工作组数 156
5.6.3 工作组大小 157
5.6.4 向量大小 157
5.7 小结 158
习题 158
附录A 为Raspberry Pi 1的Raspbian系统添加PMU支持 160
附录B NEON内联函数指令 163
附录C OpenCL参考 175

教学资源推荐
作者: 赵淑芬 主编周斌 康宇光 副主编
作者: [新西兰]伊恩 H. 威腾(Ian H. Witten) 埃贝?弗兰克(Eibe Frank) 马克 A. 霍尔(Mark A. Hall) [加]克里斯多夫 J. 帕尔(Christopher J. Pal)著
参考读物推荐
作者: 魏磊 张聪 邬小亮 等编著
作者: 朱学敏 著
作者: Clayton R.Paul