卷积操作的GPU粗粒度并行实现及测试(优化)

来源:互联网 发布:淘宝产品拍照 编辑:程序博客网 时间:2024/06/05 19:40

卷积操作的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

18x19

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

0 0
原创粉丝点击