4. mcdnn_cnn_infer
此实体包含在推理时需要用到的卷积神经网络相关的所有函数。mcdnn_cnn_infer库依赖于mcdnn_ops_infer。 有关后端数据和描述符类型,请参见mcdnn_backend。
4.1. 数据类型参考
4.1.1. 不透明结构类型的指针
4.1.1.1. mcdnnConvolutionDescriptor_t
mcdnnConvolutionDescriptor_t是指向不透明结构的指针,该结构包含卷积操作的说明。mcdnnCreateConvolutionDescriptor()用于创建实例,且必须用mcdnnSetConvolutionNdDescriptor()或mcdnnSetConvolution2dDescriptor()来初始化此实例。
4.1.2. 结构类型
4.1.2.1. mcdnnConvolutionBwdDataAlgoPerf_t
mcdnnConvolutionBwdDataAlgorithm_t是一个结构,包含由mcdnnFindConvolutionBackwardDataAlgorithm()返回的执行结果或由mcdnnGetConvolutionBackwardDataAlgorithm_v7()返回的启发式结果(heuristic results)。
数据成员(Data Members)
mcdnnConvolutionBwdDataAlgo_t algo
运行该算法以获取相关的性能指标。
mcdnnStatus_t status
如果在调用mcdnnConvolutionBackwardData()或工作空间分配期间发生任何错误,此状态将表示该错误。否则,此状态将是mcdnnConvolutionBackwardData()的返回状态。
MCDNN_STATUS_ALLOC_FAILED 如果工作空间分配期间发生任何错误或提供的工作空间不足。
MCDNN_STATUS_INTERNAL_ERROR 如果计算期间或工作空间释放期间出现任何错误。
否则,此状态将是mcdnnConvolutionBackwardData()的返回状态。
float time
mcdnnConvolutionBackwardData()的执行时间(以毫秒为单位)。
size_t memory
workspace大小(以字节为单位)。
mcdnnDeterminism_t determinism
算法的确定性。
mcdnnMathType_t mathType
提供给算法的数学类型。
int reserved[3]
为后续属性预留的空间。
4.1.2.2. mcdnnConvolutionFwdAlgoPerf_t
mcdnnConvolutionFwdAlgoPerf_t是一个结构,包含由mcdnnFindConvolutionForwardAlgorithm()返回的执行结果或由mcdnnGetConvolutionForwardAlgorithm_v7()返回的启发式结果。
数据成员(Data Members)
mcdnnConvolutionFwdAlgo_t algo
运行该算法以获取相关的性能指标。
mcdnnStatus_t status
如果在调用mcdnnConvolutionForward()或工作空间分配期间发生任何错误,此状态将表示该错误。否则,此状态将是mcdnnConvolutionForward()的返回状态。
MCDNN_STATUS_ALLOC_FAILED 如果工作空间分配期间发生任何错误或提供的工作空间不足。
MCDNN_STATUS_INTERNAL_ERROR 如果计算期间或工作空间释放期间出现任何错误。
否则,此状态将是mcdnnConvolutionForward()的返回状态。
float time
mcdnnConvolutionForward()的执行时间(以毫秒为单位)。
size_t memory
workspace大小(以字节为单位)。
mcdnnDeterminism_t determinism
算法的确定性。
mcdnnMathType_t mathType
提供给算法的数学类型。
int reserved[3]
为后续属性预留的空间。
4.1.3. 枚举类型
4.1.3.1. mcdnnConvolutionBwdDataAlgo_t
mcdnnConvolutionBwdDataAlgo_t是一种枚举类型,暴露可用于执行反向数据卷积操作的不同算法。
值
MCDNN_CONVOLUTION_BWD_DATA_ALGO_1
该算法将卷积表示为矩阵乘积,但实际上并未显式形成包含输入张量数据的矩阵。结果具有确定性。
MCDNN_CONVOLUTION_BWD_DATA_ALGO_FFT_TILING
该算法使用快速傅立叶变换(Fast-Fourier Transform,FFT)方法,但将输入拆分为分块(tile)。
4.1.3.2. mcdnnConvolutionBwdFilterAlgo_t
mcdnnConvolutionBwdFilterAlgo_t是一种枚举类型,暴露可用于执行反向卷积核卷积操作的不同算法。
值
MCDNN_CONVOLUTION_BWD_FILTER_ALGO_1
该算法将卷积表示为矩阵乘积,但实际上并未显式形成包含输入张量数据的矩阵。结果具有确定性。
MCDNN_CONVOLUTION_BWD_FILTER_ALGO_FFT_TILING
该算法使用快速傅立叶变换方法计算卷积,但将输入张量拆分为分块(tile)。可能需要一个足够大的workspace来存储中间结果。结果具有确定性。
4.1.3.3. mcdnnConvolutionFwdAlgo_t
mcdnnConvolutionFwdAlgo_t是一种枚举类型,暴露可用于执行正向卷积操作的不同算法。
值
MCDNN_CONVOLUTION_FWD_ALGO_IMPLICIT_PRECOMP_GEMM
该算法将卷积表示为矩阵乘积,实际上没有显式形成包含输入张量数据的矩阵,但仍需要一些内存工作空间来预计算某些索引,以促成包含输入张量数据的隐式矩阵构造。
MCDNN_CONVOLUTION_FWD_ALGO_FFT_TILING
该算法使用快速傅立叶变换(Fast-Fourier Transform,FFT)方法,但将输入拆分为分块(tile)。
4.1.3.4. mcdnnConvolutionMode_t
mcdnnConvolutionMode_t是一种枚举类型,用于mcdnnSetConvolution2dDescriptor()配置卷积描述符。用于卷积的卷积核可以用两种不同的方式应用,在数学上对应于卷积或交叉相关(cross-correlation)。 (交叉相关相当于卷积核旋转180度的卷积。)
值
MCDNN_CONVOLUTION
在此模式下,将卷积核应用于图像时,将执行卷积操作。
MCDNN_CROSS_CORRELATION
在此模式下,将卷积核应用于图像时,将执行交叉相关操作。
4.1.3.5. mcdnnReorderType_t
mcdnnReorderType_t是一种枚举类型,用于设置卷积重排序类型。重排序类型可以由mcdnnSetConvolutionReorderType()设置,其状态可以由mcdnnGetConvolutionReorderType()读取。
typedef enum {
MCDNN_DEFAULT_REORDER = 0,
MCDNN_NO_REORDER = 1,
} mcdnnReorderType_t;
4.2. API References
4.2.1. API Functions
4.2.1.1. mcdnnCnnInferVersionCheck()
此函数检查库的CnnInfer子集的版本是否与其他子库一致。
mcdnnStatus_t mcdnnCnnInferVersionCheck(void)
返回值
MCDNN_STATUS_SUCCESS
版本与其他子库一致。
MCDNN_STATUS_VERSION_MISMATCH
CnnInfer的版本与其他子库不一致。用户应检查并确保所有子组件安装版本一致。
4.2.1.2. mcdnnConvolutionBackwardData()
该函数计算张量dy的卷积数据梯度,其中y是mcdnnConvolutionForward()中正向卷积的输出。它使用指定的算法,并在输出张量dx中返回结果。缩放系数alpha和beta可用于缩放计算结果或dx张量。
mcdnnStatus_t mcdnnConvolutionBackwardData(
mcdnnHandle_t handle,
const void *alpha,
const mcdnnFilterDescriptor_t wDesc,
const void *w,
const mcdnnTensorDescriptor_t dyDesc,
const void *dy,
const mcdnnConvolutionDescriptor_t convDesc,
mcdnnConvolutionBwdDataAlgo_t algo,
void *workSpace,
size_t workSpaceSizeInByte,
const void *bet,
const mcdnnTensorDescriptor_t dxDesc,
void *dx)
参数
handle
输入。已创建的mcDNN上下文的句柄。更多信息,参见mcdnnHandle_t。
alpha, beta
输入。指向缩放系数(主机内存中)的指针,用于将计算结果与输出层中的先验值混合,如下所示:
dstValue = alpha[0] * result + beta[0] * priorDstValue
wDesc
输入。已初始化的卷积核描述符的句柄。更多信息,参见mcdnnFilterDescriptor_t。
w
输入。数据指针,指向与卷积核描述符wDesc关联的GPU内存。
dyDesc
输入。已初始化的输入差分张量描述符的句柄。更多信息,参见mcdnnTensorDescriptor_t。
dy
输入。数据指针,指向与输入差分张量描述符dyDesc关联的GPU内存。
convDesc
输入。已初始化的卷积描述符。更多信息,参见mcdnnConvolutionDescriptor_t。
algo
输入。指定应使用哪个反向数据卷积算法来计算结果的枚举。更多信息,参见mcdnnConvolutionBwdDataAlgo_t。
workSpace
输入。数据指针,指向执行指定算法所需的工作空间GPU内存。如果特定算法不需要工作空间,则该指针可以为nil。
workSpaceSizeInBytes
输入。指定已提供的workSpace大小(以字节为单位)。
dxDesc
输入。已初始化的输出张量描述符的句柄。
dx
输入/输出。数据指针,指向与dxDesc输出张量描述符(携带结果)关联的GPU内存。
返回值
MCDNN_STATUS_SUCCESS
操作成功启动。
MCDNN_STATUS_BAD_PARAM
需至少满足以下任一条件:
以下至少有一个为NULL:handle、dyDesc、wDesc、convDesc、dxDesc、dy、w、 dx、alpha、beta
wDesc和dyDesc的维数不匹配
wDesc和dxDesc的维数不匹配
wDesc的维数小于3
wDesc、dxDesc和dyDesc的数据类型不匹配。
wDesc和dxDesc每个图像(或分组卷积情况下的组)的输入特征图数不匹配。
dyDesc空间大小与mcdnnGetConvolutionNdForwardOutputDim中设定的大小不匹配
MCDNN_STATUS_NOT_SUPPORTED
需至少满足以下任一条件:
dyDesc或dxDesc具有负张量步幅
dyDesc,wDesc或dxDesc的维数不是4或5
所选algo不支持提供的参数;有关每个algo支持的参数,参见以下详尽列表
dyDesc或wDesc表示输出通道计数,其不是组计数的倍数(如果在convDesc中设置了组计数)。
MCDNN_STATUS_MAPPING_ERROR
在纹理对象(texture object)创建的纹理绑定过程中发生错误,该纹理对象与卷积核数据或输入差分张量数据相关联。
MCDNN_STATUS_EXECUTION_FAILED
此函数在GPU上启用失败。
支持的mcdnnConvolutionBackwardData()配置
数据类型 配置 |
|
|
|---|---|---|
|
|
|
|
|
|
|
MCDNN_DATA_BFLOAT16 |
|
|
|
|
|
|
|
支持的算法
MCDNN_CONVOLUTION_BWD_DATA_ALGO_1 (_ALGO_1)
MCDNN_CONVOLUTION_BWD_DATA_ALGO_FFT_TILING (_FFT_TILING)
MCDNN_TENSOR_NCHW (_NCHW)
MCDNN_TENSOR_NHWC (_NHWC)
MCDNN_TENSOR_NCHW_VECT_C (_NCHW_VECT_C)
mcdnnConvolutionBackwardData() 2D卷积支持的算法:wDesc:_NHWC
算法名称 |
确定性 (Yes or No) |
dyDesc 支持的张量 格式 |
dxDesc 支持的张量 格式 |
支持的 数据类型 配置 |
重要 |
|---|---|---|---|---|---|
|
NHWC HWC-packed |
NHWC HWC-packed |
|
mcdnnConvolutionBackwardData() 2D卷积支持的算法:wDesc:_NCHW
算法名称 |
确定性 (Yes or No) |
dyDesc 支持的张量 格式 |
dxDesc 支持的张量 格式 |
支持的 数据类型 配置 |
重要 |
|---|---|---|---|---|---|
|
Yes |
NCHW CHW-packed |
除 _NCHW_ VECT_C 之外的所有 其他格式 |
|
所有维度 大于0 convDesc 组计数支 持:大于0 |
|
Yes |
NCHW CHW-packed |
NCHW HW-packed |
当任务可以 由1D FFT处 理时,也支 持 DOUBLE _CONFIG, 即卷积核 宽度或高度 为1 |
1适用于所有 维度
当 当 当卷积核宽度 或高度为1时, convDesc 垂直与水平 卷积核步幅 必须为1; 否则,步幅 可以为1或2
|
mcdnnConvolutionBackwardData() 3D卷积支持的算法:wDesc:_NCHW
算法名称 |
确定性 (Yes or No) |
dyDesc 支持的张量 格式 |
dxDesc 支持的张量 格式 |
支持的 数据类型 配置 |
重要 |
|---|---|---|---|---|---|
|
Yes |
NCDHW CDHW-packed |
NCDHW CDHW- packed |
|
1适用于 所有维度 convDesc 组计数支持 :大于0 |
|
Yes |
NCDHW CDHW-packed |
NCDHW DHW-packed |
|
1适用于 所有维度 convDesc 组 计数支持: 大于0
convDesc 所有卷积核 步幅为1
|
mcdnnConvolutionBackwardData() 3D卷积支持的算法:wDesc:_NHWC
算法名称 |
确定性 (Yes or No) |
dyDesc 支持的张量 格式 |
dxDesc 支持的张量 格式 |
支持的 数据类型 配置 |
重要 |
|---|---|---|---|---|---|
|
Yes |
NDHWC DHWC- packed |
NDHWC DHWC- packed |
|
所有维度 大于0 convDesc 组 计数支持: 大于0 |
4.2.1.3. mcdnnConvolutionBiasActivationForward()
该函数对mcdnnConvolutionForward()的卷积或交叉相关操作,应用bias然后再应用激活,以y返回结果。完整计算遵循公式:y = act ( alpha1 * conv(x) + alpha2 * z + bias )。
mcdnnStatus_t mcdnnConvolutionBiasActivationForward(
mcdnnHandle_t handle,
const void *alpha1,
const mcdnnTensorDescriptor_t xDesc,
const void *x,
const mcdnnFilterDescriptor_t wDesc,
const void *w,
const mcdnnConvolutionDescriptor_t convDesc,
mcdnnConvolutionFwdAlgo_t algo,
void *workSpace,
size_t workSpaceSizeInBytes,
const void *alpha2,
const mcdnnTensorDescriptor_t zDesc,
const void *z,
const mcdnnTensorDescriptor_t biasDesc,
const void *bias,
const mcdnnActivationDescriptor_t activationDesc,
const mcdnnTensorDescriptor_t yDesc,
void *y)
mcdnnGetConvolution2dForwardOutputDim()或mcdnnGetConvolutionNdForwardOutputDim()函数可用于确定输出张量描述符yDesc的正确维度,yDesc是关于xDesc、convDesc和wDesc的输出张量描述符。 仅MCDNN_CONVOLUTION_FWD_ALGO_IMPLICIT_PRECOMP_GEMM算法可以与MCDNN_ACTIVATION_IDENTITY一起启用。换言之,在activationDesc输入的mcdnnActivationDescriptor_t结构中,如果mcdnnActivationMode_t字段的模式设置为枚举值MCDNN_ACTIVATION_IDENTITY,则mcdnnConvolutionBiasActivationForward()函数的mcdnnConvolutionFwdAlgo_t输入必须设置为枚举值MCDNN_CONVOLUTION_FWD_ALGO_IMPLICIT_PRECOMP_GEMM。更多信息,参见mcdnnSetActivationDescriptor()。 设备指针z和y可能指向同一缓冲区,但是x不能与z或y指向同一缓冲区。
参数
handle
输入。已创建的mcDNN上下文的句柄。更多信息,参见mcdnnHandle_t。
alpha1, alpha2
输入。指向缩放系数(主机内存中)的指针,用于将卷积计算结果与z和bias混合,如下所示:
y = act ( alpha1 * conv(x) + alpha2 * z + bias )
xDesc
输入。已初始化的张量描述符的句柄。更多信息,参见mcdnnTensorDescriptor_t。
x
输入。数据指针,指向与张量描述符xDesc关联的GPU内存。
wDesc
输入。已初始化的卷积核描述符的句柄。更多信息,参见mcdnnFilterDescriptor_t。
w
输入。数据指针,指向与卷积核描述符wDesc关联的GPU内存。
convDesc
输入。已初始化的卷积描述符。更多信息,参见mcdnnConvolutionDescriptor_t。
algo
输入。指定应使用哪个卷积算法来计算结果的枚举。更多信息,参见mcdnnConvolutionFwdAlgo_t。
workSpace
输入。数据指针,指向执行指定算法所需的工作空间GPU内存。如果特定算法不需要工作空间,则该指针可以NIL。
workSpaceSizeInBytes
输入。指定已提供的workSpace大小(以字节为单位)。
zDesc
输入。已初始化的张量描述符的句柄。
z
输入。数据指针,指向与张量描述符zDesc关联的GPU内存。
biasDesc
输入。已初始化的张量描述符的句柄。
bias
输入。数据指针,指向与张量描述符biasDesc关联的GPU内存。
activationDesc
输入。已初始化的激活描述符的句柄。更多信息,参见mcdnnActivationDescriptor_t。
yDesc
输入。已初始化的张量描述符的句柄。
y
输入/输出。数据指针,指向与yDesc张量描述符(携带卷积结果)关联的GPU内存。
返回值
除了mcdnnConvolutionForward()中列出的错误值之外,下面列出了此函数可能返回的错误值及其含义。
MCDNN_STATUS_SUCCESS
操作成功启动。
MCDNN_STATUS_BAD_PARAM
需至少满足以下任一条件: * 以下至少有一个为NULL:handle、xDesc、wDesc、convDesc、yDesc、zDesc、biasDesc、activationDesc、xData、wData、yData、zData、bias、alpha1、alpha2。
xDesc、wDesc、yDesc和zDesc的维数不等于convDesc数组长度 + 2。
MCDNN_STATUS_NOT_SUPPORTED
此函数不支持已提供的配置。不受支持的配置示例如下:
activationDesc的模式不是MCDNN_ACTIVATION_RELU或MCDNN_ACTIVATION_IDENTITY。
activationDesc的reluNanOpt不是MCDNN_NOT_PROPAGATE_NAN。
biasDesc的第二个步幅不等于1。
biasDesc的第一维不等于1。
biasDesc的第二维和filterDesc的第一维不相等。
biasDesc的数据类型和yDesc的数据类型,没有与以下数据类型表列出的组合匹配。
zDesc和destDesc不匹配。
MCDNN_STATUS_EXECUTION_FAILED
此函数在GPU上启用失败。
mcdnnConvolutionBiasActivationForward()支持的数据类型组合(X = MCDNN_DATA)
|
|
|
|
|
|
|---|---|---|---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
4.2.1.4. mcdnnConvolutionForward()
mcdnnStatus_t mcdnnConvolutionForward(
mcdnnHandle_t handle,
const void *alpha,
const mcdnnTensorDescriptor_t xDesc,
const void *x,
const mcdnnFilterDescriptor_t wDesc,
const void *w,
const mcdnnConvolutionDescriptor_t convDesc,
mcdnnConvolutionFwdAlgo_t algo,
void *workSpace,
size_t workSpaceSizeInBytes,
const void *beta,
const mcdnnTensorDescriptor_t yDesc,
void *y)
该函数使用w指定的卷积核以x执行卷积或交叉相关操作,以y返回结果。缩放系数alpha和beta可分别用于缩放输入和输出张量。
备注
mcdnnGetConvolution2dForwardOutputDim()或mcdnnGetConvolutionNdForwardOutputDim()函数可用于确定输出张量描述符yDesc的正确维度,yDesc是关于xDesc、convDesc和wDesc的输出张量描述符。
参数
handle
输入。已创建的mcDNN上下文的句柄。更多信息,参见mcdnnHandle_t。
alpha, beta
输入。指向缩放系数(主机内存中)的指针,用于将计算结果与输出层中的先验值混合,如下所示:
dstValue = alpha[0]*result + beta[0]*priorDstValue
xDesc
输入。已初始化的张量描述符的句柄。更多信息,参见mcdnnTensorDescriptor_t。
x
输入。数据指针,指向与张量描述符xDesc关联的GPU内存。
wDesc
输入。已初始化的卷积核描述符的句柄。更多信息,参见mcdnnFilterDescriptor_t。
w
输入。数据指针,指向与卷积核描述符wDesc关联的GPU内存。
convDesc
输入。已初始化的卷积描述符。更多信息,参见mcdnnConvolutionDescriptor_t。
algo
输入。指定应使用哪个卷积算法来计算结果的枚举。更多信息,参见mcdnnConvolutionFwdAlgo_t。
workSpace
输入。数据指针,指向执行指定算法所需的工作空间GPU内存。如果特定算法不需要工作空间,则该指针可以为nil。
workSpaceSizeInBytes
输入。指定已提供的workSpace大小(以字节为单位)。
yDesc
输入。已初始化的张量描述符的句柄。
y
输入/输出。数据指针,指向与yDesc张量描述符(携带卷积结果)关联的GPU内存。
返回值
MCDNN_STATUS_SUCCESS
操作成功启动。
MCDNN_STATUS_BAD_PARAM
需至少满足以下任一条件:
以下至少有一个为NULL:handle、xDesc、wDesc、convDesc、yDesc、xData、w、yData、alpha、beta
xDesc和yDesc的维数不匹配
xDesc和wDesc的维数不匹配
xDesc的维数小于3
xDesc的维数不等于convDesc数组长度 + 2
xDesc和wDesc每个图像(或分组卷积情况下的组)的输入特征图数不匹配
yDesc或wDesc表示输出通道计数,其不是组计数的倍数(如果在convDesc中设置了组计数)。
xDesc、wDesc和yDesc的数据类型不匹配
对于某些空间维度,wDesc的空间大于输入空间(包括零填充大小)
MCDNN_STATUS_NOT_SUPPORTED
需至少满足以下任一条件:
xDesc或yDesc具有负张量步幅
xDesc,wDesc或yDesc的维数不是4或5
yDesc空间大小与mcdnnGetConvolutionNdForwardOutputDim()中设定的大小不匹配
所选algo不支持提供的参数;有关每个algo支持的参数,参见以下详尽列表
MCDNN_STATUS_MAPPING_ERROR
创建与卷积核数据关联的纹理对象时发生错误。
MCDNN_STATUS_EXECUTION_FAILED
此函数在GPU上启用失败。
mcdnnConvolutionForward()支持的配置
数据类型 配置 |
|
|
|
|---|---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
支持的算法
MCDNN_CONVOLUTION_FWD_ALGO_IMPLICIT_PRECOMP_GEMM (_IMPLICIT_PRECOMP_GEMM)
MCDNN_CONVOLUTION_FWD_ALGO_FFT_TILING (_FFT_TILING)
MCDNN_TENSOR_NCHW (_NCHW)
MCDNN_TENSOR_NHWC (_NHWC)
MCDNN_TENSOR_NCHW_VECT_C (_NCHW_VECT_C)
mcdnnConvolutionForward() 2D卷积支持的算法:wDesc: _NCHW
算法名称 |
|
|
支持的 数据类型 配置 |
重要 |
|---|---|---|---|---|
|
除 _NCHW_ VECT_C 之外 的其他格式 |
除 _NCHW_ VECT_C 之外 的其他格式 |
PSEUDO_HALF _CONFIG
|
1适用于所有 维度 |
|
PSEUDO_HALF _CONFIG
当任务可以
由1D FFT
处理时,
也支持
|
1适用于所有 维度 当 wDesc 卷积核维度 都不为1时, 卷积核宽度和 高度不得大于 32 当 wDesc 卷积核任一 维度为1时, 卷积核最大 维度不应超过 256 当卷积核宽度 或高度为1 时,convDesc 垂直与水平 卷积核步幅 必须为1; 否则,步幅 可以为1或2
|
mcdnnConvolutionForward() 2D卷积支持的算法:wDesc: _NCHWC
算法名称 |
|
|
支持的 数据类型配置 |
重要 |
|---|---|---|---|---|
|
|
|
|
1适用于 所有维度 |
|
|
|
|
1适用于 所有维度 |
mcdnnConvolutionForward() 2D卷积支持的算法:wDesc: _NHWC
算法名称 |
|
|
支持的 数据类型配置 |
重要 |
|---|---|---|---|---|
|
NHWC fully-packed |
NHWC fully-packed |
|
1适用于 所有维度 输入和输出 特征图必须为 4的倍数 在 INT8_EXT _CONFIG 或 UINT8_EXT _CONFIG 的 情况下, 输出特征图 可以为非倍数 |
|
NHWC HWC-packed |
NHWC HWC-packed NCHW CHW-packed |
|
mcdnnConvolutionForward() 3D卷积支持的算法:wDesc: _NCHW
算法名称 |
|
|
支持的 数据类 型配置 |
重要 |
|---|---|---|---|---|
|
所有维度大于 0 |
|||
|
NCDHW DHW-packed |
NCDHW DHW-packed |
1适用于所有 维度
|
mcdnnConvolutionForward() 3D卷积支持的算法:wDesc: _NHWC
算法名称 |
|
|
支持的 数据类型配置 |
重要 |
|---|---|---|---|---|
|
NDHWC DHWC-packed |
NDHWC DHWC-packed |
PSEUDO_HALF _CONFIG
|
所有维度大于 0 |
4.2.1.5. mcdnnCreateConvolutionDescriptor()
mcdnnStatus_t mcdnnCreateConvolutionDescriptor(
mcdnnConvolutionDescriptor_t *convDesc)
此函数通过分配保存卷积描述符不透明结构所需内存的方式,创建卷积描述符对象。更多信息,参见mcdnnConvolutionDescriptor_t。
参数
convDesc
输出。卷积层描述符。
返回值
MCDNN_STATUS_SUCCESS
对象创建成功。
MCDNN_STATUS_ALLOC_FAILED
资源无法分配。
4.2.1.6. mcdnnDestroyConvolutionDescriptor()
mcdnnStatus_t mcdnnDestroyConvolutionDescriptor(
mcdnnConvolutionDescriptor_t convDesc)
此函数用于销毁已创建的卷积描述符对象。
返回值
MCDNN_STATUS_SUCCESS
描述符销毁成功。
4.2.1.7. mcdnnFindConvolutionBackwardDataAlgorithm()
mcdnnStatus_t mcdnnFindConvolutionBackwardDataAlgorithm(
mcdnnHandle_t handle,
const mcdnnFilterDescriptor_t wDesc,
const mcdnnTensorDescriptor_t dyDesc,
const mcdnnConvolutionDescriptor_t convDesc,
const mcdnnTensorDescriptor_t dxDesc,
int requestedAlgoCount,
int *returnedAlgoCount,
mcdnnConvolutionBwdDataAlgoPerf_t *perfResults)
此函数尝试所有可用于mcdnnConvolutionBackwardData()的算法。它将尝试提供的convDesc MathType和MCDNN_FMA_MATH(假设两者不同)。
备注
只能使用MCDNN_FMA_MATH 尝试没有 MCDNN_TENSOR_OP_MATH可用性的算法,并以同样方式返回。
对于MCDNN_DATA_FLOAT,MCDNN_FMA_MATH将使用float类型计算,其它MATH_TYPE将使用tf32类型计算。
通过mcMalloc()分配内存。在用户分配的mcdnnConvolutionBwdDataAlgoPerf_t数组中返回性能指标。这些指标以一种有序的方式写入,其中第一个元素的计算时间最短。可用算法的总数可以通过 mcdnnGetConvolutionBackwardDataAlgorithmMaxCount() API查询。
备注
此函数是主机阻塞。
建议在分配层数据之前运行此函数;否则可能会由于资源使用问题而不必要地禁止某些算法选项。
参数
handle
输入。已创建的mcDNN上下文的句柄。
wDesc
输入。已初始化的卷积核描述符的句柄。
dyDesc
输入。已初始化的输入差分张量描述符的句柄。
convDesc
输入。已初始化的卷积描述符。
dxDesc
输入。已初始化的输出张量描述符的句柄。
requestedAlgoCount
输入。要存储在perfResults中的最大元素数。
returnedAlgoCount
输出。存储在perfResults中的输出元素数。
perfResults
输出。用户分配的数组,用于存储按计算时间升序排序的性能指标。
返回值
MCDNN_STATUS_SUCCESS
查询成功。
MCDNN_STATUS_BAD_PARAM
需至少满足以下任一条件:
未正确分配handle。
未正确分配wDesc、dyDesc或dxDesc。
wDesc,dyDesc或dxDesc的维度小于1。
returnedCount或perfResults为nil。
requestedCount小于1。
MCDNN_STATUS_ALLOC_FAILED
此函数无法分配内存来存储样本输入,卷积核和输出。
MCDNN_STATUS_INTERNAL_ERROR
遇到一些内部错误。
4.2.1.8. mcdnnFindConvolutionBackwardDataAlgorithmEx()
mcdnnStatus_t mcdnnFindConvolutionBackwardDataAlgorithmEx(
mcdnnHandle_t handle,
const mcdnnFilterDescriptor_t wDesc,
const void *w,
const mcdnnTensorDescriptor_t dyDesc,
const void *dy,
const mcdnnConvolutionDescriptor_t convDesc,
const mcdnnTensorDescriptor_t dxDesc,
void *dx,
int requestedAlgoCount,
int *returnedAlgoCount,
mcdnnConvolutionBwdDataAlgoPerf_t *perfResults,
void *workSpace,
size_t workSpaceSizeInBytes)
此函数尝试所有可用于mcdnnConvolutionBackwardData()的算法。它将尝试提供的convDesc MathType和MCDNN_TENSOR_OP_MATH(假设两者不同)。
备注
只能使用MCDNN_FMA_MATH 尝试没有 MCDNN_TENSOR_OP_MATH可用性的算法,并以同样方式返回。 对于MCDNN_DATA_FLOAT,MCDNN_FMA_MATH将使用float类型计算,其它MATH_TYPE将使用tf32类型计算。
通过mcMalloc()分配内存。在用户分配的mcdnnConvolutionBwdDataAlgoPerf_t数组中返回性能指标。这些指标以一种有序的方式写入,其中第一个元素的计算时间最短。可用算法的总数可以通过 mcdnnGetConvolutionBackwardDataAlgorithmMaxCount() API查询。
备注
此函数是主机阻塞。
参数
handle
输入。已创建的mcDNN上下文的句柄。
wDesc
输入。已初始化的卷积核描述符的句柄。
w
输入。数据指针,指向与卷积核描述符wDesc关联的GPU内存。
dyDesc
输入。已初始化的输入差分张量描述符的句柄。
dy
输入。数据指针,指向与卷积核描述符dyDesc关联的GPU内存。
convDesc
输入。已初始化的卷积描述符。
dxDesc
输入。已初始化的输出张量描述符的句柄。
dxDesc
输入/输出。数据指针,指向与张量描述符dxDesc关联的GPU内存。 此张量的内容会被任意值覆盖。
requestedAlgoCount
输入。要存储在perfResults中的最大元素数。
returnedAlgoCount
输出。存储在perfResults中的输出元素数。
perfResults
输出。用户分配的数组,用于存储按计算时间升序排序的性能指标。
workSpace
输入。指向GPU内存的数据指针,此内存是某些算法所必需的工作空间。此工作空间的大小将决定算法的可用性。nil指针被视为0字节的workSpace。
workSpaceSizeInBytes
输入。指定已提供的workSpace大小(以字节为单位)。
返回值
MCDNN_STATUS_SUCCESS
查询成功。
MCDNN_STATUS_BAD_PARAM
需至少满足以下任一条件:
未正确分配handle。
未正确分配wDesc、dyDesc或dxDesc。
wDesc,dyDesc或dxDesc的维度小于1。
w,dy或dx为nil。
returnedCount或perfResults为nil。
requestedCount小于1。
MCDNN_STATUS_INTERNAL_ERROR
需至少满足以下任一条件:
此函数不能用来分配必要的计时对象。
此函数不能用来释放必要的计时对象。
此函数不能用来释放样本输入,卷积核和输出。
4.2.1.9. mcdnnFindConvolutionForwardAlgorithm()
mcdnnStatus_t mcdnnFindConvolutionForwardAlgorithm(
mcdnnHandle_t handle,
const mcdnnTensorDescriptor_t xDesc,
const mcdnnFilterDescriptor_t wDesc,
const mcdnnConvolutionDescriptor_t convDesc,
const mcdnnTensorDescriptor_t yDesc,
int requestedAlgoCount,
int *returnedAlgoCount,
mcdnnConvolutionFwdAlgoPerf_t *perfResults)
此函数尝试所有可用于mcdnnConvolutionForward()的算法。它将尝试提供的convDesc MathType和MCDNN_TENSOR_OP_MATH(假设两者不同)。
备注
只能使用MCDNN_FMA_MATH 尝试没有 MCDNN_TENSOR_OP_MATH可用性的算法,并以同样方式返回。 对于MCDNN_DATA_FLOAT,MCDNN_FMA_MATH将使用float类型计算,其它MATH_TYPE将使用tf32类型计算。
通过mcMalloc()分配内存。在用户分配的mcdnnConvolutionFwdAlgoPerf_t数组中返回性能指标。这些指标以一种有序的方式写入,其中第一个元素的计算时间最短。可用算法的总数可以通过 mcdnnGetConvolutionForwardAlgorithmMaxCount() API查询。
备注
此函数是主机阻塞。
建议在分配层数据之前运行此函数;否则可能会由于资源使用问题而不必要地禁止某些算法选项。
参数
handle
输入。已创建的mcDNN上下文的句柄。
xDesc
输入。已初始化的输入张量描述符的句柄。
wDesc
输入。已初始化的卷积核描述符的句柄。
convDesc
输入。已初始化的卷积描述符。
yDesc
输入。已初始化的输出张量描述符的句柄。
requestedAlgoCount
输入。要存储在perfResults中的最大元素数。
returnedAlgoCount
输出。存储在perfResults中的输出元素数。
perfResults
输出。用户分配的数组,用于存储按计算时间升序排序的性能指标。
返回值
MCDNN_STATUS_SUCCESS
查询成功。
MCDNN_STATUS_BAD_PARAM
需至少满足以下任一条件:
未正确分配handle。
未正确分配xDesc、wDesc或yDesc。
xDesc、wDesc或yDesc的维度小于1。
returnedCount或perfResults为nil。
requestedCount小于1。
MCDNN_STATUS_ALLOC_FAILED
此函数无法分配内存来存储样本输入,卷积核和输出。
MCDNN_STATUS_INTERNAL_ERROR
需至少满足以下任一条件:
此函数不能用来分配必要的计时对象。
此函数不能用来释放必要的计时对象。
此函数不能用来释放样本输入,卷积核和输出。
4.2.1.10. mcdnnFindConvolutionForwardAlgorithmEx()
mcdnnStatus_t mcdnnFindConvolutionForwardAlgorithmEx(
mcdnnHandle_t handle,
const mcdnnTensorDescriptor_t xDesc,
const void *x,
const mcdnnFilterDescriptor_t wDesc,
const void *w,
const mcdnnConvolutionDescriptor_t convDesc,
const mcdnnTensorDescriptor_t yDesc,
void *y,
int requestedAlgoCount,
int *returnedAlgoCount,
mcdnnConvolutionFwdAlgoPerf_t *perfResults,
void *workSpace,
size_t workSpaceSizeInBytes)
此函数尝试所有可用于mcdnnConvolutionForward()的算法。它将尝试提供的convDesc MathType和MCDNN_TENSOR_OP_MATH(假设两者不同)。
备注
只能使用MCDNN_FMA_MATH 尝试没有 MCDNN_TENSOR_OP_MATH可用性的算法,并以同样方式返回。 对于MCDNN_DATA_FLOAT,MCDNN_FMA_MATH将使用float类型计算,其它MATH_TYPE将使用tf32类型计算。
通过mcMalloc()分配内存。在用户分配的mcdnnConvolutionFwdAlgoPerf_t数组中返回性能指标。这些指标以一种有序的方式写入,其中第一个元素的计算时间最短。可用算法的总数可以通过 mcdnnGetConvolutionForwardAlgorithmMaxCount() API查询。
备注
此函数是主机阻塞。
参数
handle
输入。已创建的mcDNN上下文的句柄。
xDesc
输入。已初始化的输入张量描述符的句柄。
x
输入。数据指针,指向与张量描述符xDesc关联的GPU内存。
wDesc
输入。已初始化的卷积核描述符的句柄。
w
输入。数据指针,指向与卷积核描述符wDesc关联的GPU内存。
convDesc
输入。已初始化的卷积描述符。
yDesc
输入。已初始化的输出张量描述符的句柄。
y
输入/输出。数据指针,指向与张量描述符yDesc关联的GPU内存。此张量的内容会被任意值覆盖。
requestedAlgoCount
输入。要存储在perfResults中的最大元素数。
returnedAlgoCount
输出。存储在perfResults中的输出元素数。
perfResults
输出。用户分配的数组,用于存储按计算时间升序排序的性能指标。
workSpace
输入。指向GPU内存的数据指针,此内存是某些算法所必需的工作空间。此工作空间的大小将决定算法的可用性。nil指针被视为0字节的workSpace。
workSpaceSizeInBytes
输入。指定已提供的workSpace大小(以字节为单位)。
返回值
MCDNN_STATUS_SUCCESS
查询成功。
MCDNN_STATUS_BAD_PARAM
需至少满足以下任一条件:
未正确分配handle。
未正确分配xDesc、wDesc或yDesc。
xDesc、wDesc或yDesc的维度小于1。
x、w或y为nil。
returnedCount或perfResults为nil。
requestedCount小于1。
MCDNN_STATUS_INTERNAL_ERROR
需至少满足以下任一条件:
此函数不能用来分配必要的计时对象。
此函数不能用来释放必要的计时对象。
此函数不能用来释放样本输入,卷积核和输出。
4.2.1.11. mcdnnGetConvolution2dDescriptor()
mcdnnStatus_t mcdnnGetConvolution2dDescriptor(
const mcdnnConvolutionDescriptor_t convDesc,
int *pad_h,
int *pad_w,
int *u,
int *v,
int *dilation_h,
int *dilation_w,
mcdnnConvolutionMode_t *mode,
mcdnnDataType_t *computeType)
此函数用于查询已初始化的2D卷积描述符对象。
参数
convDesc
输入/输出。已创建的卷积描述符的句柄。
pad_h
输出。零填充高度:隐式连接到输入图像顶部和底部的零的行数。
pad_w
输出。零填充宽度:隐式连接到输入图像的左侧和右侧的零的列数。
u
输出。垂直卷积核步幅。
v
输出。水平卷积核步幅。
dilation_h
输出。卷积核高度扩张。
dilation_w
输出。卷积核宽度扩张。
mode
输出。卷积模式。
computeType
输出。计算精度。
返回值
MCDNN_STATUS_SUCCESS
操作成功。
MCDNN_STATUS_BAD_PARAM
convDesc参数为nil。
4.2.1.12. mcdnnGetConvolution2dForwardOutputDim()
mcdnnStatus_t mcdnnGetConvolution2dForwardOutputDim(
const mcdnnConvolutionDescriptor_t convDesc,
const mcdnnTensorDescriptor_t inputTensorDesc,
const mcdnnFilterDescriptor_t filterDesc,
int *n,
int *c,
int *h,
int *w)
给定卷积描述符,输入张量描述符和卷积核描述符,此函数返回2D卷积的4D张量的维度。此函数可帮助设置输出张量,并在启动实际卷积之前分配适当的内存量。
输出图像的各维度h和w计算如下:
outputDim = 1 + (inputDim + 2 * pad - (((filterDim - 1) * dilation) + 1) ) / convolutionStride;
备注
调用mcdnnConvolutionForward()或mcdnnConvolutionBackwardBias()时,必须严格遵守此函数提供的维度。卷积函数不支持提供更小或更大的输出张量。
参数
convDesc
输入。已创建的卷积描述符的句柄。
inputTensorDesc
输入。已初始化的张量描述符的句柄。
filterDesc
输入。已初始化的卷积核描述符的句柄。
n
输出。输出图像数量。
c
输出。每个图像的输出特征图数量。
h
输出。每个输出特征图的高度。
w
输出。每个输出特征图的宽度。
返回值
MCDNN_STATUS_BAD_PARAM
一个或多个描述符未正确创建,或者inputTensorDesc和filterDesc的特征图不匹配。
MCDNN_STATUS_SUCCESS
对象设置成功。
4.2.1.13. mcdnnGetConvolutionBackwardDataAlgorithmMaxCount()
mcdnnStatus_t mcdnnGetConvolutionBackwardDataAlgorithmMaxCount(
mcdnnHandle_t handle, int *count)
该函数返回可从mcdnnFindConvolutionBackwardDataAlgorithm()和mcdnnGetConvolutionForwardAlgorithmer_v7()返回的算法的最大数量。这是所有算法总和加上当前设备支持的具有Tensor Core操作的算法总和。
参数
handle
输入。已创建的mcDNN上下文的句柄。
count
输出。得到的算法最大数量。
返回值
MCDNN_STATUS_SUCCESS
此函数执行成功。
MCDNN_STATUS_BAD_PARAM
未正确分配提供的handle。
4.2.1.14. mcdnnGetConvolutionBackwardDataAlgorithm_v7()
该函数用作启发式函数,用于为给定卷积参数获取mcdnnConvolutionBackwardData()的最适合算法。 此函数将返回按期望的(基于内部启发式)相对性能排序的所有算法(包括MCDNN_TENSOR_OP_MATH和MCDNN_DEFAULT_MATH版本的算法,其中MCDNN_TENSOR_OP_MATH可能可用),最快的是perfResults的索引0。 要全面搜索最快的算法,请使用mcdnnFindConvolutionBackwardDataAlgorithm()。可用算法的总数可以通过returnedAlgoCount变量查询。
mcdnnStatus_t mcdnnGetConvolutionBackwardDataAlgorithm_v7(
mcdnnHandle_t handle,
const mcdnnFilterDescriptor_t wDesc,
const mcdnnTensorDescriptor_t dyDesc,
const mcdnnConvolutionDescriptor_t convDesc,
const mcdnnTensorDescriptor_t dxDesc,
const int requestedAlgoCount,
int *returnedAlgoCount,
mcdnnConvolutionBwdDataAlgoPerf_t *perfResults)
参数
handle
输入。已创建的mcDNN上下文的句柄。
wDesc
输入。已初始化的卷积核描述符的句柄。
dyDesc
输入。已初始化的输入差分张量描述符的句柄。
convDesc
输入。已初始化的卷积描述符。
dxDesc
输入。已初始化的输出张量描述符的句柄。
requestedAlgoCount
输入。要存储在perfResults中的最大元素数。
returnedAlgoCount
输出。存储在perfResults中的输出元素数。
perfResults
输出。用户分配的数组,用于存储按计算时间升序排序的性能指标。
返回值
MCDNN_STATUS_SUCCESS
查询成功。
MCDNN_STATUS_BAD_PARAM
需至少满足以下任一条件:
以下任一参数为NULL:handle、wDesc、dyDesc、convDesc、dxDesc、perfResults、returnedAlgoCount。
输入张量和输出张量的特征图数量不同。
两个张量描述符或卷积核的dataType不同。
requestedAlgoCount小于或等于0。
4.2.1.15. mcdnnGetConvolutionBackwardDataWorkspaceSize()
mcdnnStatus_t mcdnnGetConvolutionBackwardDataWorkspaceSize(
mcdnnHandle_t handle,
const mcdnnFilterDescriptor_t wDesc,
const mcdnnTensorDescriptor_t dyDesc
const mcdnnConvolutionDescriptor_t convDesc,
const mcdnnTensorDescriptor_t dxDesc,
mcdnnConvolutionBwdDataAlgo_t algo,
size_t *sizeInBytes)
此函数返回用户应分配的GPU内存工作空间量,以便能够使用指定算法来调用mcdnnConvolutionBackwardData()函数。 然后,分配的workspace将传入mcdnnConvolutionBackwardData()函数。 指定的算法可以是调用mcdnnGetConvolutionBackwardDataAlgorithm_v7()的结果,也可以由用户任意选择。 请注意,并非每个算法都可用于输入张量的每个配置和/或卷积描述符的每个配置。
参数
handle
输入。已创建的mcDNN上下文的句柄。
wDesc
输入。已初始化的卷积核描述符的句柄。
dyDesc
输入。已初始化的输入差分张量描述符的句柄。
convDesc
输入。已初始化的卷积描述符。
dxDesc
输入。已初始化的输出张量描述符的句柄。
algo
输入。指定所选卷积算法的枚举。
sizeInBytes
输出。作为工作空间所需的GPU内存量,以便能够使用指定的算法执行正向卷积。
返回值
MCDNN_STATUS_SUCCESS
查询成功。
MCDNN_STATUS_BAD_PARAM
需至少满足以下任一条件:
输入张量和输出张量的特征图数量不同。
两个张量描述符或卷积核的dataType不同。
MCDNN_STATUS_NOT_SUPPORTED
指定的算法不支持张量描述符,卷积核描述符和卷积描述符的组合。
4.2.1.16. mcdnnGetConvolutionForwardAlgorithmMaxCount()
mcdnnStatus_t mcdnnGetConvolutionForwardAlgorithmMaxCount(
mcdnnHandle_t handle, int *count)
该函数返回可从mcdnnFindConvolutionForwardAlgorithm()和mcdnnGetConvolutionForwardAlgorithmer_v7()返回的算法的最大数量。 这是所有算法总和加上当前设备支持的具有Tensor Core操作的算法总和。
参数
handle
输入。已创建的mcDNN上下文的句柄。
count
输出。得到的算法最大数量。
返回值
MCDNN_STATUS_SUCCESS
此函数执行成功。
MCDNN_STATUS_BAD_PARAM
未正确分配提供的handle。
4.2.1.17. mcdnnGetConvolutionForwardAlgorithm_v7
该函数用作启发式函数,用于为给定卷积参数获取mcdnnConvolutionForward()的最适合算法。 此函数将返回按期望的(基于内部启发式)相对性能排序的所有算法(包括MCDNN_TENSOR_OP_MATH和MCDNN_DEFAULT_MATH版本的算法,其中MCDNN_TENSOR_OP_MATH可能可用),最快的是perfResults的索引0。 要全面搜索最快的算法,请使用mcdnnFindConvolutionForwardAlgorithm()。 可用算法的总数可以通过returnedAlgoCount变量查询。
mcdnnStatus_t mcdnnGetConvolutionForwardAlgorithm_v7(
mcdnnHandle_t handle,
const mcdnnTensorDescriptor_t xDesc,
const mcdnnFilterDescriptor_t wDesc,
const mcdnnConvolutionDescriptor_t convDesc,
const mcdnnTensorDescriptor_t yDesc,
const int requestedAlgoCount,
int *returnedAlgoCount,
mcdnnConvolutionFwdAlgoPerf_t *perfResults)
参数
handle
输入。已创建的mcDNN上下文的句柄。
xDesc
输入。已初始化的输入张量描述符的句柄。
wDesc
输入。已初始化的卷积卷积核描述符的句柄。
convDesc
输入。已初始化的卷积描述符。
yDesc
输入。已初始化的输出张量描述符的句柄。
requestedAlgoCount
输入。要存储在perfResults中的最大元素数。
returnedAlgoCount
输出。存储在perfResults中的输出元素数。
perfResults
输出。用户分配的数组,用于存储按计算时间升序排序的性能指标。
返回值
MCDNN_STATUS_SUCCESS
查询成功。
MCDNN_STATUS_BAD_PARAM
需至少满足以下任一条件:
以下任一参数为NULL:handle、xDesc、wDesc、convDesc、yDesc、perfResults、returnedAlgoCount。
yDesc或wDesc的维度与xDesc不同。
xDesc,yDesc或wDesc张量的数据类型不全相同。
xDesc和wDesc中的特征图数量不同。
xDesc张量的维度小于3。
requestedAlgoCount小于或等于0。
4.2.1.18. mcdnnGetConvolutionForwardWorkspaceSize()
mcdnnStatus_t mcdnnGetConvolutionForwardWorkspaceSize(
mcdnnHandle_t handle,
const mcdnnTensorDescriptor_t xDesc,
const mcdnnFilterDescriptor_t wDesc,
const mcdnnConvolutionDescriptor_t convDesc,
const mcdnnTensorDescriptor_t yDesc,
mcdnnConvolutionFwdAlgo_t algo,
size_t *sizeInBytes)
此函数返回用户应分配的GPU内存工作空间量,以便能够使用指定算法来调用mcdnnConvolutionForward()函数。然后,分配的工作空间将传入mcdnnConvolutionForward()函数。 指定的算法可以是调用mcdnnGetConvolutionForwardAlgorithm_v7()的结果,也可以由用户任意选择。 请注意,并非每个算法都可用于输入张量的每个配置和/或卷积描述符的每个配置。
参数
handle
输入。已创建的mcDNN上下文的句柄。
xDesc
输入。已初始化的x张量描述符的句柄。
wDesc
输入。已初始化的卷积核描述符的句柄。
convDesc
输入。已初始化的卷积描述符。
yDesc
输入。已初始化的y张量描述符的句柄。
algo
输入。指定所选卷积算法的枚举。
sizeInBytes
输出。作为工作空间所需的GPU内存量,以便能够使用指定的算法执行正向卷积。
返回值
MCDNN_STATUS_SUCCESS
查询成功。
MCDNN_STATUS_BAD_PARAM
需至少满足以下任一条件:
以下任一参数为NULL:handle、xDesc、wDesc、convDesc、yDesc。
yDesc或wDesc张量与xDesc的维度不同。
xDesc,yDesc或wDesc张量的数据不全相同类型。
xDesc和wDesc中的特征图数量不同。
xDesc张量的维度小于3。
- MCDNN_STATUS_NOT_SUPPORTED
指定的算法不支持张量描述符,卷积核描述符和卷积描述符的组合。
4.2.1.19. mcdnnGetConvolutionGroupCount()
mcdnnStatus_t mcdnnGetConvolutionGroupCount(
mcdnnConvolutionDescriptor_t convDesc,
int *groupCount);
此函数返回给定卷积描述符中指定的组计数。
参数
convDesc
输入。卷积层描述符。
groupCount
Output。组数。
返回值
MCDNN_STATUS_SUCCESS
组计数返回成功。
MCDNN_STATUS_BAD_PARAM
提供的卷积描述符无效。
4.2.1.20. mcdnnGetConvolutionMathType()
mcdnnStatus_t mcdnnGetConvolutionMathType(
mcdnnConvolutionDescriptor_t convDesc,
mcdnnMathType_t *mathType)
返回值
MCDNN_STATUS_SUCCESS
数学类型返回成功。
MCDNN_STATUS_BAD_PARAM
提供的卷积描述符无效。
4.2.1.21. mcdnnGetConvolutionNdDescriptor()
mcdnnStatus_t mcdnnGetConvolutionNdDescriptor(
const mcdnnConvolutionDescriptor_t convDesc,
int arrayLengthRequested,
int *arrayLength,
int padA[],
int filterStrideA[],
int dilationA[],
mcdnnConvolutionMode_t *mode,
mcdnnDataType_t *dataType)
参数
convDesc
输入/输出。已创建的卷积描述符的句柄。
arrayLengthRequested
输入。期望的卷积描述符的维度。也是padA、filterStrideA、dilationA数组能够保存结果的的最小空间。
arrayLength
输出。卷积描述符的实际维度。
padA
输出。至少包含arrayLengthRequested维度的数组,由提供的卷积描述符中的padding参数填充。
filterStrideA
输出。至少包含arrayLengthRequested维度的数组,由提供的卷积描述符中的filter步幅填充。
dilationA
输出。至少包含arrayLengthRequested维度的数组,由提供的卷积描述符中的dilation参数填充。
mode
输出。提供的描述符的卷积模式。
datatype
输出。提供的描述符的数据类型。
返回值
MCDNN_STATUS_SUCCESS
查询成功。
MCDNN_STATUS_BAD_PARAM
需至少满足以下任一条件:
convDesc描述符为nil。
arrayLengthRequest为负值。
MCDNN_STATUS_NOT_SUPPORTED
arrayLengthRequested大于MCDNN_DIM_MAX - 2。
4.2.1.22. mcdnnGetConvolutionNdForwardOutputDim()
给定卷积描述符,输入张量描述符和卷积核描述符,此函数返回nbDims-2-D卷积的Nd张量的维度。此函数可帮助设置输出张量,并在启动实际卷积之前分配适当的内存量。
mcdnnStatus_t mcdnnGetConvolutionNdForwardOutputDim(
const mcdnnConvolutionDescriptor_t convDesc,
const mcdnnTensorDescriptor_t inputTensorDesc,
const mcdnnFilterDescriptor_t filterDesc,
int nbDims,
int tensorOuputDimA[])
输出张量的(nbDims-2)-D图像的每个维度计算如下:
outputDim = 1 + ( inputDim + 2*pad - (((filterDim-1)*dilation)+1) )/convolutionStride;
备注
调用mcdnnConvolutionForward()或mcdnnConvolutionBackwardBias()时,必须严格遵守此函数提供的维度。卷积函数不支持提供更小或更大的输出张量。
参数
convDesc
输入。已创建的卷积描述符的句柄。
inputTensorDesc
输入。已初始化的张量描述符的句柄。
filterDesc
输入。已初始化的卷积核描述符的句柄。
nbDims
输入。输出张量的维度。
tensorOuputDimA
输出。nbDims维度数组,该数组包含此函数退出时输出张量的大小。
返回值
MCDNN_STATUS_BAD_PARAM
需至少满足以下任一条件:
以下任一参数为nil:convDesc、inputTensorDesc、filterDesc。
filterDesc卷积核描述符的维度与inputTensorDesc输入张量描述符的维度不同。
卷积描述符的维度与inputTensorDesc-2输入张量描述符的维度不同。
filterDesc卷积核描述符的特征图与inputTensorDesc输入张量描述符的特征图不同。
扩张卷积核filterDesc的尺寸大于输入张量的填充尺寸。
输出数组的nbDims维为负值或大于输入张量描述符inputTensorDesc的维度。
MCDNN_STATUS_SUCCESS
函数退出成功。
4.2.1.23. mcdnnGetConvolutionReorderType()
mcdnnStatus_t mcdnnGetConvolutionReorderType(
mcdnnConvolutionDescriptor_t convDesc,
mcdnnReorderType_t *reorderType)
此函数从给定的卷积描述符检索卷积重排序类型。
参数
convDesc
输入。要从中检索重排序类型的卷积描述符。
reorderType
输出。检索到的重排序类型。更多信息,参见mcdnnReorderType_t。
返回值
MCDNN_STATUS_SUCCESS
已成功检索重排序类型。
MCDNN_STATUS_BAD_PARAM
此函数的任一输入无效。
4.2.1.24. mcdnnGetFoldedConvBackwardDataDescriptors()
此函数计算折叠描述符的反向数据梯度。将数据描述符和卷积描述符作为输入,并计算折叠数据描述符和折叠转换(folding transform)描述符。然后可以使用它们来执行实际的折叠转换。
mcdnnStatus_t
mcdnnGetFoldedConvBackwardDataDescriptors(const mcdnnHandle_t handle,
const mcdnnFilterDescriptor_t filterDesc,
const mcdnnTensorDescriptor_t diffDesc,
const mcdnnConvolutionDescriptor_t convDesc,
const mcdnnTensorDescriptor_t gradDesc,
const mcdnnTensorFormat_t transformFormat,
mcdnnFilterDescriptor_t foldedFilterDesc,
mcdnnTensorDescriptor_t paddedDiffDesc,
mcdnnConvolutionDescriptor_t foldedConvDesc,
mcdnnTensorDescriptor_t foldedGradDesc,
mcdnnTensorTransformDescriptor_t filterFoldTransDesc,
mcdnnTensorTransformDescriptor_t diffPadTransDesc,
mcdnnTensorTransformDescriptor_t gradFoldTransDesc,
mcdnnTensorTransformDescriptor_t gradUnfoldTransDesc);
参数
handle
输入。已创建的mcDNN上下文的句柄。
filterDesc
输入。折叠前的卷积核描述符。
diffDesc
输入。折叠前的diff描述符。
convDesc
输入。折叠前的卷积描述符。
gradDesc
输入。折叠前的梯度描述符。
transformFormat
输入。用于折叠的转换格式。
foldedFilterDesc
输出。已折叠的卷积核描述符。
paddedDiffDesc
输出。已填充的diff描述符。
foldedConvDesc
输出。已折叠的卷积描述符。
foldedGradDesc
输出。已折叠的梯度描述符。
filterFoldTransDesc
输出。卷积核的折叠转换描述符。
diffPadTransDesc
输出。Desc的折叠转换描述符。
gradFoldTransDesc
输出。梯度的折叠转换描述符。
gradUnfoldTransDesc
输出。已折叠梯度的展开转换描述符。
返回值
MCDNN_STATUS_SUCCESS
已成功计算折叠描述符。
MCDNN_STATUS_BAD_PARAM
如果任意输入参数为NULL或如果输入张量超过4个维度。
MCDNN_STATUS_EXECUTION_FAILED
计算折叠描述符失败。
4.2.1.25. mcdnnIm2Col()
该函数构造执行GEMM卷积正向传递所需的A矩阵。
mcdnnStatus_t mcdnnIm2Col(
mcdnnHandle_t handle,
mcdnnTensorDescriptor_t srcDesc,
const void *srcData,
mcdnnFilterDescriptor_t filterDesc,
mcdnnConvolutionDescriptor_t convDesc,
void *colBuffer)
A矩阵的高度为batch_size*y_height*y_width,宽度为input_channels*filter_height*filter_width,其中:
batch_size是srcDesc第一维
y_height和y_width是由mcdnnGetConvolutionNdForwardOutputDim()计算得出
input_channels是srcDesc第二维(在NCHW布局中)
filter_height和filter_width是wDesc第三和第四维
A矩阵以HW完全压缩格式存储在GPU内存中。
参数
handle
输入。已创建的mcDNN上下文的句柄。
srcDesc
输入。已初始化的张量描述符的句柄。
srcData
输入。数据指针,指向与输入张量描述符关联的GPU内存。
filterDesc
输入。已初始化的卷积核描述符的句柄。
convDesc
输入。已初始化的卷积描述符的句柄。
colBuffer
输出。数据指针,指向存储输出矩阵的GPU内存。
返回值
MCDNN_STATUS_BAD_PARAM
srcData或colBuffer为NULL。
MCDNN_STATUS_NOT_SUPPORTED
srcDesc、filterDesc、convDesc的dataType为MCDNN_DATA_INT8,MCDNN_DATA_INT8x4,MCDNN_DATA_INT8或MCDNN_DATA_INT8x4。 convDesc的groupCount大于1。
MCDNN_STATUS_EXECUTION_FAILED
MXMACA内核执行失败。
MCDNN_STATUS_SUCCESS
输出数据组生成成功。
4.2.1.26. mcdnnReorderFilterAndBias
mcdnnReorderFilterAndBias()函数对数据类型为MCDNN_DATA_INT8x32且张量格式为MCDNN_TENSOR_NCHW_VECT_C的张量,进行卷积核和bias值的重排序。它可用于通过分离重排序操作与卷积来加速推理时间。当前仅支持2D卷积核(filter)。
mcdnnStatus_t mcdnnReorderFilterAndBias(
mcdnnHandle_t handle,
const mcdnnFilterDescriptor_t filterDesc,
mcdnnReorderType_t reorderType,
const void *filterData,
void *reorderedFilterData,
int reorderBias,
const void *biasData,
void *reorderedBiasData);
数据类型为MCDNN_DATA_INT8x32的卷积核和bias张量(也表示MCDNN_TENSOR_NCHW_VECT_C张量格式)需要进行输出通道轴置换,以便利用Tensor Core IMMA指令。当卷积描述符的reorder类型属性设置为MCDNN_DEFAULT_REORDER时,在每次mcdnnConvolutionForward()和mcdnnConvolutionBiasActivationForward()调用中完成此操作。用户可以避免重复的重排序内核调用,方法是首先使用此调用对卷积核和bias张量进行重排序,然后调用正向卷积API,重排序类型设置为MCDNN_NO_REORDER。 例如,多层神经网络中的卷积可能需要对每个层的内核进行重排序,这可能占用总推理时间的很大部分。使用此函数,可以对卷积核和bias数据进行一次重排序。 随后在多层执行卷积操作,从而加速推理时间。
参数
handle
输入。已创建的mcDNN上下文的句柄。
filterDesc
输入。内核数据集的描述符。
reorderType
输入。设置是否执行重排序。更多信息,参见mcdnnReorderType_t。
filterData
输入。指针,指向设备内存中卷积核(内核)数据位置。
reorderedFilterData
输出。指针,指向通过此函数写入已重排序卷积核数据的位置(设备内存中)。此张量与filterData具有相同的维度。
reorderBias
输入。如果> 0,则也对bias数据执行重排序。如果<= 0,则不对bias数据执行重排序。
biasData
输入。指向设备内存中bias数据位置的指针。
reorderedBiasData
输出。指针,指向通过此函数写入已重排序bias数据的位置(设备内存中)。此张量与biasData具有相同的维度。
返回值
MCDNN_STATUS_SUCCESS
重排序成功。
MCDNN_STATUS_EXECUTION_FAILED
卷积核和bias数据的重新排序失败。
MCDNN_STATUS_BAD_PARAM
句柄,卷积核描述符,卷积核数据或已重排序数据为NULL。或者,如果请求bias重排序(reorderBias > 0),bias数据或已重排序的bias数据为NULL。如果卷积核维度大小不是4,也会返回此状态。
MCDNN_STATUS_NOT_SUPPORTED
卷积核描述符数据类型不是MCDNN_DATA_INT8x32;卷积核描述符张量不是矢量化布局(MCDNN_TENSOR_NCHW_VECT_C)。
4.2.1.27. mcdnnSetConvolution2dDescriptor()
mcdnnStatus_t mcdnnSetConvolution2dDescriptor(
mcdnnConvolutionDescriptor_t convDesc,
int pad_h,
int pad_w,
int u,
int v,
int dilation_h,
int dilation_w,
mcdnnConvolutionMode_t mode,
mcdnnDataType_t computeType)
此函数将已创建的卷积描述符对象初始化为二维相关(2D correlation)。此函数假定张量和卷积核描述符与正向卷积路径相对应,并检查其设置是否有效。同一卷积描述符可以在对应同一层的反向路径中重用。
参数
convDesc
输入/输出。已创建的卷积描述符的句柄。
pad_h
输入。零填充高度:隐式连接到输入图像顶部和底部的零的行数。
pad_w
输入。零填充宽度:隐式连接到输入图像的左侧和右侧的零的列数。
u
输入。垂直卷积核步幅。
v
输入。水平卷积核步幅。
dilation_h
输入。卷积核高度扩张。
dilation_w
输入。卷积核宽度扩张。
mode
输入。在MCDNN_CONVOLUTION和MCDNN_CROSS_CORRELATION之间选择。
computeType
输入。计算精度。
返回值
MCDNN_STATUS_SUCCESS
目标设置成功。
MCDNN_STATUS_BAD_PARAM
需至少满足以下任一条件:
convDesc描述符为nil。
pad_h或pad_w参数为小于0的负数。
u或v参数为负数或0。
dilation_h或dilation_w参数为负数或0。
mode参数具有无效的枚举值。
4.2.1.28. mcdnnSetConvolutionGroupCount()
mcdnnStatus_t mcdnnSetConvolutionGroupCount(
mcdnnConvolutionDescriptor_t convDesc,
int groupCount)
此函数允许用户指定要在关联卷积中使用的组数。
参数
groupCount
输入。组数。
convDesc
输出。卷积层描述符。
返回值
MCDNN_STATUS_SUCCESS
组数设置成功。
MCDNN_STATUS_BAD_PARAM
提供的卷积描述符无效。
4.2.1.29. mcdnnSetConvolutionMathType
此函数允许用户指定是否允许在与给定卷积描述符关联的库函数中使用op张量。
mcdnnStatus_t mcdnnSetConvolutionMathType(
mcdnnConvolutionDescriptor_t convDesc,
mcdnnMathType_t mathType)
返回值
MCDNN_STATUS_SUCCESS
数学类型设置成功。
MCDNN_STATUS_BAD_PARAM
提供了无效的卷积描述符或指定了无效的数学类型。
4.2.1.30. mcdnnSetConvolutionNdDescriptor()
此函数将已创建的通用卷积描述符对象初始化为Nd相关。同一卷积描述符可以在对应同一层的反向路径中重用。卷积计算将以指定的dataType完成,这可能与输入/输出张量不同。
mcdnnStatus_t mcdnnSetConvolutionNdDescriptor(
mcdnnConvolutionDescriptor_t convDesc,
int arrayLength,
const int padA[],
const int filterStrideA[],
const int dilationA[],
mcdnnConvolutionMode_t mode,
mcdnnDataType_t dataType)
参数
convDesc
输入/输出。已创建的卷积描述符的句柄。
arrayLength
输入。卷积维度。
padA
输入。arrayLength维度的数组,包含每个维度的零填充大小。对于每个维度,在该维度每个元素的起始和结尾处,隐式连接的零的数量即为填充。
filterStrideA
输入。arrayLength维度的数组,包含每个维度的卷积核步幅。 对于每个维度,到达下一个点的过滤窗口的下一个起始处,要滑动的元素数量即为卷积核步幅。
dilationA
输入。arrayLength维度的数组,包含每个维度的扩张系数。
mode
输入。在MCDNN_CONVOLUTION和MCDNN_CROSS_CORRELATION之间选择。
datatype
输入。选择要进行计算的数据类型。
备注
不建议在mcdnnSetConvolutionNdDescriptor()中使用带有HALF_CONVOLUTION_BWD_FILTER的MCDNN_DATA_HALF,因为它对任何用于训练的实际用例都无用,并且在将来的mcDNN版本中将被视为被阻止。建议在mcdnnSetTensorNdDescriptor()中将MCDNN_DATA_HALF用于输入张量,在mcdnnSetConvolutionNdDescriptor()中使用带有HALF_CONVOLUTION_BWD_FILTER的MCDNN_DATA_FLOAT,并在许多通用深度学习框架中与自动混合精度(Automatic Mixed Precision,AMP)训练一起使用。
返回值
MCDNN_STATUS_SUCCESS
对象设置成功。
MCDNN_STATUS_BAD_PARAM
需至少满足以下任一条件:
convDesc描述符为nil。
arrayLengthRequest为负值。
mode具有无效的枚举值。
datatype具有无效的枚举值。
padA中任一元素为小于0的负数。
strideA中任一元素为负数或0。
dilationA中任一元素为负数或0。
MCDNN_STATUS_NOT_SUPPORTED
需至少满足以下任一条件: arrayLengthRequest大于MCDNN_DIM_MAX。
4.2.1.31. mcdnnSetConvolutionReorderType()
mcdnnStatus_t mcdnnSetConvolutionReorderType(
mcdnnConvolutionDescriptor_t convDesc,
mcdnnReorderType_t reorderType)
此函数对给定的卷积描述符设置卷积重排序类型。
参数
convDesc
输入。要为其设置重排序类型的卷积描述符。
reorderType
输入。将重排序类型设置为此值。更多信息,参见mcdnnReorderType_t。
返回值
MCDNN_STATUS_SUCCESS
已成功设置重排序类型。
MCDNN_STATUS_BAD_PARAM
不支持提供的重排序类型。