Skip to content
版 本

Conv2D(废 弃)

产 品 支 持 情 况

产 品

是 否 支 持

Ascend 950PR/Ascend 950DT

x

Atlas A3 训 练 系 列 产 品/Atlas A3 推 理 系 列 产 品

x

Atlas A2 训 练 系 列 产 品/Atlas A2 推 理 系 列 产 品

x

Atlas 200I/500 A2 推 理 产 品

x

Atlas 推 理 系 列 产 品AI Core

Atlas 推 理 系 列 产 品Vector Core

x

Atlas 训 练 系 列 产 品

功 能 说 明

该 接 口 废 弃,并 将 在 后 续 版 本 移 除,请 不 要 使 用 该 接 口。

计 算 给 定 输 入 张 量 和 权 重 张 量 的2-D卷 积,输 出 结 果 张 量。Conv2d卷 积 层 多 用 于 图 像 识 别,使 用 过 滤 器 提 取 图 像 中 的 特 征。

函 数 原 型

Text
template <typename T, typename U>
__aicore__ inline void Conv2D(const LocalTensor<T>& dst, const LocalTensor<U>& featureMap, const LocalTensor<U>& weight, Conv2dParams& conv2dParams, Conv2dTilling& tilling)

入 参 中 的tiling结 构 需 要 通 过 如 下 切 分 方 案 计 算 接 口 来 获 取:

Text
template <typename T>
__aicore__ inline Conv2dTilling GetConv2dTiling(Conv2dParams& conv2dParams)

参 数 说 明

表 1 接 口 参 数 说 明

参 数 名 称

类 型

说 明

dst

输 出

目 的 操 作 数。

Atlas 训 练 系 列 产 品,支 持 的TPosition为:CO1,CO2

Atlas 推 理 系 列 产 品AI Core,支 持 的TPosition为:CO1,CO2

结 果 中 有 效 张 量 格 式 为[Cout/16, Ho, Wo, 16],大 小 为Cout * Ho * Wo,Ho与Wo可 以 根 据 其 他 数 据 计 算 得 出。

Ho = floor((H + pad_top + pad_bottom - dilation_h * (Kh - 1) - 1) / stride_h + 1)

Wo = floor((W + pad_left + pad_right - dilation_w * (Kw - 1) - 1) / stride_w + 1)

由 于 硬 件 要 求Ho*Wo需 为16倍 数,在 申 请dst Tensor时,shape应 向 上16对 齐,实 际 申 请shape大 小 应 为Cout * round_howo。

round_howo = ceil(Ho * Wo /16) * 16。

featureMap

输 入

输 入 张 量,Tensor的TPosition为A1。

输 入 张 量“feature_map”的 形 状,格 式 是[C1, H, W, C0]。

C1*C0为 输 入 的channel数,要 求 如 下:

  • 当feature_map的 数 据 类 型 为half时,C0=16。
  • 当feature_map的 数 据 类 型 为int8_t时,C0=32。
  • C1取 值 范 围:[1,4], 输 入 的channel的 范 围:[16,32,64,128]。

H为 高,取 值 范 围:[1,40]。

W为 宽,取 值 范 围:[1,40]。

weight

输 入

卷 积 核(权 重)张 量,Tensor的TPosition为B1。

卷 积 核 张 量“weight”的 形 状,格 式 是[C1, Kh, Kw, Cout, C0]。

C1*C0为 输 入 的channel数,对 于C0要 求 如 下:

  • 当feature_map的 数 据 类 型 为half时,C0=16。
  • 当feature_map的 数 据 类 型 为int8_t时,C0=32。
  • C1取 值 范 围:[1,4]。
  • kernel_shape输 入 的channel数 需 与fm_shape输 入 的channel数 保 持 一 致。

Cout为 卷 积 核 数 目,取 值 范 围:[16,32,64,128], Cout必 须 为16的 倍 数。

Kh为 卷 积 核 高;值 的 范 围:[1,5]。

Kw表 示 卷 积 核 宽;值 的 范 围:[1,5]。

conv2dParams

输 入

输 入 矩 阵 形 状 等 状 态 参 数,类 型 为Conv2dParams。结 构 体 具 体 定 义 为:

struct Conv2dParams {
    uint32_t imgShape[CONV2D_IMG_SIZE];       // [H, W]
    uint32_t kernelShapeIn[CONV2D_KERNEL_SIZE]; // [Kh, Kw]
    uint32_t stride[CONV2D_STRIDE];          // [stride_h, stride_w]
    uint32_t cin;                            // cin = C0 * C1;
    uint32_t cout;
    uint32_t padList[CONV2D_PAD];       // [pad_left, pad_right, pad_top, pad_bottom]
    uint32_t dilation[CONV2D_DILATION]; // [dilation_h, dilation_w]
    uint32_t initY;
    uint32_t partialSum;
};

