天天看點

OpenCL 通用程式設計與優化(4)4 Adreno OpenCL 應用開發

OpenCL 通用程式設計與優化(4)

  • 4 Adreno OpenCL 應用開發
    • 4.1 Android上OpenCL應用開發
    • 4.2 Adreno Opencl SDK和Adreno Opencl機器學習SDK
    • 4.3 調試工具和技巧
    • 4.4 骁龍分析器(SDP)
      • 4.4.1 使用 SDP 的步驟
      • 4.4.2 如何解釋來自 SDP 的名額
      • 4.4.3 如何有效使用profiler
      • 4.4.4 SDP:靜态代碼分析

4 Adreno OpenCL 應用開發

本章簡要讨論了 Adreno OpenCL 應用程式開發的一些基本要求,然後是如何調試和分析應用程式。

4.1 Android上OpenCL應用開發

Adreno GPU主要支援Android作業系統(OS)和標明的Linux系統上的OPENCL。為了開發與OpenCL一起運作的Android應用程式,開發人員需要使用Android軟體開發套件(SDK)和Android Native Development套件(NDK)。有關Android SDK和NDK,請參閱https://develoder.android.com/index.html和https://developer.android.com/ndk/index.html。在本章和以下各章中,假定開發在Android平台上,開發人員在Android SDK和NDK上具有經驗。 Linux上的應用程式開發應相似

在骁龍平台上進行OpenCL開發有幾個先決條件:*

  • 支援 OpenCL 的 Snapdragon 裝置。并非所有 Snapdragon 裝置都支援OpenCL。有關詳細資訊,請參閱表 3-1。
  • OpenCL 軟體。 Adreno GPU 上的 OpenCL 依賴于 QTI 專有庫
    • 檢查裝置是否安裝了 OpenCL 庫。
      • 核心庫是libOpenCL.so,通常位于裝置上的/vendor/lib。
    • 一些供應商可能選擇不包括 OpenCL 軟體(例如,谷歌的 Nexus 和 Pixel 裝置)。
  • OpenCL 必須運作在 NDK 層。
  • 開發和測試不需要 Root 通路權限,但在性能模式下運作 SOC 可能需要。

表 4-1 總結了使用 Adreno GPU 進行 OpenCL 開發的關鍵要求。

表 4-1 使用 Adreno GPU 進行 OpenCL 開發的要求

内容 要求 注意
裝置 Adreno GPUs
作業系統 Android, Linux 僅選擇Linux平台支援OpenCL。
裝置軟體要求 裝置上有 libOpenCL.so 有些裝置可能沒有
開發需求 Adreno NDK/SDK OpenCL代碼需要運作在NDK層
裝置上的root權限 一般不需要 性能模式需要

4.2 Adreno Opencl SDK和Adreno Opencl機器學習SDK

開發人員可以在 https://developer.qualcomm.com/software/adreno-gpu-sdk/tools 找到最新的 Adreno OpenCL SDK 和 Adreno OpenCL 機器學習 SDK。 OpenCL SDK 具有代碼示例和文檔,可幫助開發人員了解和有效使用最新的 Adreno OpenCL 功能。通過一組專有的 API 函數和手動優化的核心,機器學習 SDK 可幫助開發人員将 Adreno GPU 用于機器學習推理和訓練應用程式。

4.3 調試工具和技巧

由于 GPU 執行的并行性質,OpenCL 應用程式的調試通常具有挑戰性。對于核心調試,OpenCL 支援 printf 函數,它類似于 c99 中的标準 printf,隻有一些細微差别。建議通過僅列印必要的變量(使用條件來限制輸出)來減少工作量,因為 printf 通常會減慢代碼執行速度。例如,可以隻啟用有問題的工作組,甚至是單個有問題的工作項(通過在函數 CLEnqueueNDRangeKernel 中設定适當的偏移量)。

了解裝置的軟體版本很重要,因為一些錯誤或問題可能已在較新版本中修複。要查詢軟體(驅動程式)和編譯器版本,開發人員可以使用 API 函數,例如 clGetDeviceInfo 或 clGetPlatformInfo。有關詳細資訊,請參閱參考資料。

調試有關Adreno GPU的提示

  • 在核心中使用 barrier 或 fence 來防止編譯器在它之前/之後重新排序代碼。
  • 如果傳回錯誤代碼,請檢查OpenCL規範以擷取更多資訊。
  • 通過調試一個work item/pixel/workgroup/kernel來隔離問題。
    • 例如設定global_work_size = [1],global_offset為像素坐标[x]。
  • 如果在API函數/核心中觀察到崩潰,請參閱以下幾件事:
    • 無效的記憶體位址。
    • 如果其他API功能有問題。
    • 如果不預期的是記憶體更新。
    • 如果有溢出或記憶體緩沖區大小不正确。
      • 隻嘗試一個像素。
    • 如果核心執行尚未完成。
      • 使用 clFinish/clWaitforEvent 確定核心執行完全的。
    • 如果結果不正确且不穩定。
    • 如果不同的工作項寫入相同的記憶體位址,或者缺少同步或屏障(synchronization or barrier)。

4.4 骁龍分析器(SDP)

