cudnn和cuda的关系
CUDA是C语言在GPU编程上的的拓展包,CUDNN是封装了卷积等算子的库,不是一个层面的东西。
这二者的关系,CUDA可以用来实现cudnn定义的各种接口,早期CUDNN应该内部是用CUDA实现的,但随着英伟达软件生态的发展,CUDNN团队一定会选择用更底层,更靠近硬件,更难用的工具来构建Kernel,比如PTX,比如直接写汇编(SASS)。不信的话可以自己试着用CUDA实现CUDNN的接口,看看性能能差多少。当然能把CUDA写好的人想必都了解CUDA的局限。
二者在生态里面的位置。最开始CUDA可以说是英伟达用来打天下的东西,很大程度靠这玩意儿确立了自己在高性能计算尤其是神经网络高性能计算的地位。因为CUDA在暴露硬件特性和保持软件通用性的矛盾中找到了一个精巧的,大多数人都可以接受的平衡。但随着这几年技术的发展,情况又发生了些变化,CUDA还是肩负着软件生态通用性的重任,而高性能的任务,更多地需要由CUDNN,CUBLAS这些高性能软件库来承担。在英伟达的构想中,成熟的算子,比如卷积,比如全联接,用户可以使用库直接获得最优性能,而对于新的算子或者是每个用户独有的算子,用户还是可以用CUDA自己来相对简单地实现一个性能可以接受的版本。最后通过TensorRT,TensorFlow这样的框架把这二者衔接起来。