增强数据搬运接口,相比于普通数据搬运接口,在CO1->CO2通路时,通过设置DataCopyEnhancedParams参数增加随路计算,其他通路情况下,DataCopyEnhancedParams不生效,等同于普通数据搬运的功能。
template <typename T> __aicore__ inline void DataCopy(const LocalTensor<T>& dstLocal, const GlobalTensor<T>& srcGlobal, const DataCopyParams& intriParams, const DataCopyEnhancedParams& enhancedParams)
该原型接口支持的数据通路和数据类型如下所示:
支持型号 |
数据通路 |
源操作数和目的操作数的数据类型 (两者保持一致) |
DatacopyEnhanceParams是否生效 |
---|---|---|---|
Atlas 训练系列产品 |
GM -> VECIN |
int8_t / uint8_t / int16_t / uint16_t / int32_t / uint32_t / half / float |
否 |
Atlas 训练系列产品 |
GM -> A1/B1 |
int8_t / uint8_t / int16_t / uint16_t / int32_t / uint32_t / half / float |
否 |
Atlas推理系列产品AI Core |
GM -> VECIN |
int8_t / uint8_t / int16_t / uint16_t / int32_t / uint32_t / half / float |
否 |
Atlas推理系列产品AI Core |
GM -> A1/B1 |
int8_t / uint8_t / int16_t / uint16_t / int32_t / uint32_t / half / float |
否 |
Atlas推理系列产品Vector Core |
GM -> VECIN |
int8_t / uint8_t / int16_t / uint16_t / int32_t / uint32_t / half / float |
否 |
Atlas A2训练系列产品/Atlas 800I A2推理产品 |
GM -> VECIN |
int8_t / uint8_t / int16_t / uint16_t / int32_t / uint32_t / half / float |
否 |
Atlas A2训练系列产品/Atlas 800I A2推理产品 |
GM -> A1 / B1 |
int8_t / uint8_t / int16_t / uint16_t / int32_t / uint32_t / half / float |
否 |
Atlas 200I/500 A2推理产品 |
GM -> VECIN |
int8_t / uint8_t / int16_t / uint16_t / int32_t / uint32_t / half / float |
否 |
template <typename T> __aicore__ inline void DataCopy(const LocalTensor<T>& dstLocal, const LocalTensor<T>& srcLocal, const DataCopyParams& intriParams, const DataCopyEnhancedParams& enhancedParams)
该原型接口支持的数据通路和数据类型如下所示:
支持型号 |
数据通路 |
源操作数和目的操作数的数据类型 (两者保持一致) |
DatacopyEnhanceParams是否生效 |
---|---|---|---|
Atlas 训练系列产品 |
VECIN -> VECCALC, VECCALC->VECOUT |
int8_t / uint8_t / int16_t / uint16_t / int32_t / uint32_t / half / float |
否 |
Atlas推理系列产品AI Core |
VECIN -> VECCALC, VECCALC->VECOUT |
int8_t / uint8_t / int16_t / uint16_t / int32_t / uint32_t / half / float |
否 |
Atlas推理系列产品AI Core |
VECIN/VECCALC/VECOUT -> A1/B1 |
int8_t / uint8_t / int16_t / uint16_t / int32_t / uint32_t / half / float |
否 |
Atlas推理系列产品AI Core |
CO1 -> CO2 |
half / float / int32_t / uint32_t |
是 |
Atlas A2训练系列产品/Atlas 800I A2推理产品 |
VECIN -> VECCALC, VECCALC->VECOUT |
int8_t / uint8_t / int16_t / uint16_t / int32_t / uint32_t / half / float |
否 |
Atlas A2训练系列产品/Atlas 800I A2推理产品 |
VECIN/VECCALC/VECOUT -> TSCM |
int8_t / uint8_t / int16_t / uint16_t / int32_t / uint32_t / half / float |
否 |
template <typename T> __aicore__ inline void DataCopy(const GlobalTensor<T>& dstGlobal, const LocalTensor<T>& srcLocal, const DataCopyParams& intriParams, const DataCopyEnhancedParams& enhancedParams)
该原型接口支持的数据通路和数据类型如下所示:
支持型号 |
数据通路 |
源操作数和目的操作数的数据类型 (两者保持一致) |
DatacopyEnhanceParams是否生效 |
---|---|---|---|
Atlas 训练系列产品 |
VECOUT -> GM |
int8_t / uint8_t / int16_t / uint16_t / int32_t / uint32_t / half / float |
否 |
Atlas推理系列产品AI Core |
VECOUT -> GM |
int8_t / uint8_t / int16_t / uint16_t / int32_t / uint32_t / half / float |
否 |
Atlas推理系列产品AI Core |
CO2 -> GM |
int8_t / uint8_t / int16_t / uint16_t / int32_t / uint32_t / half / float |
否 |
Atlas推理系列产品Vector Core |
VECOUT -> GM |
int8_t / uint8_t / int16_t / uint16_t / int32_t / uint32_t / half / float |
否 |
Atlas A2训练系列产品/Atlas 800I A2推理产品 |
VECOUT -> GM |
int8_t / uint8_t / int16_t / uint16_t / int32_t / uint32_t / half / float |
否 |
Atlas A2训练系列产品/Atlas 800I A2推理产品 |
A1/B1 -> GM |
int8_t / uint8_t / int16_t / uint16_t / int32_t / uint32_t / half / float |
否 |
Atlas 200I/500 A2推理产品 |
VECOUT -> GM |
int8_t / uint8_t / int16_t / uint16_t / int32_t / uint32_t / half / float |
否 |
template <typename T, typename U> __aicore__ inline void DataCopy(const LocalTensor<T>& dstLocal, const LocalTensor<U>& srcLocal, const DataCopyParams& intriParams, const DataCopyEnhancedParams& enhancedParams);
支持型号 |
数据通路 |
源操作数的数据类型 |
目的操作数的数据类型 |
DatacopyEnhanceParams是否生效 |
---|---|---|---|---|
Atlas推理系列产品AI Core |
CO1 -> CO2 |
float |
half |
是(量化相关参数不生效,relu标志生效) |
Atlas推理系列产品AI Core |
CO1 -> CO2 |
int32_t |
int8_t/ uint8_t / int16_t / half |
是(量化相关参数生效,relu标志生效) |
参数名称 |
输入/输出 |
含义 |
---|---|---|
dstLocal, dstGlobal |
输出 |
目的操作数,类型为LocalTensor或GlobalTensor。支持的数据类型为:half/int16_t/uint16_t/float/int32_t/uint32_t/int8_t/uint8_t。 |
srcLocal, srcGlobal |
输入 |
源操作数,类型为LocalTensor或GlobalTensor。支持的数据类型为:half/int16_t/uint16_t/float/int32_t/uint32_t/int8_t/uint8_t。 |
intriParams |
输入 |
搬运参数。DataCopyParams类型,DataCopyParams结构定义请参考表6。 |
enhancedParams |
输入 |
增强信息参数。 DataCopyEnhancedParams类型, DataCopyEnhancedParams结构定义如下: struct DataCopyEnhancedParams { BlockMode blockMode = BlockMode::BLOCK_MODE_NORMAL; DeqScale deqScale = DeqScale::DEQ_NONE; uint64_t deqValue = 0; uint8_t sidStoreMode = 0; bool isRelu = false; pad_t padMode = pad_t::PAD_NONE; uint64_t padValue = 0; uint64_t deqTensorAddr = 0; }; 具体参数说明请参考表6。 |
参数名称 |
含义 |
---|---|
blockMode |
数据搬移基本分形,BlockMode枚举类型,支持以下配置:
每种模式下对应的blockCount等参数单位见表7。 |
deqScale |
随路精度转换辅助参数,即量化模式,支持的量化模式取值和对应的数据类型等信息请参考表8。其中DEQ、DEQ8、DEQ16模式,需要传入deqValue量化系数;VDEQ、VDEQ8、VDEQ16模式,需要传入包含16个元素(deqValue)的量化参数向量。 |
deqValue |
量化系数。 deqValue的配置方式请参考表9。 |
deqTensorAddr |
量化参数向量地址。deqScale为VDEQ8/VDEQ16模式时,需要传入反量化运算时的参数向量的地址。具体配置方式参考表10。 |
sidStoreMode |
用于deqScale为DEQ8/VDEQ8时配置存储模式,控制反量化结果如何存储在dst地址中。配置效果参考图1。
|
isRelu |
配置是否可以随路做线性整流操作。 |
padMode |
预留参数,当前暂不支持。 |
blockMode |
src |
dst |
数据类型 |
blockCount 单位 |
srcStride单位 |
dstStride单位 |
---|---|---|---|---|---|---|
BLOCK_MODE_NORMAL |
GM |
A1 |
half/int16_t/uint16_t/float/int32_t/uint32_t/int8_t/uint8_t |
32B |
32B |
32B |
GM |
B1 |
half/int16_t/uint16_t/float/int32_t/uint32_t/int8_t/uint8_t |
32B |
32B |
32B |
|
GM |
VECIN |
half/int16_t/uint16_t/float/int32_t/uint32_t/int8_t/uint8_t |
32B |
32B |
32B |
|
VECOUT |
GM |
half/int16_t/uint16_t/float/int32_t/uint32_t/int8_t/uint8_t |
32B |
32B |
32B |
|
VECIN |
VECOUT |
half/int16_t/uint16_t/float/int32_t/uint32_t/int8_t/uint8_t |
32B |
32B |
32B |
|
BLOCK_MODE_MATRIX |
CO1 |
CO2 |
half/int16_t/uint16_t |
512B |
512B |
32B |
CO1 |
CO2 |
float/int32_t/uint32_t |
1024B |
1024B |
32B |
|
BLOCK_MODE_VECTOR |
CO1 |
CO2 |
half/int16_t/uint16_t |
32B |
512B |
32B |
CO1 |
CO2 |
float/int32_t/uint32_t |
64B |
1024B |
32B |
量化模式 |
src.dtype |
dst.dtype |
注意事项 |
---|---|---|---|
DEQ |
int32_t |
half |
暂不支持 |
DEQ |
half |
half |
暂不支持 |
DEQ8 |
int32_t |
int8_t |
需要更新deqValue的对应比特位。 |
DEQ8 |
int32_t |
uint8_t |
|
DEQ16 |
int32_t |
half |
|
DEQ16 |
int32_t |
int16_t |
|
VDEQ |
int32_t |
half |
暂不支持 |
VDEQ8 |
int32_t |
int8_t |
需要更新deqTensorAddr的对应比特位,同时保证DEQADDR中存储的128Byte反量化参数向量的每个元素(deqValue)都符合预期和使用限制。 针对DEQADDR存储的16个64bit的反量化元素,第i%16个反量化元素与第i个源操作数的int32_t元素进行DEQ8/DEQ16的计算。i是源操作数的索引。 同一个反量化参数向量的每一个元素的MCB标志位必须一致。 |
VDEQ8 |
int32_t |
uint8_t |
|
VDEQ16 |
int32_t |
half |
|
VDEQ16 |
int32_t |
int16_t |
模式 |
比特位数 |
变量名 |
作用介绍 |
---|---|---|---|
DEQ8、VDEQ8、DEQ16、VDEQ16 |
0~31 |
M |
32位数视为float, 作为反量化计算所需要乘的值。src为int32_t, dst为int16_t的场景下,变量M不生效。 |
32~35 |
N |
4位比特位,表示范围为[1, 16](b'0000对应表示1, b'1111对应表示16)。 当模式为DEQ8、VDEQ8时,MCB标志位置为1时,将输入的值进行右移N比特位。当模式为DEQ16、VDEQ16并且dst数据类型为int16_t时,直接进行N位的右移,不受MCB标志位控制。 |
|
36 |
MCB标志位 |
Mode Control Bit。如果置为0,输入的int32_t会被直接转换为float。如果置为1,输入的int32_t会先右移N比特位,转变成int16_t,然后转换为float。 |
|
37~45 |
offset |
9bit的整形数据,在进行反量化 src * M的计算结果后与offset进行相加。仅在DEQ8、VDEQ8模式中会用到。如果不使用offset,请置为0。 |
|
46 |
sign标志位 |
如果置为1,表明反量化结果是signed(int8);如果为置为0,表明反量化结果是unsigned(uint8)。仅在DEQ8、VDEQ8模式中会用到。 |
|
47 |
RELU标志位 |
如果置为1,对最终结果进行RELU计算;如果置为0,不进行额外计算。
|
|
48~63 |
- |
预留 |
|
DEQ、VDEQ |
暂不支持 |
比特位数 |
变量名 |
作用介绍 |
---|---|---|
0~13 |
DEQADDR |
UB中存储反量化参数向量的起始地址。该地址要满足32B对齐。反量化参数向量中的每个元素大小都为64bit。 搬运时会搬运blockCount个连续传输数据块,每个数据块的长度为blockLen。每个数据块对应一个128Byte的反量化向量。对于同一个数据块,反量化参数向量中的16个元素会被连续复用。不同的数据块,对应不同的反量化参数向量,地址会相应的偏移128B。例如:假设DEQADDR对应起始地址为A,第一个数据块的128B反量化参数向量起始地址为A,第一个数据块的128B反量化参数向量起始地址为A + 128B。 |
15 |
RELU标志位 |
如果置为1,对最终结果进行RELU计算;如果置为0,不进行额外计算。对于VDEQ、VDEQ8、VDEQ16模式,以该标志位为准,每个向量元素中的RELU标志位不生效。 |
14,16~63 |
- |
预留 |
Atlas 训练系列产品
Atlas推理系列产品AI Core
Atlas推理系列产品Vector Core
Atlas A2训练系列产品/Atlas 800I A2推理产品
Atlas 200I/500 A2推理产品