本书结合ARM架构和Linux工具,关注以性能为导向的嵌入式编程,深入讲解如何通过对数据、算法和存储等层面的优化,终实现性能的显著提升。本书先讲解ARM架构和嵌入式系统的基础知识,然后结合图像变换、分形生成和计算机视觉等应用案例,详细说明不同的优化方法。读者可在RaspberryPi等平台上动手运行并比较不同算法,掌握实践技巧。本书适合作为本科或研究生嵌入式系统课程的教材,也适合从事相关开发工作的程序员参考。
Jason D. Bakos,美国南卡罗来纳大学计算机科学与工程系副教授,研究方向包括高性能计算、异构网络和嵌入式计算机系统等。拥有2项专利,发表了30余篇学术论文。2009年曾获得美国国家科学基金(NSF)事业奖,现为ACM会刊《可重构技术与系统》的副主编。
目录
EmbeddedSystems:ARMProgrammingandOptimization
出版者的话
译者序
前言
致谢
第1章Linux/ARM嵌入式平台1
1.1以性能为导向的编程2
1.2ARM技术3
1.3ARM简史4
1.4ARM编程4
1.5ARM体系集架构5
1.5.1ARM通用寄存器5
1.5.2状态寄存器6
1.5.3内存寻址模式7
1.5.4GNUARM汇编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降低平均CPI16
1.9使用性能计数器的运行时分析18
1.9.1ARM性能监控单元18
1.9.2LinuxPerf_Event18
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和SIMD33
2.1本书所涉及的优化技术33
2.2阿姆达尔定律34
2.3测试内核:多项式评估35
2.4使用多核:OpenMP37
2.4.1OpenMP指令37
2.4.2范围39
2.4.3其他OpenMP指令42
2.4.4OpenMP同步42
2.4.5调试OpenMP代码44
2.4.6OpenMP并行循环编译指令46
2.4.7OpenMP与性能计数器48
2.4.8OpenMP支持霍纳内核48
2.5性能界限48
2.6性能分析49
2.7GCC中的内联汇编语言50
2.8优化1:降低每f?lop的指令数51
2.9优化2:降低CPI54
2.9.1软件流水线54
2.9.2软件流水线的霍纳方法57
2.10优化3:使用SIMD时的每指令多f?lop63
2.10.1ARM11的VFP短向量指令65
2.10.2ARMCortex的NEON指令67
2.10.3NEON内联函数69
2.11小结70
习题71
第3章算法优化和Linux帧缓冲72
3.1Linux帧缓冲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.2Sobel滤波器103
4.3.3Harris角点检测器104
4.3.4Lucas-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.1YUV和色度抽样116
4.8.2将分块导出到帧缓冲区118
4.9Video4Linux驱动和API119
4.10使用二维分块滤波器122
4.11应用可分离的二维分块滤波器123
4.12顶层循环124
4.13性能结果124
4.14小结124
习题125
第5章利用OpenCL进行嵌入式异构编程127
5.1GPU微体系结构128
5.2OpenCL128
5.3OpenCL编程模型、语法及摘要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为RaspberryPi1的Raspbian系统添加PMU支持160
附录BNEON内联函数指令163
附录COpenCL参考175
前言EmbeddedSystems:ARMProgrammingandOptimization多年来,我一直工作在可重构计算领域。可重构计算领域的目标是开发有效的工具和方法,以促进现场可编程门阵列(FPGA)作为协处理器在高性能计算机系统中的使用。
这个学科的主要挑战之一是“程序设计问题”,即FPGA的实际应用从根本上受到烦琐和容易出错的程序模型的限制。这个问题值得我们特别关注,因为它是技术优势所导致的结果:FPGA实现了细粒度并发操作,这样程序员可以控制芯片中每个电路的同步行为。然而,这种控制还要求程序员管理细粒度的控制,例如片上存储使用和路由拥塞。另一方面,CPU程序只需要考虑每一行代码的可能CPU状态,片上资源在硬件运行时将自动管理。
最近我意识到,现代嵌入式系统可能很快就会面临类似的程序设计问题。电池技术仍然相对滞后,并且在用近6年时间实现了从65nm到28nm的制造工艺后,摩尔定律的发展速度开始明显减缓。与此同时,消费者已经开始期待嵌入式系统功能的不断进步,例如能够在一副眼镜上的处理器中运行实时增强现实(AR)软件。
鉴于这些能源效率和性能的要求,许多嵌入式处理器厂商正在为微体系结构寻求更节能的方法,并经常涉及对并行类型的选择,而这一类型是不能从软件中自动提取的。这就需要程序员协助编写并行代码。这带来了很多问题:程序员要在资源和能量均有限的平台上兼顾功能和性能,要知道,在这个平台上可能包括从多核到GPU着色器单元等各种并行资源。
许多大学已经开展了“统一”的并行编程课程,这些课程涵盖了从分布式系统到多核处理器的并行编程系列。然而,教授这类主题的角度通常是高性能计算而非嵌入式计算。
随着最近RaspberryPi等先进嵌入式平台的爆发,我意识到需要开发针对嵌入式系统性能的编程课程,这些课程应涵盖从计算机体系结构到并行编程的相关主题。我也想纳入一些有趣的相关项目和课程的案例研究,这样可以避开枯燥的传统嵌入式系统课程项目(例如闪烁的LED)和并行编程课程(例如编写和优化快速傅里叶变换)。
在自己的嵌入式系统课程中使用这些想法时,我经常发现学生们会争相实现最快的图像旋转或最快的曼德布罗特集合生成器。这种竞争也激发了学生的学习热情。
如何使用本书本书面向初级或高级本科计算机科学或计算机工程课程。虽然嵌入式系统课程可能关注控制理论、机器人技术、低功耗设计、实时系统或其他相关的主题,但本书旨在介绍轻量级片上系统嵌入式处理器上的以性能为导向的编程。
本书应该结合RaspberryPi等嵌入式设计平台一起使用,这样学生可以评估书中所述的实践和方法。
在使用本书时,学生应该预先学习C编程语言和Linux操作系统的基本知识,并了解诸如任务同步等基本的并发。
教辅支持可访问网站booksite.elsevier.com/9780128003428查看本书的幻灯片、习题答案和勘误表。
致谢EmbeddedSystems:ARMProgrammingandOptimization感谢帮助我完成本书的几位学生。
2013年春季和夏季,本科生BenjaminMorgan、JonathanKilby、ShawnWeaver、JustinRobinson以及AmadeoBellotti评估了RaspberryPiBroadcomBCM2835和XilinxZynq7020上的DMA控制器和性能监控单元。
2014年夏季,本科生DanielClements帮助我开发了在ARM11、ARMCortexA9和ARMCortexA15上使用Linuxperf_event的统一方法。Daniel还评估了图像技术的OpenCL运行时,以及描述了在ODROIDXUExynos5平台上的PowerVR544GPU的性能特点。
2015年夏季,本科生Friel“Scottie”Scott帮助我评估了ODROIDXU3平台上的MaliT628GPU,并且校对了第5章的内容。
许多关于计算机视觉算法存储优化的见解来自我的研究生FanZhang的关于德州仪器关键数字信号处理器架构的自动优化模板循环的论文。
感谢以下评论者,他们在本书的编写过程中提供了反馈、见解以及有用的建议:
MiriamLeeser,美国东北大学LarryD.Pyeatt,美国南达科他矿业理工学院AndrewN.Sloss,美国华盛顿大学,同时在ARM公司做顾问工程师AmrZaky,美国圣塔克拉拉大学感谢MorganKaufmann出版公司,感谢NateMcFadden在整个写作过程中给予我的不断鼓励和无限耐心。特别感谢Nate对于本书内容所持的开放和灵活的态度,这使我在写作时能够不断跟进新发布的基于ARM的嵌入式开发平台。也要感谢SujathaThirugnanaSambandam的细心编辑,还要感谢MarkRogers为本书设计封面。
在当前的嵌入式开发浪潮中,ARM处理器几乎占据了绝大多数的市场份额,从智能手机到物联网设备,再到汽车电子,无处不在。然而,很多时候,我们仅仅是停留在应用层开发,对于ARM底层的运行机制和优化技巧知之甚少,这无疑限制了我们的技术瓶颈,也无法真正发挥出ARM处理器的强大性能。我一直认为,要想成为一名优秀的嵌入式工程师,对ARM架构的深刻理解是必不可少的。这本书如果能系统地介绍ARM的各种架构特性,比如Cortex-M系列和Cortex-A系列在设计理念上的差异,以及它们各自适合的应用场景,那将非常有价值。更重要的是,我希望书中能够详细讲解如何利用ARM提供的各种指令集,特别是那些针对特定优化的指令,例如SIMD指令,以及如何通过编译器选项和链接脚本来进一步优化程序的性能。我还希望书中能涵盖一些实际的优化案例,比如在图像处理、信号处理等领域,如何通过精细化的代码编写和硬件特性利用,来达到显著的性能提升。这样的内容,对于正在从事或者希望从事高性能嵌入式系统开发的工程师来说,无疑是极其宝贵的财富,能够帮助我们跨越技术鸿沟,做出更具竞争力的产品。
评分我一直对嵌入式系统中的“魔法”感到着迷,尤其是在资源受限的环境下,如何通过精巧的设计和巧妙的代码,榨干硬件的每一分潜力,实现令人惊叹的性能。ARM处理器作为当今嵌入式领域的主流,其架构的复杂性和优化空间的广阔性,一直是我探索的重点。我特别关注那些能够提升代码执行效率,降低功耗,甚至延长设备寿命的优化技术。这本书如果能够深入探讨ARM的流水线、分支预测、指令乱序执行等微架构层面的原理,并在此基础上给出具体的优化策略,那将非常有吸引力。例如,如何编写能够最大化缓存利用率的代码?如何通过合理的循环展开和函数内联来减少函数调用开销?如何利用ARM的协处理器或者特殊的指令集来加速特定的计算任务?我还希望书中能涉及一些内存访问的优化技巧,比如如何避免内存访问冲突,如何利用DMA来减轻CPU的负担,以及如何进行高效的内存拷贝。这些深入的细节,往往是决定一个嵌入式系统性能上限的关键。我渴望通过这本书,能够掌握那些“秘而不宣”的优化绝技,将我的嵌入式编程能力提升到一个全新的高度,让我的代码不仅能够运行,而且能够“飞”起来。
评分这本书的出现,无疑是在我漫长的嵌入式学习生涯中,又一盏指路明灯。一直以来,对于ARM架构的深入理解,以及如何在有限的资源下实现极致的性能优化,是我在项目中不断追求的目标。很多时候,即使能够勉强实现功能,但总觉得在性能和效率上还有很大的提升空间,那种“差一口气”的感觉,总让我有些耿耿于怀。市面上关于ARM的书籍不少,但往往要么过于理论化,要么过于浅显,难以真正触及到我所关心的那些核心问题。我渴望能够有一本书,能够系统地讲解ARM的指令集、流水线、缓存机制等底层原理,并且能够将这些理论知识与实际的编程技巧相结合,教会我如何写出高效、优雅的代码。例如,在处理中断时,如何最小化中断响应时间和延迟?在进行浮点运算时,如何充分利用FPU的特性?在内存访问方面,如何通过合理的内存布局和访问模式来提高缓存命中率?这些都是我在实际开发中经常遇到的挑战。我相信,这本书的出现,能够帮助我拨开迷雾,更清晰地认识ARM的强大之处,并掌握真正行之有效的优化方法,让我的嵌入式项目性能更上一层楼,从“能跑就行”迈向“跑得更好”。
评分作为一名初涉嵌入式领域的开发者,我深感ARM生态系统的庞大和复杂。每次接触新的项目,都会被各种陌生的概念和工具链所淹没。尤其是在进行底层驱动开发或者需要对性能有极致要求的场景时,总会感到力不从心。我一直在寻找一本能够真正引导我入门,并且能够让我建立起扎实的ARM基础的书籍。市面上那些泛泛而谈的教程,虽然能够让我了解一些表面的知识,但一旦深入下去,就会发现很多细节是模糊不清的。我希望能够有一本书,能够从最基础的ARM指令集开始讲解,循序渐进地介绍CPU的工作原理、内存管理、中断处理等关键概念,并配以清晰易懂的图示和代码示例。同时,我也希望能学习到如何在不同的ARM平台上进行开发,例如如何选择合适的工具链,如何配置交叉编译环境,以及如何进行代码的调试和性能分析。对于初学者来说,能够建立起一个完整的知识体系,并且能够独立解决实际问题,是非常重要的。我期待这本书能够成为我学习ARM嵌入式编程的“敲门砖”,为我未来的深入学习打下坚实的基础,让我能够自信地面对各种嵌入式开发挑战。
评分在接触嵌入式开发的过程中,我逐渐发现,虽然高级语言能够大大提高开发效率,但要想在性能敏感的应用中取得突破,最终还是需要回归到对底层硬件和指令的理解。ARM架构的普及,使得对ARM汇编语言的掌握以及对ARM指令集的深入理解,变得愈发重要。我一直希望能找到一本能够系统讲解ARM汇编语言,并且能够将汇编与C语言相结合进行优化的书籍。这本书如果能够清晰地展示ARM的各种寻址模式,以及不同类型指令的用法,并提供大量的实际应用案例,那就太棒了。例如,我希望能学习到如何使用汇编语言来优化那些性能瓶颈的代码段,比如在进行数据处理、字符串操作或者位运算时,如何编写出比C语言编译器生成的代码更高效的汇编指令。同时,我也希望书中能讲解如何通过内联汇编的方式,将汇编代码嵌入到C程序中,从而实现性能的精细化调优。对于那些追求极致性能,或者需要在非常受限的硬件环境中工作的开发者来说,这样的知识是无价之宝。我期待这本书能为我打开一扇新的大门,让我能够更直接、更深刻地与ARM处理器进行对话,从而创造出更加高效、更加卓越的嵌入式系统。
评分很好
评分翻译的不太到位,建议买英文版的
评分翻译的不太到位,建议买英文版的
评分此用户未填写评价内容
评分。。。。。。。。。。。。。
评分翻译的不太到位,建议买英文版的
评分很好
评分此用户未填写评价内容
评分此用户未填写评价内容
本站所有内容均为互联网搜索引擎提供的公开搜索信息,本站不存储任何数据与内容,任何内容与数据均与本站无关,如有需要请联系相关搜索引擎包括但不限于百度,google,bing,sogou 等
© 2025 book.coffeedeals.club All Rights Reserved. 静流书站 版权所有