线程安全:
该库是线程安全的,并且它的函数可以从多个主机线程中调用,只要线程不同时共享同一个cuDNN句柄。
重现性(决定论):
根据设计,在具有相同架构和相同SM数量的GPU上执行时,来自给定版本的cuDNN的大部分例程在运行时会产生相同的按位结果。 然而,不同版本之间的位重复性不能保证,因为给定例程的实现可能会改变。 在当前版本中,以下例程不保证可重复性,因为它们使用原子操作:
- cudnnConvolutionBackwardFilter when
CUDNN_CONVOLUTION_BWD_FILTER_ALGO_0 or
CUDNN_CONVOLUTION_BWD_FILTER_ALGO_3 is used
- cudnnConvolutionBackwardData when
CUDNN_CONVOLUTION_BWD_DATA_ALGO_0 is used - cudnnPoolingBackward when CUDNN_POOLING_MAX is used
- cudnnSpatialTfSamplerBackward
缩放参数alpha和beta:
像cudnnConvolutionForward这样的许多cuDNN例程采用指向缩放因子的指针(在主机内存中),用于将计算值与目标张量中的初始值混合如下:dstValue = alpha [0] computedValue + beta [0] priorDstValue。 当beta [0]为零时,输出不会被读取,并可能包含任何未初始化的数据(包括NaN)。 alpha [0],beta [0]的存储数据类型对于HALF和FLOAT张量为float,对于DOUBLE张量为double。 这些参数使用主机内存指针传递。
为了提高性能,建议使用beta [0] = 0.0。 只有在需要与存储在输出张量中的先前值混合时,才使用β[0]的非零值。
Tensor Core 操作(没volta GPU):
cuDNN v7在支持的GPU SM版本上引入使用Tensor Core硬件加速计算密集型例程。 用户可以通过cudnnMathType_t枚举器利用张量核心加速(使用张量核心操作)。 此枚举器指定张量核心启用的可用选项,并且预计将在每个例程的基础上应用。
使用Tensor Core操作的内核可用于卷积和RNN。
卷积函数是:
- cudnnConvolutionForward
- cudnnConvolutionBackwardData
- cudnnConvolutionBackwardFilter
只有在以下情况下才会在这些路径中触发张量核心操作内核:
- 在适当的卷积描述符设置mathType到CUDNN_TENSOR_OP_MATH时调用cudnnSetConvolutionMathType。
- 使用algo = CUDNN_CONVOLUTION_FWD_ALGO_IMPLICIT_PRECOMP_GEMM或CUDNN_CONVOLUTION_FWD_ALGO_WINOGRAD_NONFUSED调用cudnnConvolutionForward; 使用算法cudnnConvolutionBackwardData = CUDNN_CONVOLUTION_BWD_DATA_ALGO_1或CUDNN_CONVOLUTION_BWD_DATA_ALGO_WINOGRAD_NONFUSED; 和cudnnConvolutionBackwardFilter使用algo = CUDNN_CONVOLUTION_BWD_FILTER_ALGO_1或CUDNN_CONVOLUTION_BWD_FILTER_ALGO_WINOGRAD_NONFUSED。
对于* _ALGO_WINOGRAD_NONFUSED以外的算法,以下是运行Tensor Core操作的一些要求:
- 输入,过滤和输出描述符(如适用,xDesc,yDesc,wDesc,dxDesc,dyDesc和dwDesc)具有dataType = CUDNN_DATA_HALF。
- 输入和输出特征映射的数量是8的倍数。
- 过滤器类型为CUDNN_TENSOR_NCHW或CUDNN_TENSOR_NHWC。 使用CUDNN_TENSOR_NHWC类型的滤波器时,需要将输入,滤波器和输出数据指针(X,Y,W,dX,dY和dW,如适用)对齐到128位边界。
RNN功能是:
- cudnnRNNForwardInference
- cudnnRNNForwardTraining
- cudnnRNNBackwardData
- cudnnRNNBackwardWeights
只有在以下情况下才会在这些路径中触发张量核心操作内核:
- cudnnSetRNNMatrixMathType在适当的RNN描述符设置mathType到CUDNN_TENSOR_OP_MATH上被调用。
- 所有例程都使用algo = CUDNN_RNN_ALGO_STANDARD调用。
- 隐藏状态大小,输入大小和批量大小都是8的倍数。
对于所有情况,CUDNN_TENSOR_OP_MATH枚举器是允许使用张量内核的一个指标,但不是必需的。 cuDNN可能更喜欢不使用张量核心操作(例如,当问题大小不适合Tensor Core加速时),而是使用基于常规浮点操作的替代实现。