1. 程式人生 > >OpenCL-1-編程四大模型介紹

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

fpga 存在 一個 不可 魔方 開放 ron pic -i

本節介紹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的節點間進行數據同步。
  • 同一個命令隊列中的命令進行同步
  • 同一個上下文中的命令隊列進行同步。

版權聲明:本文為博主原創文章,轉載需聲明為轉載內容並添加原文地址。

更多博主原創文章,請移步:

原文地址:http://coderdock.com

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