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的利用成為可能並具有重要的研究意義。
