OpenCL-1-編程四大模型介紹

原文地址: CoderDock.com

本節介紹OpenCL的四個編程模型。

0.前言

  OPenCL作爲開放性的異構計算的標準,支持的平臺有CPU、GPU、DSP、FPGA。支持的設備如此不同,那麼需要對它們有一個統一的分層、模型劃分,才能讓各家更好的實現--平臺模型、執行模型、內存模型、編程模型。

1.平臺模型

  • OpenCL設備有兩部分組成,宿主機和OpenCL設備
    • 宿主機負責整體流程控制,一般爲CPU。
    • OpenCL設備主要負責數據運算操作。
  • OpenCL設備內部由多個計算單元(CU)組成,每一個CU可以繼續劃分爲處理單元(PU)。
  • 執行流程: 宿主機負責管理所有的OpenCL設備,宿主機發起計算任務,選擇特定的OpenCL設備並建立計算環境。然後將計算任務和數據發送給OPenCL設備。設備調用內部計算單元進行計算,完成後將結果返還給宿主機,該次計算任務結束。

2.執行模型

2.1執行模型概念

  OPenCL是一個主從處理模型,根本是宿主機如何利用OpenCL設備上大量的計算資源進行有效計算。所以OpenCL執行模型的任務就是如何高效地調用這些計算資源

  • 宿主機將每一個處理單元(PE)分配一個索引號,這個唯一的索引號稱爲全局ID(Global ID),全體PE被看做一個工作空間的work-item。
  • 因爲我們可能處理數組、圖形乃至三維圖像,所以對應的工作空間也可以定義爲一維、二維、三維。
  • 爲了更好的處理不同的數據,我們可以將工作空間進行粗粒度的劃分,如將一部分ID劃分到一組,這個組稱爲work-group,每一個組內也可以分配ID,不過這個ID稱爲局部ID(Local ID)。全局ID和局部ID存在映射關係。
  • OpenCL規範中使用一個長度爲N的整數數組來描述工作空間的大小(N<=3)。數組中的數值對應相應維度上工作點的個數。
    • 如果將我們常見的三維魔方想象成一個工作空間,那麼一維即爲紅色的一行,即一維個數爲3,二維爲紅色那個面,二維個數爲9,三維即爲整個工作空間,三維個數爲27。

魔方

2.2上下文

  計算工作主要在OpenCL設備上進行,但宿主機也扮演着非常重要的角色。宿主機主要通過上下文(Context)管理OpenCL設備。上下文指的是所管理硬件和軟件資源,如下所示:

  • 設備:OpenCL程序調用的計算設備
  • 內核:在計算設備上執行的並行程序。
  • 程序對象:內核程序的源代碼(.cl文件)和可執行文件。
  • 內存對象:計算設備執行OpenCL程序所需的變量。
    上下文由宿主機使用API進行創建、管理、銷燬。

2.3命令隊列

  宿主機主要通過命令對相應設備進行控制。根據計算量的大小,計算設備並不能立刻執行完被分配的計算任務。那麼宿主機只能等着計算設備把任務計算完了才能繼續分配新的任務麼?顯然不是,每一個計算設備都會有一個命令隊列。命令隊列只能管理一個計算設備。通過命令隊列,就實現了宿主機和計算設備的異步控制與執行。

  隊列中的命令主要有三種:

  • 啓動命令:OpenCL設備開始執行內核程序。
  • 內存命令:在宿主機與內存設備之間移動數據,或者在兩者之間進行內存映射。
  • 同步命令:約束命令在計算設備上的執行:
    • 亂序執行: 命令按照在命令隊列中的順序進行發射,但不保證計算設備是按照這個順序進行執行的。
    • 有序執行: 命令按照在命令隊列中的順序進行發射和執行,上一條命令執行完成後才能發射下一條命令。

  宿主機程序可以爲一個計算設備創建多個命令隊列--一個計算設備可以有多個命令隊列。這些命令隊列沒有關聯。這也就意味着一個計算設備可以執行多個種類的任務,如小明可以在等待遊戲加載的事件背幾個英語單詞 ~_~。

3.存儲模型

  與通用計算程序的內存對象相似,OpenCL將設備中的存儲器抽象成四層結構的存儲模型:

  • 全局內存:工作空間中的所有節點都可以讀寫。(全局變量)
  • 全局變量:工作空間中的所有節點都可以讀,但不可以寫。(全局常量)
  • 本地內存:同一個工作組中的工作節點可以進行讀寫,對其他工作組不可見。不能通過宿主機進行初始化。(當前文件的全局變量)
  • 私有內存:只屬於工作節點。(函數中的局部變量)

內存模型

在程序運行期間,需要宿主機和計算設備進行數據交換,存在兩種方式:

  • 數據拷貝進行:將需要的數據拷貝到工作組空間,計算完成後再拷貝出去(傳形參)
  • 內存映射:將需要計算數據的地址傳進去(傳指針)

4.編程模型

  前面已經提到計算的時候可以按照兩種模型來進行計算:數據並行和任務並行。

  • 數據並行:將需要計算的數據進行等分,分配給不同的計算設備進行計算。如需要進行兩個很大矩陣的求和運算,那麼就可以將矩陣數據分成幾份,那麼理論上計算事件縮減爲原來的1/N。這適用與數據想關聯不大的計算任務。
  • 任務並行:如計算數據量不大,但每一個步驟前後依賴,如你必須先將水燒開才能下面條,如果你需要不斷的煮麪條,那麼就可以將這個過程分成階段,用好幾個鍋同時進行。具體細節參考工廠的流水線工作模式。

  既然有數據或任務的並行,那麼同步就成爲一個繞不開的節點。並行是指在計算設備執行內核的過程中,對於其他的節點是絕對獨立的,互不影響。OpenCL有三種方式進行同步:

  • 同一個work-group的節點間進行數據同步。
  • 同一個命令隊列中的命令進行同步
  • 同一個上下文中的命令隊列進行同步。
發佈了11 篇原創文章 · 獲贊 3 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章