GPGPU OpenCL/CUDA 高效能編程的10大注意事項

來源:互聯網
上載者:User

1.展開迴圈

如果提前知道了迴圈的次數,可以進行迴圈展開,這樣省去了迴圈條件的比較次數。但是同時也不能使得kernel代碼太大。

迴圈展開代碼例子:

#include<iostream>using namespace std;    int main(){    int sum=0;    for(int i=1;i<=100;i++){        sum+=i;    }        sum=0;    for(int i=1;i<=100;i=i+5){        sum+=i;        sum+=i+1;        sum+=i+2;        sum+=i+3;        sum+=i+4;    }    return 0;}

2.避免處理非標準化數字

OpenCL中非標準化數字,是指數值小於最小能表示的正常值。由於電腦的位元有限,表示資料的範圍和精度都不可能是無限的。(具體可以查看IEEE 754標準,http://zh.wikipedia.org/zh-cn/IEEE_754)

在OpenCL中使用非標準化數字,可能會出現“除0操作”,處理很耗時間。

如果在kernel中“除0”操作影響不大的話,可以在編譯選項中加入-cl-denorms-are-zero,如:

clBuildProgram(program, 0, NULL, "-cl-denorms-are-zero", NULL, NULL);

3.通過編譯器選項傳輸常量基本類型資料到kernel,而不是使用private memory

如果程式中需要給kernel 傳輸常量基本類型資料,最好是使用編譯器選項,比如宏定義。而不是,每個work-item都定義一個private memory變數。這樣編譯器在編譯時間,會直接進行變數替換,不會定義新的變數,節省空間的。

如下面代碼所示(Dmacro.cpp):

#include<stdio.h>int main(){    int a=SIZE;    printf("a=%d, SIZE=%d\n",a,SIZE);    return 0;}

編譯:

g++ -DSIZE=128 -o A Dmacro.cpp

4.如果共用不重要的話,儲存一部分變數在private memory而不是local memory

work-item訪問private memory速度快於local memory,因此可以把一部分變數資料儲存在private memory中。當然,當private memory容量滿時,GPU硬體會自動將資料轉存到local memory中。

5.訪問local memory應避免bank conflicts

local memory被組織為一個一個的只能被單獨訪問的bank,bank之間交叉儲存資料,以便連續的32bit被儲存在連續的bank中。如下圖所示:

(1)如果多個work-item訪問連續的local memory資料,他們就能最大限度的實現並行讀寫。

(2)如果多個work-item訪問同一個bank中的資料,他們就必須順序執行,嚴重降低資料讀取的並行性。因此,要合理安排資料在local memory中的布局。

(3)特殊情況,如果一個wave/warp中的線程同時讀取一個local memory中的一個地址,這時將進行廣播,不屬於bank 衝突。

更多精彩內容:http://www.bianceng.cnhttp://www.bianceng.cn/Programming/cplus/

相關文章

E-Commerce Solutions

Leverage the same tools powering the Alibaba Ecosystem

Learn more >

Apsara Conference 2019

The Rise of Data Intelligence, September 25th - 27th, Hangzhou, China

Learn more >

Alibaba Cloud Free Trial

Learn and experience the power of Alibaba Cloud with a free trial worth $300-1200 USD

Learn more >

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。