第二章 相關文獻探討
2.4 OpenCL
1.簡介
圖 2.4.1 OpenCL 整合異構平台 圖片引用(8)
OpenCL[5]是一個為異構平台編寫程式的框架,可以幫助程式撰寫者利用 CPU 或是 GPU 裝置來進行平行計算,其提供了基於任務分割和資料分割的這兩 種平行計算機制,程式撰寫者可以依據需求來使用,在使用時必須編寫在 OpenCL 裝置上執行的函式,稱之為內核(kernel),然後由 excution uint(EU)上的 Single
Instruction Multiple Data(SIMD)來執行,其內容是一個基於 C99 所構成的語言,大 部分使用起來和撰寫 C 程式語言差不多,少部分的函式可能要看各家廠商的支援 與定義,此外 kernel 所需要用到的運算資料,在 OpenCL 1.2 之前都必須從 Host 端 map 到 Device 端才能使用。
圖 2.4.2 Host 端與 Device 端架構 圖片引用(8)
OpenCL 平台的由一個 Host 端再加上數個 Device 端組成,平台底下可以選 擇要使用在 CPU 或 GPU 上的 Device 進行平行運算,這些 Device 有: CPU 的運算 單元、CPU 中的圖形處理單元(內顯)、外接顯示卡(外顯),另外 OpenCL 也提供一 個實驗性的平台供 OpenCL2.0 以上的版本來使用,但目前只能在特定 CPU 上的
Device 上使用。
圖 2.4.3 使用 Code Builder 分析工具列出 OpenCL 資訊
2. OpenCL 工作單元介紹
圖 2.4.4 OpenCL 工作單元架構 圖片引用(8)
(1)Work-item:
最小且最基本的工作單位,在進行平行計算時,每個 Work-item 都會去執行
kernel 中的程式碼,這個動作可以由一個或多個處理元件執行。
(2)Work-group:
數個 Work-item 會組成一個 Work-group,Work-group 中的 Work-item 可以由 系統指定或是由使用者定義,但要注意的事:雖然可以自行定義數量大小,但每個 硬體設備的運算資源都會有上限,因此給定的數量過大,超過時硬體設備的上限 時,同步執行的 Work-item 數量就可能會停在一個上限的定值,並不會讓運算效 能無限的增長,此外,OpenCL 運行時,可以同步執行一個以上的 Work-group,
但會受限於記憶體大小,同步執行的 Work-group 數量上也有限制。
(3)NDRange:
所有的 Work-group 所形成的集合,是全部的工作數量,最多可以由 X、Y、
Z 三個維度組成。
3.OpenCL 記憶體階層與工作單元
圖 2.4.5 OpenCL 記憶體架構 圖片引用(8)
此處先簡介 OpenCL 記憶體與工作單元之間的關係,之後在詳盡介紹各個記 憶體的特性和細節,OpenCL 中的記憶體有四種:私有記憶體(Private memory)、區 域共享記憶體(Local memory)、全域記憶體(Global memory)、唯讀記憶體(Constant memory)。
私有記憶體:每個 Work-item 獨自擁有的記憶體空間,相當於暫存器,容量為最小 的。
區域共享記憶體: 在同一個 Work-group 共同分享的記憶體空間,行為類似電腦中 的 cache 功能。
全域記憶體:所有的 Work-group 與 Work-item 都可以讀取其內容的記憶體,雖然 容量為最大,但速度相較於私有記憶體與區域共享記憶體來的慢,若要重複讀取 資料不建議使用這個記憶體。
唯讀記憶體:一塊只能被讀取的記憶體空間,資料寫入以後就不能作修改,通常被 硬體實作在全域記憶體中,速度比全域記憶體稍微快些。
圖 2.4.6 OpenCL 資料移動途徑 圖片引用(9)