对于特定输入输出数据类型,Matmul支持将计算结果从CO1搬出到Global Memory时,对输出C矩阵元素执行数据量化或反量化操作。
模式 |
Tiling侧接口 |
Kernel侧接口 |
---|---|---|
同一系数的量化/反量化 |
SetDequantType(DequantType::SCALAR) |
SetQuantScalar(gmScalar) |
向量的量化/反量化 |
SetDequantType(DequantType::TENSOR) |
SetQuantVector(gmTensor) |
需要对矩阵计算结果进行量化/反量化操作的场景,当前该场景下,Matmul输入输出矩阵支持的数据类型如下表所示。
A矩阵 |
B矩阵 |
C矩阵 |
支持平台 |
---|---|---|---|
half |
half |
int8_t |
|
bfloat16_t |
bfloat16_t |
int8_t |
|
int8_t |
int8_t |
half |
|
int4b_t |
int4b_t |
half |
|
int8_t |
int8_t |
int8_t |
|
1 2 3 4 5 6 7 8 9 10 11 12 |
auto ascendcPlatform = platform_ascendc::PlatformAscendC(context->GetPlatformInfo()); matmul_tiling::MatmulApiTiling tiling(ascendcPlatform); tiling.SetAType(matmul_tiling::TPosition::GM, matmul_tiling::CubeFormat::ND, matmul_tiling::DataType::DT_INT8); tiling.SetBType(matmul_tiling::TPosition::GM, matmul_tiling::CubeFormat::ND, matmul_tiling::DataType::DT_INT8); tiling.SetCType(matmul_tiling::TPosition::GM, matmul_tiling::CubeFormat::ND, matmul_tiling::DataType::DT_INT32); tiling.SetBiasType(matmul_tiling::TPosition::GM, matmul_tiling::CubeFormat::ND, matmul_tiling::DataType::DT_INT32); tiling.SetShape(M, N, K); tiling.SetOrgShape(M, N, K); tiling.EnableBias(true); tiling.SetDequantType(DequantType::SCALAR); // 设置同一系数的量化/反量化模式 // tiling.SetDequantType(DequantType::TENSOR); // 设置向量的量化/反量化模式 ... // 执行其他配置 |
1 2 3 4 5 6 7 8 |
REGIST_MATMUL_OBJ(&pipe, GetSysWorkSpacePtr(), mm, &tiling); float tmp = 0.1; // 输出gm时会乘以0.1 uint64_t ans = static_cast<uint64_t>(*reinterpret_cast<int32_t*>(&tmp)); // 浮点值量化系数转换为uint64_t类型进行设置 mm.SetQuantScalar(ans); mm.SetTensorA(gm_a); mm.SetTensorB(gm_b); mm.SetBias(gm_bias); mm.IterateAll(gm_c); |
1 2 3 4 5 6 7 8 |
GlobalTensor gmQuant; ... REGIST_MATMUL_OBJ(&pipe, GetSysWorkSpacePtr(), mm, &tiling); mm.SetQuantVector(gmQuant); mm.SetTensorA(gm_a); mm.SetTensorB(gm_b); mm.SetBias(gm_bias); mm.IterateAll(gm_c); |