本書結合ARM架構和Linux工具,關注以性能為導向的嵌入式編程,深入講解如何通過對數據、算法和存儲等層面的優化,終實現性能的顯著提升。本書先講解ARM架構和嵌入式系統的基礎知識,然后結合圖像變換、分形生成和計算機視覺等應用案例,詳細說明不同的優化方法。讀者可在RaspberryPi等平臺上動手運行并比較不同算法,掌握實踐技巧。本書適合作為本科或研究生嵌入式系統課程的教材,也適合從事相關開發工作的程序員參考。
前 言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.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為本書設計封面。
Jason D. Bakos,美國南卡羅來納大學計算機科學與工程系副教授,研究方向包括高性能計算、異構網絡和嵌入式計算機系統等。擁有2項專利,發表了30余篇學術論文。2009年曾獲得美國國家科學基金(NSF)事業獎,現為ACM會刊《可重構技術與系統》的副主編。
目 錄Embedded Systems: ARM Programming and Optimization出版者的話譯者序前言致謝第1章Linux/ARM嵌入式平臺 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降低平均CPI 161.9使用性能計數器的運行時分析 181.9.1ARM性能監控單元 181.9.2Linux Perf_Event 181.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和SIMD 332.1本書所涉及的優化技術 332.2阿姆達爾定律 342.3測試內核:多項式評估 352.4使用多核:OpenMP 372.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:降低CPI 542.9.1軟件流水線 542.9.2軟件流水線的霍納方法 572.10優化3:使用SIMD時的每指令多f?lop 632.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驅動和API 1194.10使用二維分塊濾波器 1224.11應用可分離的二維分塊濾波器 1234.12頂層循環 1244.13性能結果 1244.14小結 124習題 125第5章利用OpenCL進行嵌入式異構編程 1275.1GPU微體系結構 1285.2OpenCL 1285.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