SetDeqScale
产品支持情况
产品 |
是否支持 |
|---|---|
Atlas 350 加速卡 |
√ |
√ |
|
√ |
|
x |
|
√ |
|
x |
|
x |
功能说明
设置DEQSCALE寄存器的值。
函数原型
- 用于AddDeqRelu/Cast/CastDeq的s322f16场景
1__aicore__ inline void SetDeqScale(half scale)
- 用于CastDeq(isVecDeq=false)的场景
1__aicore__ inline void SetDeqScale(float scale, int16_t offset, bool signMode)
- 用于CastDeq(isVecDeq=true)的场景
1 2
template <typename T> __aicore__ inline void SetDeqScale(const LocalTensor<T>& vdeq, const VdeqInfo& vdeqInfo)
参数说明
参数名 |
描述 |
|---|---|
T |
输入量化Tensor的数据类型。支持的数据类型为uint64_t。 |
参数名 |
输入/输出 |
描述 |
||
|---|---|---|---|---|
scale(half) |
输入 |
scale量化参数,half类型。 Atlas 350 加速卡:用于AddDeqRelu/CastDeq/Cast的s322f16场景。 |
||
scale(float) |
输入 |
scale量化参数,float类型。 用于CastDeq(isVecDeq=false)场景设置DEQSCALE寄存器的值。 |
||
offset |
输入 |
offset量化参数,int16_t类型,只有前9位有效。 用于CastDeq(isVecDeq=false)的场景,设置offset。 |
||
signMode |
输入 |
bool类型,表示量化结果是否带符号。 用于CastDeq(isVecDeq=false)的场景,设置signMode。 |
||
vdeq |
输入 |
用于CastDeq(isVecDeq=true)的场景,输入量化tensor,大小为128Byte。 类型为LocalTensor,支持的TPosition为VECIN/VECCALC/VECOUT。 LocalTensor的起始地址需要32字节对齐。 |
||
vdeqInfo |
输入 |
存储量化tensor信息的数据结构,结构体内包含量化tensor中的16组量化参数
|
返回值说明
无
约束说明
无
调用示例
- SetDeqScale(half scale)
1 2 3 4 5 6 7
// 配合Cast的s322f16场景使用 // dstLocal为half类型的LocalTensor,srcLocal为int32_t类型的LocalTensor uint32_t srcSize = 256; // 参与计算的元素个数 half scale = 1.0; // 量化参数为1 AscendC::SetDeqScale(scale); // dst = src AscendC::Cast(dstLocal, srcLocal, AscendC::RoundMode::CAST_NONE, srcSize);
结果示例如下:
输入数据(srcLocal): [1, 2, 3, 4, 5, 6, ... 256] 输出数据(dstLocal): [1, 2, 3, 4, 5, 6, ... 256]
- SetDeqScale(float scale, int16_t offset, bool signMode)
1 2 3 4 5 6 7 8 9
// 配合CastDeq(isVecDeq=false)场景使用 // dstLocal为int8_t类型的LocalTensor,srcLocal为int16_t类型的LocalTensor uint32_t srcSize = 256; // 参与计算的元素个数 float scale = 1.0; // 量化参数为1 int16_t offset = 0; // 不带偏移 bool signMode = true; // dstLocal为int8_t类型,为有符号数 AscendC::SetDeqScale(scale, offset, signMode); // dst = src AscendC::CastDeq<int8_t, int16_t, false, false>(dstLocal, srcLocal, srcSize);
结果示例如下:
输入数据(srcLocal): [[ 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 ] [ 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 ] [ 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 ] [ 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 ] [ 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 ] [ 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 ] [ 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 ] [ 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 ] 输出数据(dstLocal): // 写入dstLocal的上半Block [[0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0] [16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0] [32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0] [48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0] [64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0] [80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0] [96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0] [112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]]
- SetDeqScale(const LocalTensor<T>& vdeq, const VdeqInfo& vdeqInfo)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
// 配合CastDeq(isVecDeq=true)场景使用 // dstLocal为int8_t类型的LocalTensor,srcLocal为int16_t类型的LocalTensor uint32_t srcSize = 256; // 参与计算的元素个数 float vdeqScale[16] = { 0 }; int16_t vdeqOffset[16] = { 0 }; bool vdeqSignMode[16] = { 0 }; for (int i = 0; i < 16; i++) { vdeqScale[i] = 1.0; // 量化参数为1 vdeqOffset[i] = 0; // 不带偏移 vdeqSignMode[i] = true; // dstLocal为int8_t类型,为有符号数 } AscendC::VdeqInfo vdeqInfo(vdeqScale, vdeqOffset, vdeqSignMode); AscendC::SetDeqScale<uint64_t>(tmpBuffer, vdeqInfo); // dst = src AscendC::CastDeq<int8_t, int16_t, true, true>(dstLocal, srcLocal, srcSize);
结果示例如下:
输入数据(srcLocal): [[ 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 ] [ 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 ] [ 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 ] [ 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 ] [ 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 ] [ 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 ] [ 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 ] [ 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 ] 输出数据(dstLocal): // 写入dstLocal的下半Block [[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15] [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31] [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47] [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63] [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79] [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95] [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111] [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127]]