标签:卷积 convolution gpu cuda cnn
卷积操作的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. 粗粒度和细粒度都是操作级的并行,算法级的并行尚未实现。所谓算法级的并行,是指优化卷积算法本身,将二维卷积转化为其他空间的点乘操作,效率应该更高。
标签:卷积 convolution gpu cuda cnn
原文地址:http://blog.csdn.net/wds555/article/details/44015779