卷积操作的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. 粗粒度和细粒度都是操作级的并行,算法级的并行尚未实现。所谓算法级的并行,是指优化卷积算法本身,将二维卷积转化为其他空间的点乘操作,效率应该更高。