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);