核心概念#

本节介绍 cuDNN 的核心概念。

cuDNN 句柄#

cuDNN 库公开了主机 API,但假定对于使用 GPU 的操作,必要的数据可以直接从设备访问。

使用 cuDNN 的应用程序必须初始化一个句柄到库上下文。

张量和布局#

cuDNN 操作以张量作为输入,并生成张量作为输出。

张量描述符#

cuDNN 库使用通用的 n 维张量描述符来描述数据,该描述符由以下参数定义

  • 维度数量从 3 到 8

  • 数据类型(32 位浮点型、64 位浮点型、16 位浮点型…)

  • 定义每个维度大小的整数数组

  • 定义每个维度步长的整数数组(例如,从同一维度到达下一个元素需要添加的元素数量)

此张量定义允许例如通过使一个维度的步长小于下一个维度的维度和步长的乘积,在同一张量内使某些维度重叠。在 cuDNN 中,除非另有说明,否则所有例程都将支持具有重叠维度的前向传递输入张量,但是,输出张量的维度不能重叠。即使此张量格式支持负步长(这对于数据镜像可能很有用),除非另有说明,否则 cuDNN 例程不支持具有负步长的张量。

WXYZ 张量描述符#

张量描述符格式使用首字母缩略词标识,每个字母引用一个对应的维度。在本文档中,术语的使用意味着

  • 所有步长都严格为正

  • 字母引用的维度按照其各自步长递减的顺序排序

3-D 张量描述符#

3-D 张量通常用于矩阵乘法,使用三个字母:B、M 和 N。B 表示批大小(对于批量矩阵乘法),M 表示行数,N 表示列数。有关更多信息,请参阅CUDNN_BACKEND_OPERATION_MATMUL_DESCRIPTOR 操作。

4-D 张量描述符#

4-D 张量描述符用于定义 2D 图像批次的格式,使用 4 个字母:N、C、H、W 分别表示批大小、特征图数量、高度和宽度。字母按照步长递减的顺序排序。常用的 4-D 张量格式有

  • NCHW

  • NHWC

  • CHWN

5-D 张量描述符#

5-D 张量描述符用于定义 3D 图像批次的格式,使用 5 个字母:N、C、D、H、W 分别表示批大小、特征图数量、深度、高度和宽度。字母按照步长递减的顺序排序。常用的 5-D 张量格式称为

  • NCDHW

  • NDHWC

  • CDHWN

完全 packed 张量#

一个张量被定义为 XYZ-fully-packed,当且仅当

  • 张量维度的数量等于 fully-packed 后缀之前的字母数量

  • 第 i 个维度的步长等于第 (i+1) 个维度乘以第 (i+1) 个步长的乘积

  • 最后一个维度的步长为 1

部分 packed 张量#

部分 XYZ-packed 术语仅适用于使用用于定义部分 packed 张量的字母超集描述的张量格式的上下文中。WXYZ 张量被定义为 XYZ-packed,当且仅当

  • 所有未在 -packed 后缀中引用的维度的步长大于或等于下一个维度乘以下一个步长的乘积。

  • 在位置 i 的 -packed 后缀中引用的每个维度的步长等于第 (i+1) 个维度乘以第 (i+1) 个步长的乘积。

  • 如果最后一个张量的维度存在于 -packed 后缀中,则其步长为 1。

例如,NHWC 张量 WC-packed 意味着 c_stride 等于 1,w_stride 等于 c_dim x c_stride。在实践中,-packed 后缀通常应用于张量的次要维度,但也可能仅应用于主要维度;例如,仅为 N-packed 的 NCHW 张量。

空间 packed 张量#

空间 packed 张量被定义为在空间维度上部分 packed。例如,空间 packed 的 4D 张量意味着该张量是 NCHW HW-packed 或 CNHW HW-packed。

重叠张量#

如果遍历维度全范围会多次产生相同的地址,则张量被定义为重叠的。实际上,重叠张量对于某些来自 [1,nbDims] 区间的 i 将具有 stride[i-1] < stride[i]*dim[i]

数据布局格式#

本节介绍 cuDNN 张量如何根据几种数据布局格式在内存中排列。

指定张量布局格式的推荐方法是相应地设置其步长。为了与 v7 API 兼容,还可以通过 cudnnTensorFormat_t 枚举配置布局格式的子集。提供该枚举仅出于遗留原因,并且已被弃用。

示例张量#

考虑具有以下维度的图像批次

  • N 是批大小;1

  • C 是特征图的数量(即,通道数);64

  • H 是图像高度;5

  • W 是图像宽度;4

为了使示例简单,图像像素元素表示为整数序列 0、1、2、3,依此类推。

Example with N=1, C=64, H=5, W=4

在以下小节中,我们将使用上述示例来演示不同的布局格式。

卷积布局#

cuDNN 支持几种卷积布局,如下节所述。

NCHW 内存布局#

上面的 4D 张量以 NCHW 格式在内存中布局,如下所示

  1. 从第一个通道 (c=0) 开始,元素以行优先顺序连续排列。

  2. 继续第二个和后续通道,直到所有通道的元素都布局完毕。

  3. 继续下一个批次(如果 N > 1)。

NCHW Memory Layout
NHWC 内存布局#

对于 NHWC 内存布局,首先布局所有 C 通道中的对应元素,如下所示

  1. 从通道 0 的第一个元素开始,然后进行到通道 1 的第一个元素,依此类推,直到布局完所有 C 通道的第一个元素。

  2. 接下来,选择通道 0 的第二个元素,然后进行到通道 1 的第二个元素,依此类推,直到布局完所有通道的第二个元素。

  3. 按照通道 0 的行优先顺序完成所有元素。

  4. 继续下一个批次(如果 N > 1)。

NHWC Memory Layout
NC/32HW32 内存布局#

NC/32HW32 类似于 NHWC,但有一个关键区别。对于 NC/32HW32 内存布局,64 个通道被分成两组,每组 32 个通道 - 第一组由通道 c0c31 组成,第二组由通道 c32c63 组成。然后,每组都使用 NHWC 格式布局。

NC/32HW32 Memory Layout

对于广义的 NC/xHWx 布局格式,以下观察结果适用

  • 只有通道维度 C 被分组为每组 x 个通道。

  • x = 1 时,每组只有一个通道。因此,一个通道(即,一组)的元素在进行到下一组(即,下一个通道)之前,是连续排列的(以行优先顺序)。这与 NCHW 格式相同。

  • x = C 时,则 NC/xHWx 与 NHWC 相同,也就是说,整个通道深度 C 被视为一个组。情况 x = C 可以被认为是将整个 C 维度向量化为一个大向量,布局所有的 C,然后是剩余维度,就像 NHWC 一样。

  • 张量格式 cudnnTensorFormat_t 也可以用以下方式解释 - NCHW INT8x32 格式实际上是 N x (C/32) x H x W x 32 (每个 W 有 32 个 C),就像 NCHW INT8x4 格式是 N x (C/4) x H x W x 4 (每个 W 有 4 个 C)。因此得名 VECT_C - 每个 W 都是 C 的向量(4 或 32)。

矩阵乘法布局#

3-D 张量描述符中所讨论的,矩阵乘法使用 3D 张量,使用 BMN 维度描述。布局可以通过以下步长指定。以下是两个推荐布局的示例

  • Packed 行优先:维度 [B,M,N],步长 [MN, N, 1],或

  • Packed 列优先:维度 [B,M,N],步长 [MN, 1, M]

也支持 3D 张量的 Unpacked 布局,但它们的支持面更不规则。