Jason D. Bakos,美国南卡罗来纳大学计算机科学与工程系副教授,研究方向包括高性能计算、异构网络和嵌入式计算机系统等。拥有2项专利,发表了30余篇学术论文。2009年曾获得美国国家科学基金(NSF)事业奖,现为ACM会刊《可重构技术与系统》的副主编。
目錄:
目 录Embedded Systems: ARM Programming and Optimization出版者的话译者序前言致谢第1章LinuxARM嵌入式平台11.1以性能为导向的编程21.2ARM技术31.3ARM简史41.4ARM编程41.5ARM体系集架构51.5.1ARM通用寄存器51.5.2状态寄存器61.5.3内存寻址模式71.5.4GNU ARM汇编81.6汇编优化1:排序81.6.1参考实现81.6.2汇编实现91.6.3结果验证111.6.4分析编译器生成的代码131.7汇编优化2:位操作151.8代码优化目标161.8.1减少执行指令数161.8.2降低平均CPI161.9使用性能计数器的运行时分析181.9.1ARM性能监控单元181.9.2Linux Perf_Event181.9.3性能计数器的基础架构191.10检测存储器带宽221.11性能测试结果251.12性能界限251.13基本指令集261.13.1整型算术指令261.13.2按位逻辑指令261.13.3移位指令271.13.4移动指令271.13.5加载和存储指令281.13.6比较指令281.13.7分支指令291.13.8浮点指令291.14小结30习题31第2章多核和数据层优化:OpenMP和SIMD332.1本书所涉及的优化技术332.2阿姆达尔定律342.3测试内核:多项式评估352.4使用多核:OpenMP372.4.1OpenMP指令372.4.2范围392.4.3其他OpenMP指令422.4.4OpenMP同步422.4.5调试OpenMP代码442.4.6OpenMP并行循环编译指令462.4.7OpenMP与性能计数器482.4.8OpenMP支持霍纳内核482.5性能界限482.6性能分析492.7GCC中的内联汇编语言502.8优化1:降低每f?lop的指令数512.9优化2:降低CPI542.9.1软件流水线542.9.2软件流水线的霍纳方法572.10优化3:使用SIMD时的每指令多f?lop632.10.1ARM11的VFP短向量指令652.10.2ARM Cortex的NEON指令672.10.3NEON内联函数692.11小结70习题71第3章算法优化和Linux帧缓冲723.1Linux帧缓冲723.2仿射图像变换743.3双线性插值743.4浮点图像变换753.4.1加载图像763.4.2渲染帧783.5浮点性能分析823.6定点运算823.6.1定点与浮点:准确度833.6.2定点与浮点:范围833.6.3定点与浮点:精度833.6.4使用定点843.6.5高效定点加法843.6.6高效定点乘法873.6.7确定小数点的位置893.6.8图像变换的范围和准确度要求903.6.9将浮点值转换为定点值的运算903.7定点性能923.8实时分形生成923.8.1像素着色943.8.2放大943.8.3范围和准确度要求953.9小结96习题96第4章存储优化和视频处理994.1模板循环994.2模板案例:均值滤波器1004.3可分离滤波器1004.3.1高斯模糊1014.3.2Sobel滤波器1034.3.3Harris角点检测器1044.3.4Lucas-Kanade光流1064.4二维滤波器的存储访问行为1084.4.1二维数据展示1084.4.2按行滤波1084.4.3按列滤波1094.5循环分块1104.6分块和模板晕区1124.7二维滤波实现案例1124.8视频帧的捕获和转换1164.8.1YUV和色度抽样1164.8.2将分块导出到帧缓冲区1184.9Video4Linux驱动和API1194.10使用二维分块滤波器1224.11应用可分离的二维分块滤波器1234.12顶层循环1244.13性能结果1244.14小结124习题125第5章利用OpenCL进行嵌入式异构编程1275.1GPU微体系结构1285.2OpenCL1285.3OpenCL编程模型、语法及摘要1295.3.1主机设备编程模型1295.3.2错误检查1305.3.3平台层:初始化平台1315.3.4平台层:初始化设备1335.3.5平台层:初始化上下文1355.3.6平台层:内核控制1365.3.7平台层:内核编译1375.3.8平台层:设备存储分配1405.4内核工作负荷分配1415.4.1设备存储区1425.4.2内核参数1435.4.3内核向量化1455.4.4霍纳内核的参数空间1465.4.5内核属性1475.4.6内核调度1475.5霍纳方法的OpenCL实现:设备码1525.6性能结果1565.6.1参数探索1565.6.2工作组数1565.6.3工作组大小1575.6.4向量大小1575.7小结158习题158附录A 为Raspberry Pi 1的Raspbian系统添加PMU支持160附录B NEON内联函数指令163附录C OpenCL参考175
內容試閱:
前 言Embedded Systems: ARM Programming and Optimization多年来,我一直工作在可重构计算领域。可重构计算领域的目标是开发有效的工具和方法,以促进现场可编程门阵列(FPGA)作为协处理器在高性能计算机系统中的使用。这个学科的主要挑战之一是“程序设计问题”,即FPGA的实际应用从根本上受到烦琐和容易出错的程序模型的限制。这个问题值得我们特别关注,因为它是技术优势所导致的结果:FPGA实现了细粒度并发操作,这样程序员可以控制芯片中每个电路的同步行为。然而,这种控制还要求程序员管理细粒度的控制,例如片上存储使用和路由拥塞。另一方面,CPU程序只需要考虑每一行代码的可能CPU状态,片上资源在硬件运行时将自动管理。最近我意识到,现代嵌入式系统可能很快就会面临类似的程序设计问题。电池技术仍然相对滞后,并且在用近6年时间实现了从65nm到28nm的制造工艺后,摩尔定律的发展速度开始明显减缓。与此同时,消费者已经开始期待嵌入式系统功能的不断进步,例如能够在一副眼镜上的处理器中运行实时增强现实(AR)软件。鉴于这些能源效率和性能的要求,许多嵌入式处理器厂商正在为微体系结构寻求更节能的方法,并经常涉及对并行类型的选择,而这一类型是不能从软件中自动提取的。这就需要程序员协助编写并行代码。这带来了很多问题:程序员要在资源和能量均有限的平台上兼顾功能和性能,要知道,在这个平台上可能包括从多核到GPU着色器单元等各种并行资源。许多大学已经开展了“统一”的并行编程课程,这些课程涵盖了从分布式系统到多核处理器的并行编程系列。然而,教授这类主题的角度通常是高性能计算而非嵌入式计算。随着最近Raspberry Pi等先进嵌入式平台的爆发,我意识到需要开发针对嵌入式系统性能的编程课程,这些课程应涵盖从计算机体系结构到并行编程的相关主题。我也想纳入一些有趣的相关项目和课程的案例研究,这样可以避开枯燥的传统嵌入式系统课程项目(例如闪烁的LED)和并行编程课程(例如编写和优化快速傅里叶变换)。在自己的嵌入式系统课程中使用这些想法时,我经常发现学生们会争相实现最快的图像旋转或最快的曼德布罗特集合生成器。这种竞争也激发了学生的学习热情。如何使用本书本书面向初级或高级本科计算机科学或计算机工程课程。虽然嵌入式系统课程可能关注控制理论、机器人技术、低功耗设计、实时系统或其他相关的主题,但本书旨在介绍轻量级片上系统嵌入式处理器上的以性能为导向的编程。本书应该结合Raspberry Pi等嵌入式设计平台一起使用,这样学生可以评估书中所述的实践和方法。在使用本书时,学生应该预先学习C编程语言和Linux操作系统的基本知识,并了解诸如任务同步等基本的并发。教辅支持可访问网站booksite.elsevier.com9780128003428查看本书的幻灯片、习题答案和勘误表。致 谢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为本书设计封面。