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