• 沒有找到結果。

第三章 OpenCL 優化架構

3.1 開放式計算語言 OpenCL 介紹

NVidia 公司在於 GPGPU 運算很早就提出了 CUDA 架構,整合了 C 語 言共用的程式撰寫架構,目的在於使用該廠牌的顯示卡提供平行運算之功能,

並且這個架構可以轉換提供 OpenCL 使用其核心,並針對此架構下有許多更 先進的設計,然而由於這算是完全屬於 NVidia 的架構,其他廠牌並沒辦法 使用,為了能夠顧各個平台的通用性,我們選擇了 OpenCL 做為實驗的平行

運算架構。

OpenCL(Open Computing Language),是一個跨平台的撰寫程式的框架,

其標準上允許多平台的支援並透過期內建的程式語言來撰寫裝置例如 GPU 與 CPU。OpenCL 本身擁有自己的程式語言,其主要是在選擇 CL 裝置下執 行名為 kernel 端的程式碼,這個程式語言本身的是以 C99 為基底所構成,

邏輯與設計規則幾乎跟 C 語言差沒有太大差別,但還是有一些規定與 C 不 同,除此之外還有提供呼叫與控制的 API 給原本的程式語言使用,其最大 的功能就是能夠做 SIMD(Single Instruction Multiple Data)的平行運算。並藉 由一個低階(low-level)、高效能(high-performance)與可攜式抽象化(portable abstraction)提供嵌入式系統與消費性軟體的高效能解決方案。[2]

由於 OpenCL 是可以跨平台的緣故,所以目前已有許多廠牌的 CPU 及 GPU 支援 OpenCL 的架構設計,然而 CPU 與 GPU 在原先的設計上就已經

有不小的差異,光是在計算機上的位置就會影響到資料傳輸的方式,CPU 可以直接運用主記憶體,在運算上直接以主記憶體為運算目標,經過優化 可以不必浪費資料複製的時間,然而 GPU 可能是因為是外接的設計所以通 常都有自己的獨立記憶體,並且在執行運算前後要把資料從主記憶體到顯 示卡的記憶體之間做轉換,然而通常外接顯示卡可執行的運算單元是高於 CPU 的,也因此擁有計算量大的優勢,而又有另一種架構則是 CPU 與 GPU 做在同一塊晶片上,由於不需要獨立的記憶體,則是選擇直接使用主記憶 體為運算的位置,不但有多運算單元的優點並且也有節省記憶體傳輸問題 的功能,但由於坐在同一塊晶片的原故可能沒辦法把放太多核心,因此距 離外接顯示卡的運算能力還是有一些差距的。

有鑑於此,因為有各種不同的硬體架構,程式上如果想要發揮該裝置的 最佳效能,必須有許多需要去注意的地方,同樣的一段演算法可能經過些 調整可能比較適合某種架構的硬體設計這也是目前使用 OpenCL 一項要克 服的難題。

圖 2. OpenCL Device Architecture Diagram [opencl-1-2-quick-reference-card]

OpenCL 的記憶體分配架構圖如上圖所示,OpenCL 在裝置執行核心 (Kernel)程式時,分成 Global, Constant, Local, Private 四種記憶體,

這類的分類在於 CPU 上使用是沒有特別的意義的因為 CPU 使用的記憶體 都是主記憶體,無法完全透過這些記憶體種類的差異達到優化的效果,而 這些架構設計主要是針對外接顯示卡的設計,顯示卡的設計上記憶體的存 取速度是 Private Memory 最快但是空間最少,並且只有自己單獨的執行緒 續看的到,而 Local Memory 則是速度很快但是比 Private Memory 慢,空間 稍大一點並且是同一個工作群看的到,並且處於分享的狀態,但是工作群 外就看不到,而 Constant Memory 的是宣告為不會被修改類似 C 語言的 const 標籤,他會轉到 Constant Memory 中可以大幅提高記憶體的存取速度達到 Local Memory 速度的效果,而 Global Memory 是所有 memory 中最慢的,

但是他的以讓所有的工作群都共用的資料。

在 SIMD 的平行運算架構中,如果能夠將指令切割的非常乾淨,就會真 的讓同一段程式碼同時運行完成,並且達到最大的運算效能,但是在 OpenCL 中,首先要考慮的是把資料複製到裝置上的記憶體,由其是外接顯 示卡傳輸資料的時間可能會影響到整體程序的效能,因此記憶體傳輸的時 間是首要考慮的課題,當資料量過大的時候也要注意是否能夠在裝置環境 限制下能夠正確分配資料或是壓縮資料容量也是很重要的。

相關文件