gpu編程優化

近幾年比較火的一個東西就是大規模、大數據等概念了。用到的工具除了hadoop等分佈式平臺外,還有一種是gpu,前者更多是用來做真正大規模的數據吧,比如大規模的網絡數據的,但是如果數據是圖像數據的話,可以用gpu來做。


gpu卡是由很多個處理單位組成,每個處理單元就像cpu cores一樣,這個單元叫SM,不同的gpu卡有不同的SM版本。每個SM均像一個多核的cpu一樣,有存儲和寄存器以及計算單元。每個SM內部可以同時並行多個threads,這些threads同時執行,爲高速計算提供了可能。同時,在計算單位和存儲單位之間的帶寬也是GPU卡的一個重要指標,在寫GPU代碼時,要做到優化,除了並行之外,需要考慮到存儲器和寄存器的使用這些信息。


簡單地說,向量加法,向量程度爲N。我們可以開N個線程,每個線程均完成一個元素的加操作。這樣一個向量加法,實現了多線程。再複雜點,矩陣乘法,兩個矩陣A,B相乘的C,A的行和B的列相乘,這樣我們可以開N個線程,每次完成C矩陣一個元素的計算,這樣從一定程度上降低了計算量。但是,每個元素計算,均需要同時加載A元素的一行和B元素的一列,而另外一個元素計算可能會又加載了一次A的該行或者B的該列,這樣造成了資源的浪費和計算單元與存儲單元的頻繁通訊。爲此,提出了分塊矩陣乘法,將矩陣A,B分塊讀取,然後計算該塊對應C的幾個元素,分塊的大小直接決定了計算量的大小。分塊大了,每次同時可以計算的C元素數據就多了,但是存儲量也大了。因此,在存儲和寄存器等允許的情況下,可以分塊越大越好。其實,此時每個線程也是一次只計算一個元素。但是,因爲一次性加載一塊的A,B元素到共享存儲了,共享存儲的訪問速度比全局存儲速度快多了,因此,這樣計算也快多了。


同時,提高計算速度的一個方法,也可以是,一個線程同時輸出多個元素。這種方式能夠在很大程度上提高並行能力。


另外,還有在圖像處理中常用的是卷積等操作。卷積一般是個常量,因此,一般可以將卷積放在常量存儲上,提高數據訪問速度。卷積的並行稍微比矩陣乘法複雜些,但是基本思路也是大概差不多的。


所以,在做GPU優化之前,一定要弄明白的概念是GPU的硬件結構,否則談優化只會隔靴搔癢。

因此,學習GPU的順序: 瞭解GPU的硬件結構,瞭解線程各種存儲,瞭解block,threads之間的劃分,而後思考如何利用這些硬件和軟件之間的關係進行優化。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章