diff options
Diffstat (limited to 'examples/neon_gemm_qasymm8.cpp')
-rw-r--r-- | examples/neon_gemm_qasymm8.cpp | 55 |
1 files changed, 34 insertions, 21 deletions
diff --git a/examples/neon_gemm_qasymm8.cpp b/examples/neon_gemm_qasymm8.cpp index f028e004c2..3aaad02f8a 100644 --- a/examples/neon_gemm_qasymm8.cpp +++ b/examples/neon_gemm_qasymm8.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020 ARM Limited. + * Copyright (c) 2020-2021 Arm Limited. * * SPDX-License-Identifier: MIT * @@ -22,12 +22,13 @@ * SOFTWARE. */ #include "arm_compute/core/Types.h" -#include "arm_compute/core/WindowIterator.h" #include "arm_compute/core/utils/quantization/AsymmHelpers.h" +#include "arm_compute/core/WindowIterator.h" #include "arm_compute/runtime/NEON/NEFunctions.h" #include "arm_compute/runtime/NEON/NEScheduler.h" -#include "utils/Utils.h" + #include "support/ToolchainSupport.h" +#include "utils/Utils.h" #include <cstdlib> @@ -38,7 +39,7 @@ using namespace utils; void find_min_max(int size, const float *data, float *min, float *max) { *min = *max = data[0]; - for(int i = 0; i < size; i++) + for (int i = 0; i < size; i++) { const float val = data[i]; *min = std::min(*min, val); @@ -66,11 +67,11 @@ QuantizationInfo choose_quantization_params(float min, float max) // But we need to nudge the zero_point to an integer (exact quantized value) std::uint8_t zero_point_nudged = 0; - if(zero_point_real < qmin) + if (zero_point_real < qmin) { zero_point_nudged = qmin; } - else if(zero_point_real > qmax) + else if (zero_point_real > qmax) { zero_point_nudged = qmax; } @@ -85,7 +86,7 @@ QuantizationInfo choose_quantization_params(float min, float max) void quantize_values(int size, qasymm8_t *output, float *input, const QuantizationInfo qinfo) { - for(int i = 0; i < size; i++) + for (int i = 0; i < size; i++) { output[i] = quantize_qasymm8(input[i], qinfo); } @@ -102,13 +103,13 @@ int main(int argc, char **argv) Tensor q_dst0; Tensor q_res; Tensor q_res_output; - size_t M = 4; - size_t N = 4; - size_t K = 4; - bool default_input = true; + size_t M = 4; + size_t N = 4; + size_t K = 4; + bool default_input = true; // Parse args - if(argc < 3) /* case default matrix sizes */ + if (argc < 3) /* case default matrix sizes */ { // Print help std::cout << "Usage: ./build/neon_gemm_qasymm8 M N K\n"; @@ -144,20 +145,23 @@ int main(int argc, char **argv) // Fill in: one is the identity matrix, other is sequential values // src1: Identity matrix - for(size_t i = 0; i < M * K; i++) { + for (size_t i = 0; i < M * K; i++) + { src1_ptr[i] = 0; } - for(size_t i = 0; i < M; i++) { + for (size_t i = 0; i < M; i++) + { src1_ptr[i * K + i] = 1.0f; } // src2: Sequential values matrix - for(size_t i = 0; i < K * N; i++) { + for (size_t i = 0; i < K * N; i++) + { src2_ptr[i] = i * 1.123f; } // Otherwise if M, N, K is given, fill in with random values - if(!default_input) + if (!default_input) { fill_random_tensor(src1, 0.f, 1.f); fill_random_tensor(src2, 0.f, 1.f); @@ -217,13 +221,22 @@ int main(int argc, char **argv) qgemm.configure(&q_src1, &q_src2, nullptr, &q_res); // Configure output stage after computing shift and multiplier parameters - NEGEMMLowpQuantizeDownInt32ToUint8ScaleByFixedPoint gemmlowp_output_stage; - int output_multiplier; - int output_shift; + NEGEMMLowpOutputStage gemmlowp_output_stage; + int output_multiplier; + int output_shift; float multiplier = (src1_qinfo.uniform().scale * src2_qinfo.uniform().scale) / dst0_qinfo.uniform().scale; quantization::calculate_quantized_multiplier_less_than_one(multiplier, &output_multiplier, &output_shift); std::cout << "(q_multiplier, q_shift) = (" << output_multiplier << ", " << output_shift << ")\n\n"; - gemmlowp_output_stage.configure(&q_res, nullptr, &q_res_output, output_multiplier, output_shift, dst0_qinfo.uniform().offset); + + GEMMLowpOutputStageInfo info; + info.type = GEMMLowpOutputStageType::QUANTIZE_DOWN_FIXEDPOINT; + info.gemmlowp_multiplier = output_multiplier; + info.gemmlowp_shift = output_shift; + info.gemmlowp_offset = dst0_qinfo.uniform().offset; + info.output_data_type = DataType::QASYMM8; + q_res_output.info()->set_data_type(DataType::QASYMM8); + q_res_output.info()->set_num_channels(1); + gemmlowp_output_stage.configure(&q_res, nullptr, &q_res_output, info); // Allocate all tensors q_src1.allocator()->allocate(); @@ -240,7 +253,7 @@ int main(int argc, char **argv) qgemm.run(); // Run output stage kernel gemmlowp_output_stage.run(); - std::cout << "Done\n"; + std::cout << "\nTest Passed\n"; #if ARM_COMPUTE_DEBUG_ENABLED // Print quantized source matrices |