SetDeqScale
功能说明
- SetDeqScale(half scale):用于AddDeqRelu指令与Cast指令的s322f16场景。
- SetDeqScale(float scale, int16_t offset, bool signMode):用于CastDeq(isVecDeq=false)的场景。
- SetDeqScale(const LocalTensor<T>& vdeqTensor, const VdeqInfo& vdeqInfo):用于CastDeq(isVecDeq=true)的场景。
函数原型
__aicore__ inline void SetDeqScale(half scale);
__aicore__ inline void SetDeqScale(float scale, int16_t offset, bool signMode);
template <typename T> __aicore__ inline void SetDeqScale(const LocalTensor<T>& vdeqTensor, const VdeqInfo& vdeqInfo);
参数说明
参数名 |
输入/输出 |
描述 |
---|---|---|
scale(half) |
输入 |
half类型,表示一个half类型的数据。 Atlas推理系列产品AI Core:用于AddDeqRelu指令设置DEQSCALE寄存器的值。 Atlas A2训练系列产品/Atlas 800I A2推理产品,用于Cast指令的s322f16场景设置DEQSCALE寄存器的值。 |
scale(float) |
输入 |
float类型,表示一个float类型的数据。 用于CastDeq(isVecDeq=false)场景设置DEQSCALE寄存器的值。 |
offset |
输入 |
int16_t类型,表示一个s9类型的offset,入参只有前9位有效。 用于CastDeq(isVecDeq=false)的场景,设置offset。 |
signMode |
输入 |
bool类型,表示量化结果是否带符号。 用于CastDeq(isVecDeq=false)的场景,设置signMode。 |
vdeqTensor |
输入 |
类型为LocalTensor,支持的TPosition为VECIN/VECCALC/VECOUT。 表示UB中的一个128 Byte的量化tensor,以32B为单位。 用于CastDeq(isVecDeq=true)的场景,输入量化tensor。 |
vdeqInfo |
输入 |
存储量化tensor信息的数据结构,结构体内包含量化tensor中的16组量化参数 const uint8_t VDEQ_TENSOR_SIZE = 16; struct VdeqInfo { __aicore__ VdeqInfo() {} __aicore__ VdeqInfo(const float vdeqScaleIn[VDEQ_TENSOR_SIZE], const int16_t vdeqOffsetIn[VDEQ_TENSOR_SIZE], const bool vdeqSignModeIn[VDEQ_TENSOR_SIZE]) { for (int32_t i = 0; i < VDEQ_TENSOR_SIZE; ++i) { vdeqScale[i] = vdeqScaleIn[i]; vdeqOffset[i] = vdeqOffsetIn[i]; vdeqSignMode[i] = vdeqSignModeIn[i]; } } float vdeqScale[VDEQ_TENSOR_SIZE] = { 0 }; int16_t vdeqOffset[VDEQ_TENSOR_SIZE] = { 0 }; bool vdeqSignMode[VDEQ_TENSOR_SIZE] = { 0 }; };
|
返回值
无
支持的型号
Atlas推理系列产品AI Core
Atlas A2训练系列产品/Atlas 800I A2推理产品
约束说明
无
调用示例
LocalTensor<int8_t> dstLocal; LocalTensor<int16_t> srcLocal; LocalTensor<uint64_t> tmpBuffer; uint32_t srcSize = 256; // Cast LocalTensor<half> castDstLocal; LocalTensor<int32_t> castSrcLocal; half scale = 1.0; SetDeqScale(scale); Cast(castDstLocal, castSrcLocal, RoundMode::CAST_NONE, srcSize); // CastDeq float scale = 1.0; int16_t offset = 0; bool signMode = true; SetDeqScale(scale, offset, signMode); CastDeq<int8_t, int16_t, false, false>(dstLocal, srcLocal, srcSize); // CastVdeq float vdeqScale[16] = { 0 }; int16_t vdeqOffset[16] = { 0 }; bool vdeqSignMode[16] = { 0 }; for (int i = 0; i < 16; i++) { vdeqScale[i] = 1.0; vdeqOffset[i] = 0; vdeqSignMode[i] = true; } VdeqInfo vdeqInfo(vdeqScale, vdeqOffset, vdeqSignMode); SetDeqScale<uint64_t>(tmpBuffer, vdeqInfo); CastDeq<int8_t, int16_t, true, false>(dstLocal, srcLocal, srcSize);