• 沒有找到結果。

第三章 OpenCL 優化架構

3.3 OpenCL 優化方針

在 CUDA 中的優化方針主要因應記憶體的部分,OpenCL 在許多設計架構下 都與 CUDA 類似,但近期的 CUDA 已經在硬體上的設計試圖去改善記憶體使用 的問題,這部分 OpenCL 不見得能夠完全使用 CUDA 最新的架構,為了配合各 種平台的限制通常設計上會採取有多種選擇的方法提供各廠商製造運算單元使 用。

以下這些都是主要介紹 OpenCL 以及如何優化的一些方法,當然其中最重要 的還是演算法本身的設計,雖然不是每種方法都是完全適用,但是只要可以找出 幾種正確的方法還是有許多改善程式效能的空間。

3.3.1 通用性優化方針

不論是 CPU 或是 CPU 都可以有一些通用的方式去加快其執行的效能,

其中主要有幾個方法,首先就是要減少記憶體的複製,由於 OpenCL 核心程 式需要把資訊傳到核心執行,並且之後還要把資料回傳回來,這部分常常佔 有不少時間,甚至可能比 kernel 運算還要久,所以最小化記憶體的需求是在 設計程式時需要仔細考慮的部分。

其次避免使用太多的同步功能,在 OpenCL 中,可以針對所有的核心程 式進行同步,同步在此指的是要等待其他的 kernel 執行到某一行之後才會做 之後的程式,在資料有相依性的情況時,要使用這個指令避免程序先後的影 響導致資料處理錯誤,然而等待等於是讓已經完成的核心空閒不處理資料,

如果使用太頻繁會導致平行運算速度降低[5.]。

另外一些技巧則是 OpenCL 內有許多已經進行優化過的 build-in

Functions, 可處理一些常見的運算。還有就是減少分支的數量(if 的數量),

因為在類似的指令常常會統整起來一併處理,如果是一個沒有分支的程式就 會依序逐行執行會快速很多。

Use Host Pointer 在 CPU 或是 On-Chip 的 GPU 因為使用與主記憶體相 同的 memory,可以使用該方式降低資料傳輸的成本,而外接顯示卡(NVidia) 則可以使用像是 pinned-memory 來達到相同的效果[8.]。

3.3.2 CPU 優化架構

Intel 在 CPU 方面也是可以支援 OpenCL,然而因為使用主記憶體所以 GPU 方面的優化方法是沒有效果的,轉而要從其設計的指令集提供的功能,

其中 Intel® Streaming SIMD Extensions (Intel® SSE) 和 Intel® Advanced Vector Extensions (Intel® AVX) instructions 的架構能夠將類似型態的資料自 動處理群組排程並由單一指令去處理多筆資料[6.],這樣儘管核心處理器數 量沒有 GPU 多,但是單一 CPU 可以做的事情也就更多了。

而在於程式碼撰寫方面其實該設計已經有 Implicit Vectorization,就是在 於不加任何標籤下自動完成指令的群組處理,然而有時候因為演算法的原故 該方法不見得會是最好的處理辦法,因此也可以在程式碼內調整標籤減少隱 含的 Vectorization[5.],這部分就是可能需要去研究調整的部分。

而 OpenCL 有設計一種 Vector Data Types,像是 int2,int3,int4,float2,

float4 等等。。。。。在於 GPU 的設計架構下只是為了方便一些多維元素的 運算的設計並沒有特別針對其優化,然而在 CPU 中則會套用上述功能讓單 一指令執行整個 Vector Data 的運算。因此如果要使用 CPU 版本的設計就要 多使用這些架構來加速程式的運行。

3.3.3 GPU 優化架構

解決完 host 端到 kernel 的傳輸問題後,之後要考慮的就是每個執行緒 的存取資料是不是獨立的,當所有執行緒都要存取同一筆資料時,就會有 等待的效應,雖然現在 GPU 設計(NVidia)有針對這種等待處理做自動跳至 另一筆資料避免存取相同的等待問題[7.],但是這部分還是能夠避免少去存 取相同的位置為最好的方式,因此可以使用的就是 Local Memory 與 Constant Memory 的方式,把一些資料複製至各個工作群的 Local Memory 就可以達到減少相同記憶體位置的存取次數,而把一些不會被改變的資料 使用 Constant Memory 也可以達到讀取速度的有效提升,這些有效的優化 方法主要適用於 GPU 為主,但是在以主記憶體執行的 CPU 則是效果沒有 這麼顯著。

相關文件