CUDA GPU程序优化要点 - 如何做到又好又快

CUDA GPU程序优化要点 - 如何做到又好又快

         相比使用CPU进行计算,使用GPU加速往往可能得到数倍数十倍的性能提升,而使用CUDA C编程时,编程风格和细节往往会对程序性能造成很大的影响。下面列举了一些本人总结的优化CUDA GPU程序的一些要点,欢迎批评和补充。

 

1,  尽量避免bank conflict,合理使用shared memory。

2,  尽量避免warp divergence

3,  精度满足的情况用单精度浮点数float。浮点数整数部分越大,小数部分精度越低。在看重数据的相对大小而不是绝对大小时,可以在运算中减去常数偏置缩小整数部分,以提高精度

4,  代码中单精度浮点数常数后缀一定要有f。如100.0f,3.1415926f。

5,  除法变乘法,避免重复计算。

6,  精度满足的情况下使用Intrinsic Functions而不是Standard Functions,如__expf,__logf,__sinf等。Intrinsic Functions精度比Standard Functions稍低,但也低不了哪去。最好是在自变量范围内产生一组数据比较两者的精度,看是否满足。我曾比较 __logf和logf精度往往只有10^-6左右的差别,但是速度有几倍的提升。

7,  循环展开或部分展开手写,如果一个很长的循环内部只有一点很简单的运算,则循环导致的控制开销可能比内部的计算还要大。

8,  优化线程块内的线程数量,最好是32的整倍数,并不是越大越好,往往32、64足矣。

9,  使用流,实现CPU与GPU并发、流水线处理,同时减少传输时间消耗

10,  Host端使用page-locked memory,而不是直接new一个。


 

推荐书籍:

1,  入门:cuda by example,有中文版

2,  深入:Professional CUDA C Programming

 

Luchang Li

2015.12.10 in HUST

 


你可能感兴趣的:(C++)