基於GPU的算法並行化


GPU計算的目的即是計算加速。相比於CPU,其具有以下三個方面的優勢:

l  並行度高:GPU的Core數遠遠多於CPU(如G100 GPU有240個Cores),從而GPU的任務並發度也遠高於CPU;

l  內存帶寬高:GPU的內存系統帶寬幾十倍高於CPU,如CPU (DDR-400)帶寬是3.2GB/秒,而GPU內存系統帶寬可達147.1GB/秒;

l  運行速度快:GPU在浮點運算速度上較之CPU也具有絕對優勢,如對於一般的硬件,CPU(Intel Core 2 Quad Q8200)是 37 GFLOPS,而GPU(nVIDIA Geforce 8800 Ultra(G80-450 GPU))則可達393.6 GFLOPS。

另一方面,GPU采用的SIMD(Single Instruction Multiple Data)架構,這決定了其對執行的任務具有特定的要求(如不適合判斷邏輯過多的任務,數據大小不可控的任務等)。而且,應用程序在GPU上也需有特定的實現,包括算法的GPU並行化,程序的定制等。因此,針對GPU並行處理的研究成為一大研究熱點。

 

目前,CUDA和OpenCL是GPU的兩種最為流行的編程語言。它們在程序邏輯方面相似,主要直觀的區別在於:

l  OpenCL比CUDA靈活度高:CUDA只支持NVIDIA的設備,而OpenCL支持各種類型的協處理器,包括GPU,FPGA等;

l  CUDA較之OpenCL用戶友好性高:CUDA是一個更為高級的抽象,其提供的API更易於使用,而無需編程者對底層設備過多了解;

現有GPU采用SIMD方式執行,即所有線程塊在同一時刻執行相同的程序,從而若這些線程塊處理的數據量相差大,或計算量分布不均,便會帶來線程塊的負載不均,進而影響整個任務執行效率。這類問題實則常見的Skew Handling或Load Inbalance問題。

 

應用算法的GPU並行化之所以成為一個研究問題而不僅僅是工程問題,這其中的主要的問題在於

1)GPU不支持內存的動態分配,從而對於輸出結果大小不確定的任務是一個極大的挑戰;

2)GPU的SIMD特性使得很多算法不易很好實現,即如何充分利用GPU線程塊的並行度;

3)共享數據的競爭讀寫,共享數據的鎖機制帶來大量的等待時間消耗。

 

GPU作為一種協處理器,其的執行受CPU調度。在實際應用中,GPU更多的也是配合CPU工作,從而基於CPU/GPU異構系統的統一任務調度更具實用意義,也是有關GPU的重要研究方面。

 

GPU采用SIMD架構,各線程塊在同一時刻執行相同的Instruction,但對應的是不同的數據。但事實上,GPU線程塊具有如下特征:

n  每個線程塊只對應於一個的流處理器(SM),即其只能被該對應的SM執行,而一個SM可以對應多個線程塊;SM在執行線程塊時,線程塊中的線程以Warp(每32個線程)為單位調度及並行執行;

n  線程塊內的線程可同步,而不同線程塊的同步則只能由CPU調用同步命令完成;

n  不同線程塊的運行相互獨立。

因此,為不同的線程塊分配不同的任務,使得GPU做到任務並行,最大化GPU的利用成為可能並具有重要的研究意義。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM