From b550b5dbfe7aeac6bf3f32a67f942601f1c828c5 Mon Sep 17 00:00:00 2001 From: tony <292224750@qq.com> Date: Fri, 9 Jun 2023 11:29:52 +0800 Subject: [PATCH] 1. add int8/int16 feature --- src/CPPAlgos/INT8CPPAlgo.cpp | 23 +++++++++++++++++------ 1 file changed, 17 insertions(+), 6 deletions(-) diff --git a/src/CPPAlgos/INT8CPPAlgo.cpp b/src/CPPAlgos/INT8CPPAlgo.cpp index b6e674aa..f4a485da 100644 --- a/src/CPPAlgos/INT8CPPAlgo.cpp +++ b/src/CPPAlgos/INT8CPPAlgo.cpp @@ -38,6 +38,16 @@ torch::Tensor AMMBench::INT8CPPAlgo::fp32amm(torch::Tensor tensor1, torch::Tenso return resultTensor.clone(); } +static float getScaleingFactor( float scalingBase,std::vector matrix1Float) +{ + float maxa=*std::max_element(matrix1Float.begin(), matrix1Float.end()); + float minaAbs= abs(*std::min_element(matrix1Float.begin(), matrix1Float.end())); + if (minaAbs>maxa) + { + maxa=minaAbs; + } + return scalingBase/maxa; +} torch::Tensor AMMBench::INT8CPPAlgo::int4amm(torch::Tensor tensor1, torch::Tensor tensor2) { auto A_size = tensor1.sizes(); @@ -54,7 +64,8 @@ torch::Tensor AMMBench::INT8CPPAlgo::int4amm(torch::Tensor tensor1, torch::Tenso std::vector matrix1Float(tensor1.data_ptr(), tensor1.data_ptr() + rows1 * cols1); // Convert the input matrices to int8 std::vector matrix1(rows1 * cols1); - float scale1 = 7.0 / *std::max_element(matrix1Float.begin(), matrix1Float.end()); + + float scale1 = getScaleingFactor(7.0,matrix1Float); for (int i = 0; i < rows1 * cols1; ++i) { matrix1[i] = static_cast(matrix1Float[i] * scale1); } @@ -65,7 +76,7 @@ torch::Tensor AMMBench::INT8CPPAlgo::int4amm(torch::Tensor tensor1, torch::Tenso */ std::vector matrix2Float(tensor2.data_ptr(), tensor2.data_ptr() + cols1 * cols2); std::vector matrix2(cols1 * cols2); - float scale2 = 7.0 / *std::max_element(matrix2Float.begin(), matrix2Float.end()); + float scale2 = getScaleingFactor(7.0,matrix2Float); for (int i = 0; i < cols1 * cols2; ++i) { matrix2[i] = static_cast(matrix2Float[i] * scale2); } @@ -138,7 +149,7 @@ torch::Tensor AMMBench::INT8CPPAlgo::int8amm(torch::Tensor tensor1, torch::Tenso std::vector matrix1Float(tensor1.data_ptr(), tensor1.data_ptr() + rows1 * cols1); // Convert the input matrices to int8 std::vector matrix1(rows1 * cols1); - float scale1 = 127.0 / *std::max_element(matrix1Float.begin(), matrix1Float.end()); + float scale1 = getScaleingFactor(127.0,matrix1Float); for (int i = 0; i < rows1 * cols1; ++i) { matrix1[i] = static_cast(matrix1Float[i] * scale1); } @@ -149,7 +160,7 @@ torch::Tensor AMMBench::INT8CPPAlgo::int8amm(torch::Tensor tensor1, torch::Tenso */ std::vector matrix2Float(tensor2.data_ptr(), tensor2.data_ptr() + cols1 * cols2); std::vector matrix2(cols1 * cols2); - float scale2 = 127.0 / *std::max_element(matrix2Float.begin(), matrix2Float.end()); + float scale2 = getScaleingFactor(127.0,matrix2Float); for (int i = 0; i < cols1 * cols2; ++i) { matrix2[i] = static_cast(matrix2Float[i] * scale2); } @@ -216,7 +227,7 @@ torch::Tensor AMMBench::INT8CPPAlgo::int16amm(torch::Tensor tensor1, torch::Tens std::vector matrix1Float(tensor1.data_ptr(), tensor1.data_ptr() + rows1 * cols1); // Convert the input matrices to int8 std::vector matrix1(rows1 * cols1); - float scale1 = 32767.0 / *std::max_element(matrix1Float.begin(), matrix1Float.end()); + float scale1 = getScaleingFactor(32767.0,matrix1Float); for (int i = 0; i < rows1 * cols1; ++i) { matrix1[i] = static_cast(matrix1Float[i] * scale1); } @@ -227,7 +238,7 @@ torch::Tensor AMMBench::INT8CPPAlgo::int16amm(torch::Tensor tensor1, torch::Tens */ std::vector matrix2Float(tensor2.data_ptr(), tensor2.data_ptr() + cols1 * cols2); std::vector matrix2(cols1 * cols2); - float scale2 = 32767.0/ *std::max_element(matrix2Float.begin(), matrix2Float.end()); + float scale2 =getScaleingFactor(32767.0,matrix2Float); for (int i = 0; i < cols1 * cols2; ++i) { matrix2[i] = static_cast(matrix2Float[i] * scale2); }