CUDNN入坑指南(0)卷积算法实现类型

CUDNN入坑指南(0)卷积算法实现类型,第1张

cuDNN目前提供以下几种卷积算法的实现方式 [1]

该实现方式将卷积隐式转换成矩阵乘法,完成计算。不需要显式将输入张量数据转换成矩阵形式保存。

该实现方式将卷积隐式转换成矩阵乘法,完成计算。但是需要一些额外的内存空间去保存预计算得到的索引值,以便隐式地将输入张量数据转换成矩阵形式。

该实现方式将卷积显式转换成矩阵乘法,完成计算。在显式完成矩阵乘法过程中,需要额外申请内存空间,将输入转换成矩阵形式。

该实现方式即直接完成卷积计算,不会隐式或显式的将卷积转换成矩阵乘法。

该实现方式利用快速傅里叶变换完成卷积计算。需要额外申请内存空间,保存中间结果。

该实现方式利用快速傅里叶变换完成卷积计算,但是需要对输入进行分块。同样需要额外申请内存空间,保存中间结果,但是对大尺寸的输入,所需内存空间小于 CUDNN_CONVOLUTION_FWD_ALGO_FFT 算法

该实现方式利用Winograd变换完成卷积计算。需要额外申请内存空间,保存中间结果。

该实现方式利用Winograd变换完成卷积计算。需要额外申请内存空间,保存中间结果。

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


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zz/10904587.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-12
下一篇2023-05-12

发表评论

登录后才能评论

评论列表(0条)

    保存