当前位置: 华文问答 > 数码

CUDA 的包比自己写的 Kernel 快 10~20 倍,有什么内在机制呢?

2020-01-11数码

内在机制是CUDA编程真的很难…难到你必须精通GPU硬件架构才能写出合格的GPGPU程序。

首先从题主的描述"这玩意一共不到20行的算法"来看很可能算法级别就没有为GPU优化。FFT的GPU优化研究没有其他算法那么多,但随便Google一下还是有很多论文可以参考的。FFT的优化我没怎么研究过,再加上一些优化方法是针对特定workload的,这个层面就不多说了。

其次,抛开具体算法,所有的性能优化都要基于性能分析(profiling)。先跑一下nvprof或者Nsight Compute,看看性能瓶颈在哪。对于没有优化过的GPGPU程序,大概率在于memory bound。一般策略是看看有没有局部可以重用的数据,开一片shared memory然后做loop tiling来避免多余的global memory 读写从而提高局部性。然后再跑profiling看看性能有没有达到理论峰值,如果没有就看看新的瓶颈在哪。有可能是访存模式导致shared memory bank conflict,也有可能是shared memory用太多导致occupancy 下降而没有足够的线程来隐藏指令延迟。然后进一步针对优化访存模式或者考虑用warp intrinsic在寄存器中交换线程间数据等等。然后再跑profiling,周而复始,最终达到一个满意的结果。当然GPGPU的优化方法还很多,这里只是举一个简单的例子来说明基于profiling优化的流程。

最后我想多说一点,坊(zhi)间(hu)流传NVIDIA在官方库里用了很多「黑魔法」(比如内部版本的编译器)导致外部用户怎么优化CUDA代码也不能达到官方库的性能。其实这点大家完全不必担心,即使是最黑魔法的cuBlas库(用手工SASS汇编优化)纯CUDA重写的CUTLASS也能把性能差距追平甚至超越。NVIDIA工程师比普通用户多的只是经验和手里的显卡。再者,NVIDIA的官方库必须照顾所有使用场景,而用户完全有可能针对自己的场景做特定优化来超越官方库性能。

最最后,不要用PTX「汇编优化」,没用。