Snapdragon 分析器是一款免費的分析工具,可在 Windows、Mac 和 Linux 平台上運作,允許開發人員分析 CPU、GPU、DSP、記憶體、功率、熱、和 Snapdragon 處理器的網絡資料。它支援 OpenCL 和許多圖形 API,例如 OpenGL ES 和 Vulkan。有關更多詳細資訊,請參閱 https://developer.qualcomm.com/software/snapdragon-profiler,其中可下載下傳适用于 Windows、MacOS 和 Linux 的可執行檔案及其使用者指南。在 Snapdragon 分析器中捕獲 OpenCL 應用程式中提供了簡短的 YouTube 視訊介紹。以下是 Snapdragon 分析器為 OpenCL 分析提供的一些關鍵特性。

  • 探查器有一個核心分析器,允許開發人員對給定的核心進行靜态分析。它提供諸如寄存器占用空間和指令數量等資訊,以幫助開發人員優化核心。
  • 探查器為給定的 OpenCL 應用程式提供 OpenCL API 跟蹤和日志。它允許開發人員從 API 級别識别和解決瓶頸,以及調試應用程式。
  • Profiler 提供了 GPU 繁忙率、ALU 使用率、L1/L2 緩存命中率等資訊,這對于開發人員識别核心中的性能問題至關重要。
  • 探查器支援基于指令行的應用程式,以及 Android GUI 應用程式。

    本節簡要介紹如何分析 OpenCL 應用程式。

4.4.1 使用 SDP 的步驟

  1. 将 profiler 與裝置連接配接起來。
    OpenCL 通用程式設計與優化(4)4 Adreno OpenCL 應用開發
  2. 設定OpenCL分析的配置。

    a. 選擇OpenCL布局。

    b. 啟用阻塞必須設定為true。

    c. 選擇新的跟蹤捕獲。

    OpenCL 通用程式設計與優化(4)4 Adreno OpenCL 應用開發
  3. 在指令視窗中啟動 OpenCL 應用程式。

    a. 啟動應用程式的指令視窗中應該會彈出類似于“Pending qxprofiler connection and capture signal…\”的消息,等待下一步。

    OpenCL 通用程式設計與優化(4)4 Adreno OpenCL 應用開發

b. 理想情況下,應該檢測到 OpenCL 應用程式并将其顯示在分析器 GUI 的左側面闆上。

  1. 選擇要配置檔案的名額。
    OpenCL 通用程式設計與優化(4)4 Adreno OpenCL 應用開發

a. 單擊應用程式名稱,然後單擊OpenCL Trace和OpenCL名額出現在左下的面闆。

b. 選擇痕迹和名額進行分析。

  1. 收集結果

    a. 單擊開始捕獲,應用程式應繼續執行直到完成。

    b. API 函數的曆史記錄在主視窗中可用,并且可以放大/縮小。

    c. 分析名額顯示在底部視窗中。

    OpenCL 通用程式設計與優化(4)4 Adreno OpenCL 應用開發

    d. 可以通過單擊捕獲-> 新跟蹤來啟動新的跟蹤會話。

    e. 結果可以導出到 CSV 檔案以供離線分析。

4.4.2 如何解釋來自 SDP 的名額

以下是 OpenCL 應用程式分析的一些關鍵名額。

  • ALU 使用率%。
    • 較低的值可能表示核心可能受記憶體限制。
    • 提高資料加載/存儲的效率。
  • L2 全局緩沖區讀取百分比。
    • 較低的值可能表示 L2 緩存沒有得到很好的使用(可能是緩存抖動)。
    • 平衡工作組的工作量并調整工作組大小。
  • L1命中率。
    • 如果核心不使用圖像對象,它将為 0。
  • GPU 繁忙百分比和空閑百分比。
    • 執行核心時 GPU 應該完全忙碌。
    • 理想情況下,繁忙百分比應接近 100%。
    • 任何低于 90% 的值都應該是一個警告信号,表明主機中存在某些問題,導緻 GPU 在 CPU 忙碌時空閑。
      • 使用基于事件的管道并減少裝置和主機之間的同步。

4.4.3 如何有效使用profiler

  • 識别瓶頸。
    • 如果一個名額和性能沒有提高而其他名額有所提高,則未更改的名額可能是瓶頸。
  • ALU bound vs memory bound vs latency bound:
    • 大多數現實生活中的案例都受限于記憶。
    • 在某些卷積或矩陣乘法情況下,有些可能是 ALU 綁定。
    • 延遲限制意味着可能沒有足夠的波來隐藏延遲
      • 有關如何調整工作組大小的更多資訊,請參閱第 6.1 節。
  • 将計數器的資料與理論值進行比較。
    • 幫助識别緩存抖動:
      • 開發人員可以檢查加載到 GPU 中的資料量。
      • 如果位元組數超過理論上需要的資料,則可能會發生緩存抖動。
    • 開發人員可以設計一些簡單的微基準來幫助了解 GPU 行為。

4.4.4 SDP:靜态代碼分析

OpenCL 通用程式設計與優化(4)4 Adreno OpenCL 應用開發

探查器具有靜态代碼分析器工具,開發人員可以使用該工具來擷取有關核心的基本資訊。以下是一些最重要的。

  • 所有指令。
  • ALU/半ALU/EFU。
  • 緩沖加載/存儲。
    • LDG/STG:全局緩沖區加載/存儲。
    • LDL/STL:本地記憶體加載/存儲。
    • LDP/STP:私有記憶體加載/存儲(這通常表示寄存器溢出)。
  • 全寄存器和半寄存器。
    • 确定波數。
    • 寄存器越多,活躍波越少。
  • 最大波數/最大波數。
    • 如果最大波 <4,則優化核心/降低複雜性。
      OpenCL 通用程式設計與優化(4)4 Adreno OpenCL 應用開發

以下是開發人員應在所有資料中處理的最關鍵問題。

  • 如果有的話,請嘗試删除STP/LDP。
    • 有關更多詳細資訊,請參見第7.1.4節。
  • 優化代碼以減少“總足迹”并增加“波浪數量”。
    • 這些高度相關。
    • 足迹越小,GPU可以并行執行的波浪越多,并且性能越好。

繼續閱讀