aclnnTransQuantParam

📄 查看源码

产品支持情况

产品 是否支持
Ascend 950PR/Ascend 950DT
Atlas A3 训练系列产品/Atlas A3 推理系列产品
Atlas A2 训练系列产品/Atlas A2 推理系列产品
Atlas 200I/500 A2 推理产品 ×
Atlas 推理系列产品 ×
Atlas 训练系列产品 ×

功能说明

  • 接口功能:将输入scale数据从FLOAT32类型转换为硬件需要的UINT64类型,并存储到quantParam中。
  • 计算公式:
    1. out为64位格式,初始为0。

    2. scale按bit位取高19位截断,存储于out的bit位32位处,并将46位修改为1。

      out=out ∣ (scale & 0xFFFFE000) ∣ (1≪46)out = out\ |\ (scale\ \&\ 0xFFFFE000)\ |\ (1\ll46)

    3. 根据offset取值进行后续计算:

      • offset不存在,不再进行后续计算。
      • offset存在:
        1. offset值处理为int,范围为[-256, 255]。

          offset=Max(Min(INT(Round(offset)),255),−256)offset = Max(Min(INT(Round(offset)),255),-256)

        2. 再将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;
}