基於GPU的算法並行化

GPU計算的目的便是計算加速。相比於CPU,其具備如下三個方面的優點:php

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更易於使用,而無需編程者對底層設備過多瞭解;ip

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

 

應用算法的GPU並行化之因此成爲一個研究問題而不單單是工程問題,這其中的主要的問題在於get

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

相關文章
相關標籤/搜索