tilling

输 入

分 形 控 制 参 数,类 型 为Conv2dTilling。结 构 体 具 体 定 义 为:

struct Conv2dTilling {
    const uint32_t blockSize = 16; // # M block size is always 16
    LoopMode loopMode = LoopMode::MODE_NM;
Text
uint32_t c0Size = 32;
uint32_t dTypeSize = 1;

uint32_t strideH = 0;
uint32_t strideW = 0;
uint32_t dilationH = 0;
uint32_t dilationW = 0;
uint32_t hi = 0;
uint32_t wi = 0;
uint32_t ho = 0;
uint32_t wo = 0;

uint32_t height = 0;
uint32_t width = 0;

uint32_t howo = 0;

uint32_t mNum = 0;
uint32_t nNum = 0;
uint32_t kNum = 0;

uint32_t mBlockNum = 0;
uint32_t kBlockNum = 0;
uint32_t nBlockNum = 0;

uint32_t roundM = 0;
uint32_t roundN = 0;
uint32_t roundK = 0;

uint32_t mTileBlock = 0;
uint32_t nTileBlock = 0;
uint32_t kTileBlock = 0;

uint32_t mIterNum = 0;
uint32_t nIterNum = 0;
uint32_t kIterNum = 0;

uint32_t mTileNums = 0;

bool mHasTail = false;
bool nHasTail = false;
bool kHasTail = false;

uint32_t kTailBlock = 0;
uint32_t mTailBlock = 0;
uint32_t nTailBlock = 0;

uint32_t mTailNums = 0;

};

表 2 Conv2DParams结 构 体 内 参 数 说 明:

参 数 名 称

类 型

说 明

imgShape

vector<int>

输 入 张 量“feature_map”的 形 状,格 式 是[ H, W]。
  • H为 高,取 值 范 围:[1,40]。
  • W为 宽,取 值 范 围:[1,40]。

kernelShape

vector<int>

卷 积 核 张 量“weight”的 形 状,格 式 是[Kh, Kw]。

  • Kh为 高,取 值 范 围:[1,5]。
  • Kw为 宽,取 值 范 围:[1,5]。

stride

vector<int>

卷 积 步 长,格 式 是[stride_h, stride_w]。
  • stride_h表 示 步 长 高, 值 的 范 围:[1,4]。
  • stride_w表 示 步 长 宽, 值 的 范 围:[1,4]。

cin

int

分 形 排 布 参 数,Cin = C1 * C0,Cin为 输 入 的channel数,C1取 值 范 围:[1,4]。

  • 当feature_map的 数 据 类 型 为float时,C0=8。输 入 的channel的 范 围:[8,16,24,32]。
  • 当feature_map的 数 据 类 型 为half时,C0=16。输 入 的channel的 范 围:[16,32,48,64]。
  • 当feature_map的 数 据 类 型 为int8_t时,C0=32。输 入 的channel的 范 围:[32,64,96,128]。

cout

int

Cout为 卷 积 核 数 目,取 值 范 围:[16,32,64,128], Cout必 须 为16的 倍 数。

padList

vector<int>

padding行 数/列 数,格 式 是[pad_left, pad_right, pad_top, pad_bottom]。
  • pad_left为feature_map左 侧pad列 数,范 围[0,4]。pad_right为feature_map右 侧pad列 数,范 围[0,4]。
  • pad_top为feature_map顶 部pad行 数,范 围[0,4]。
  • pad_bottom为feature_map底 部pad行 数,范 围[0,4]。

dilation

vector<int>

空 洞 卷 积 参 数,格 式[dilation_h, dilation_w]。
  • dilation_h为 空 洞 高,范 围:[1,4]。
  • dilation_w为 空 洞 宽,范 围:[1,4]。

膨 胀 后 卷 积 核 宽 为dilation_w * (Kw - 1) + 1,高 为dilation_h * (Kh - 1) + 1。

initY

uint32_t

表 示dst是 否 需 要 初 始 化。

  • 取 值0:不 使 用bias,L0C需 要 初 始 化,dst初 始 矩 阵 保 存 有 之 前 结 果,新 计 算 结 果 会 累 加 前 一 次conv2d计 算 结 果。
  • 取 值1:不 使 用bias,L0C不 需 要 初 始 化,dst初 始 矩 阵 中 数 据 无 意 义,计 算 结 果 直 接 覆 盖dst中 的 数 据。

partialSum

uint32_t

当dst参 数 所 在 的TPosition为CO2时,通 过 该 参 数 控 制 计 算 结 果 是 否 搬 出。
  • 取 值0:搬 出 计 算 结 果
  • 取 值1:不 搬 出 计 算 结 果,可 以 进 行 后 续 计 算

表 3 Conv2dTilling结 构 体 内 参 数 说 明

