aclnnTransQuantParam
产品支持情况
| 产品 | 是否支持 |
|---|---|
| Ascend 950PR/Ascend 950DT | √ |
| Atlas A3 训练系列产品/Atlas A3 推理系列产品 | √ |
| Atlas A2 训练系列产品/Atlas A2 推理系列产品 | √ |
| Atlas 200I/500 A2 推理产品 | × |
| Atlas 推理系列产品 | × |
| Atlas 训练系列产品 | × |
功能说明
- 接口功能:将输入scale数据从FLOAT32类型转换为硬件需要的UINT64类型,并存储到quantParam中。
- 计算公式:
-
out为64位格式,初始为0。 -
scale按bit位取高19位截断,存储于out的bit位32位处,并将46位修改为1。out=out ∣ (scale & 0xFFFFE000) ∣ (1≪46)out = out\ |\ (scale\ \&\ 0xFFFFE000)\ |\ (1\ll46)
-
根据
offset取值进行后续计算:- 若
offset不存在,不再进行后续计算。 - 若
offset存在:-
将
offset值处理为int,范围为[-256, 255]。offset=Max(Min(INT(Round(offset)),255),−256)offset = Max(Min(INT(Round(offset)),255),-256)
-
再将
offset按bit位保留9位并存储于out的37到45位。out=(out & 0x4000FFFFFFFF) ∣ ((offset & 0x1FF)≪37)out = (out\ \&\ 0x4000FFFFFFFF)\ |\ ((offset\ \&\ 0x1FF)\ll37)
-
- 若
-
函数原型
aclnnStatus aclnnTransQuantParam(
const float *scaleArray,
uint64_t scaleSize,
const float *offsetArray,
uint64_t offsetSize,
uint64_t **quantParam,
uint64_t *quantParamSize)
aclnnTransQuantParam
-
参数说明:
参数名 输入/输出 描述 使用说明 数据类型 数据格式 维度(shape) 非连续Tensor scaleArray(float*) 输入 表示指向存储scale数据的内存,对应公式中的`scale`。 需要保证scale数据中不存在NaN和inf。 - - - - scaleSize(uint64_t) 输入 表示scale数据的数量。 需要自行保证`scaleSize`与`scaleArray`包含的元素个数相同。 - - - - offsetArray(float*) 输入 表示指向存储offset数据的内存,对应公式中的`offset`。 需要保证offset数据中不存在NaN和inf。 - - - - offsetSize(uint64_t) 输入 表示offset数据的数量。 需要自行保证`offsetSize`与`offsetArray`包含的元素个数相同。 - - - - quantParam(uint64_t**) 输出 表示指向存储转换得到的quantParam数据的内存的地址,对应公式中的`out`。 - - - - - quantParamSize(uint64_t*) 输出 表示存储quantParam数据的数量。 需要自行保证`quantParamSize`与`quantParam`包含的元素个数相同。 - - - - -
返回值
aclnnStatus:返回状态码,具体参见aclnn返回码。
接口完成入参校验,出现以下场景时报错:
返回码 错误码 描述 ACLNN_ERR_PARAM_NULLPTR 161001 参数quantParam是空指针。 参数scaleArray是空指针。 参数quantParamSize是空指针。 ACLNN_ERR_PARAM_INVALID 161002 当scaleArray不为空指针时,参数scaleSize < 1。 当offsetArray不为空指针时,参数offsetSize < 1。 当offsetArray为空指针时,参数offsetSize不等于0。 ACLNN_ERR_INNER_NULLPTR 561103 quantParam为空指针。
约束说明
- 确定性计算:
- aclnnTransQuantParam默认确定性实现。
调用示例
示例代码如下,仅供参考,具体编译和执行过程请参考编译与运行样例。
#include <iostream>
#include "acl/acl.h"
#include "aclnnop/aclnn_trans_quant_param.h"
#define CHECK_RET(cond, return_expr) \
do { \
if (!(cond)) { \
return_expr; \
} \
} while (0)
#define LOG_PRINT(message, ...) \
do { \
printf(message, ##__VA_ARGS__); \
} while (0)
int main()
{
float scaleArray[3] = {1.0, 1.0, 1.0};
uint64_t scaleSize = 3;
float offsetArray[3] = {1.0, 1.0, 1.0};
uint64_t offsetSize = 3;
uint64_t* result = nullptr;
uint64_t resultSize = 0;
auto ret = aclnnTransQuantParam(scaleArray, scaleSize, offsetArray, offsetSize, &result, &resultSize);
CHECK_RET(ret == ACL_SUCCESS, LOG_PRINT("aclnnTransQuantParam failed. ERROR: %d\n", ret); return ret);
for (auto i = 0; i < resultSize; i++) {
LOG_PRINT("result[%d] is: %ld\n", i, result[i]);
}
free(result);
return 0;
}