卷積操作的GPU粗粒度並行實現及測試(優化)
A.邊界擴展;
B.字塊對齊。
Matrix Size |
Number |
Kernel |
CPU(s) |
CPU2GPU |
GPU-Kernel |
GPU2CPU |
5x4 |
1 |
5x4 |
<1ms |
<1ms |
<1ms |
<1ms |
12x9 |
1 |
5x4 |
<1ms |
<1ms |
<1ms |
<1ms |
1 |
5x4 |
<1ms |
<1ms |
<1ms |
<1ms |
|
118x29 |
1 |
5x4 |
<1ms |
<1ms |
<1ms |
<1ms |
138x59 |
1 |
5x4 |
<1ms |
<1ms |
<1ms |
<1ms |
158x159 |
1 |
5x4 |
0.005 |
<1ms |
<1ms |
<1ms |
558x559 |
1 |
5x4 |
0.041 |
<1ms |
0.001 |
<1ms |
1128x1159 |
1 |
5x4 |
0.156 |
0.002 |
0.003 |
0.002 |
2128x2159 |
1 |
5x4 |
0.514 |
0.007 |
0.011 |
0.007 |
5128x5159 |
1 |
5x4 |
2.341 |
0.038 |
0.062 |
0.037 |
18128x4159 |
1 |
5x4 |
6.574 |
0.111 |
0.177 |
0.114 |
10128x11159 |
1 |
5x4 |
10.007 |
0.170 |
0.266 |
0.156 |
|
|
|
|
|
17.04Gflps |
1.44GBps |
5x4 |
1 |
14x15 |
~ |
~ |
~ |
~ |
12x9 |
1 |
14x15 |
~ |
~ |
~ |
~ |
18x19 |
1 |
14x15 |
<1ms |
<1ms |
<1ms |
<1ms |
118x29 |
1 |
14x15 |
0.003 |
<1ms |
<1ms |
<1ms |
138x59 |
1 |
14x15 |
0.011 |
0.001 |
<1ms |
<1ms |
158x159 |
1 |
14x15 |
0.028 |
<1ms |
<1ms |
<1ms |
558x559 |
1 |
14x15 |
0.343 |
<1ms |
0.006 |
<1ms |
1128x1159 |
1 |
14x15 |
1.289 |
0.002 |
0.023 |
0.003 |
2128x2159 |
1 |
14x15 |
3.929 |
0.007 |
0.081 |
0.007 |
5128x5159 |
1 |
14x15 |
21.869 |
0.041 |
0.467 |
0.041 |
11128x4159 |
1 |
14x15 |
39.2 |
0.072 |
0.819 |
0.066 |
10128x11159 |
1 |
14x15 |
93.912 |
0.161 |
1.999 |
0.195 |
|
|
|
|
|
23.71Gflps |
372.86MBps |
5x4 |
15 |
14x15 |
~ |
~ |
~ |
~ |
12x9 |
15 |
14x15 |
~ |
~ |
~ |
~ |
18x19 |
15 |
14x15 |
0.001 |
<1ms |
<1ms |
<1ms |
118x29 |
15 |
14x15 |
0.003 |
<1ms |
0.001 |
<1ms |
138x59 |
15 |
14x15 |
0.099 |
0.001 |
0.002 |
<1ms |
158x159 |
15 |
14x15 |
0.367 |
0.001 |
0.006 |
0.001 |
558x559 |
15 |
14x15 |
3.856 |
0.006 |
0.084 |
0.008 |
1128x1159 |
15 |
14x15 |
15.98 |
0.030 |
0.348 |
0.031 |
2128x2159 |
15 |
14x15 |
57.527 |
0.096 |
1.231 |
0.107 |
3058x2659 |
15 |
14x15 |
100.355 |
0.171 |
2.169 |
0.202 |
5128x5159 |
15 |
14x15 |
指針溢出 |
|||
11128x4159 |
15 |
14x15 |
||||
10128x11159 |
15 |
14x15 |
||||
|
|
|
|
|
23.39Gflops |
366.07MBps |
分析:
從上表可知,最高吞吐率爲1.44GBps,PCIE總線的帶寬爲5GBps,還有一定的空間。單精度浮點數乘法的最高有效計算性能爲23.71Gflops,比之前的23.23Gflops有一點點提高,距設備的單精度浮點最高性能仍然差別較大,分析原因如下:
A. CPU傳輸給GPU的數據是一維數組,而在GPU內部是按二維進行運算的,在存取數據是需要做很多的地址計算操作。
B. 線程內部計算單個卷積結果時,使用了一個二維循環,當卷積核較大時,運算時間呈二階指數型增長(最主要原因)。
C. CPU和GPU中數據都是連續存放的,當用malloc()函數申請的內存較大時,使用指針訪問數據時出現內存溢出現象,導致無法測試更大規模的數據量,所以也就無法發揮GPU的運算性能。
D. 進行批處理卷積時,爲了簡化操作,做法是將多幅圖像合成爲一幅較大的圖像,作爲二維圖像,然後一塊兒卷積,在卷積進行中,做了很做的多餘的卷積,在進行結果會寫時,需要排除掉,因此增加了一些分支操作。
總結:
1. 這是卷積的粗粒度並行實現,本週也實現了一個細粒度並行的版本,每個Block有16x16個線程,每個Block對應一個卷積操作,一個線程對應一個乘法運算,每個Block歸約出一個卷積結果。然而,在進行測試時發現,該版本速度較慢。原因可能是,每個Block一個卷積,矩陣和卷積核必須放在全局內存中,訪問全局內存比訪問共享內存慢很多,而且數據的複用性較低,導致效率不高。
2. 批處理卷積,使用三維Block處理時,可以避免多餘的卷積運算和回寫時的條件分支,但是在CPU和GPU中,數據是連續存放的,同時擴充多幅圖像的邊界比較困難,目前尚未找到理想的解決方案。
3. 粗粒度和細粒度都是操作級的並行,算法級的並行尚未實現。所謂算法級的並行,是指優化卷積算法本身,將二維卷積轉化爲其他空間的點乘操作,效率應該更高。