参 数 名 称

类 型

说 明

blockSize

uint32_t

固 定 值,恒 为16,一 个 维 度 内 存 放 的 元 素 个 数。

loopMode

LoopMode

遍 历 模 式,结 构 体 具 体 定 义 为:

enum class LoopMode {
    MODE_NM = 0,
    MODE_MN = 1,
    MODE_KM = 2,
    MODE_KN = 3
};

c0Size

uint32_t

一 个block的 字 节 长 度,范 围[16或 者32]。

dtypeSize

uint32_t

传 入 的 数 据 类 型 的 字 节 长 度,范 围[1, 2]。

strideH

uint32_t

卷 积 步 长-高,范 围:[1,4]。

strideW

uint32_t

卷 积 步 长-宽,范 围:[1,4]。

dilationH

uint32_t

空 洞 卷 积 参 数-高,范 围:[1,4]。

dilationW

uint32_t

空 洞 卷 积 参 数-宽,范 围:[1,4]。

hi

uint32_t

feature_map形 状-高,范 围:[1,40]。

wi

uint32_t

feature_map形 状-宽,范 围:[1,40]。

ho

uint32_t

feature_map形 状-高,范 围:[1,40]。

wo

uint32_t

feature_map形 状-宽,范 围:[1,40]。

height

uint32_t

weight形 状-高,[1,5]。

width

uint32_t

weight形 状-宽,[1,5]。

howo

uint32_t

feature_map形 状 大 小,为ho * wo。

mNum

uint32_t

M轴 等 效 数 据 长 度 参 数 值,范 围:[1,4096]。

nNum

uint32_t

N轴 等 效 数 据 长 度 参 数 值,范 围:[1,4096]。

kNum

uint32_t

K轴 等 效 数 据 长 度 参 数 值,范 围:[1,4096]。

roundM

uint32_t

M轴 等 效 数 据 长 度 参 数 值 且 以blockSize为 倍 数 向 上 取 整,范 围:[1,4096]。

roundN

uint32_t

N轴 等 效 数 据 长 度 参 数 值 且 以blockSize为 倍 数 向 上 取 整,范 围:[1,4096]。

roundK

uint32_t

K轴 等 效 数 据 长 度 参 数 值 且 以c0Size为 倍 数 向 上 取 整,范 围:[1,4096]。

mBlockNum

uint32_t

M轴Block个 数,mBlockNum = mNum / blockSize,范 围:[1,4096]。

nBlockNum

uint32_t

N轴Block个 数,nBlockNum = nNum / blockSize,范 围:[1,4096]。

kBlockNum

uint32_t

K轴Block个 数,kBlockNum = kNum / blockSize,范 围:[1,4096]。

mIterNum

uint32_t

遍 历M轴 维 度 数 量,范 围:[1,4096]。

nIterNum

uint32_t

遍 历N轴 维 度 数 量,范 围:[1,4096]。

kIterNum

uint32_t

遍 历K轴 维 度 数 量,范 围:[1,4096]。

mTileBlock

uint32_t

M轴 切 分 块 个 数,范 围:[1,4096]。

nTileBlock

uint32_t

N轴 切 分 块 个 数,范 围:[1,4096]。

kTileBlock

uint32_t

K轴 切 分 块 个 数,范 围:[1,4096]。

kTailBlock

uint32_t

K轴 尾 块 个 数,范 围:[1,4096]。

mTailBlock

uint32_t

M轴 尾 块 个 数,范 围:[1,4096]。

nTailBlock

uint32_t

N轴 尾 块 个 数,范 围:[1,4096]。

kHasTail

bool

K轴 是 否 存 在 尾 块。

mHasTail

bool

M轴 是 否 存 在 尾 块。

nHasTail

bool

N轴 是 否 存 在 尾 块。

mTileNums

uint32_t

M轴 切 分 块 个 数 的 长 度,范 围:[1,4096]。

mTailNums

uint32_t

M轴 尾 块 个 数 的 长 度,范 围:[1,4096]。

表 4 imgShape、kernelShape和dst的 数 据 类 型 组 合

feature_map.dtype

weight.dtype

dst.dtype

int8_t

int8_t

int32_t

half

half

float

half

half

half

约 束 说 明

  • 该 接 口 当 前 不 支 持W=Kw并 且H>Kh的 场 景,其 将 产 生 不 可 预 期 的 结 果。
  • 操 作 数 地 址 对 齐 要 求 请 参 见通 用 地 址 对 齐 约 束

免 责 声 明:本 站 内 容 由 asc-devkit 仓 master 分 支 自 动 编 译 生 成,属 于 持 续 开 发 版 本,可 能 存 在 缺 陷,仅 供 预 览 与 参 考。如 需 稳 定 及 商 用 资 料,请 查 阅 官 方 昇 腾 社 区