From c630e94d143ac5f46381f53a4994b29ea7ef2ac0 Mon Sep 17 00:00:00 2001 From: Gian Marco Iodice Date: Mon, 11 May 2020 12:15:54 +0100 Subject: COMPMID-3286: Test improvement for CLGEMMMatrixMultiplyKernel Change-Id: Idef4065ae98b1f41bd38d1fdef3c5f7eff45d940 Signed-off-by: Gian Marco Iodice Reviewed-on: https://review.mlplatform.org/c/ml/ComputeLibrary/+/3169 Reviewed-by: Sang-Hoon Park Comments-Addressed: Arm Jenkins Tested-by: Arm Jenkins --- tests/validation/CL/GEMMMatrixMultiply.cpp | 312 ++++++++++++++--------------- 1 file changed, 150 insertions(+), 162 deletions(-) (limited to 'tests/validation/CL/GEMMMatrixMultiply.cpp') diff --git a/tests/validation/CL/GEMMMatrixMultiply.cpp b/tests/validation/CL/GEMMMatrixMultiply.cpp index 9115aa8a10..e0c1a446c0 100644 --- a/tests/validation/CL/GEMMMatrixMultiply.cpp +++ b/tests/validation/CL/GEMMMatrixMultiply.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019 ARM Limited. + * Copyright (c) 2019-2020 ARM Limited. * * SPDX-License-Identifier: MIT * @@ -66,41 +66,26 @@ constexpr float abs_tolerance_f32(0.0001f); RelativeTolerance rel_tolerance_f16(half(0.2)); constexpr float tolerance_num_f16 = 0.02f; -/** Alpha values to test - Precommit */ +/** Alpha values to test */ const auto alpha_values = framework::dataset::make("alpha", {1.0f, -0.75f} ); -/** Beta values to test - Precommit */ +/** Beta values to test */ const auto beta_values = framework::dataset::make("beta", {-0.35f, 0.0f} ); -/** M values to test - Precommit */ -const auto m_values_precommit = framework::dataset::make("M", {37, 1}); - -/** N values to test - Precommit */ -const auto n_values_precommit = framework::dataset::make("N", 51); - -/** K values to test - Precommit */ -const auto k_values_precommit = framework::dataset::make("K", 23); - -/** M values to test - Nightly */ -const auto m_values_nightly = framework::dataset::make("M", {421, 1}); - -/** N values to test - Nightly */ -const auto n_values_nightly = framework::dataset::make("N", {323, 1103}); - -/** K values to test - Nightly */ -const auto k_values_nightly = framework::dataset::make("K", 207); +/** M values to test */ +const auto m_values = framework::dataset::make("M", {37, 1}); -/** M_W values to test - Precommit */ -const auto m_w_values_precommit = framework::dataset::make("M_W", 5); +/** N values to test */ +const auto n_values = framework::dataset::make("N", {51, 1003}); -/** M_H values to test - Precommit */ -const auto m_h_values_precommit = framework::dataset::make("M_H", 7); +/** K values to test */ +const auto k_values = framework::dataset::make("K", 23); -/** M_W values to test - Nightly */ -const auto m_w_values_nightly = framework::dataset::make("M_W", 13); +/** M_W values to test */ +const auto m_w_values = framework::dataset::make("M_W", 5); -/** M_H values to test - Nightly */ -const auto m_h_values_nightly = framework::dataset::make("M_H", 27); +/** M_H values to test */ +const auto m_h_values = framework::dataset::make("M_H", 7); /** Batch size values to test */ const auto b_values = framework::dataset::make("batch_size", 1, 3); @@ -131,82 +116,141 @@ const auto data_type_values = framework::dataset::make("DataType", /** M values to test */ const auto fp16_mixed_precision_values = framework::dataset::make("fp16_mixed_precision", {true, false}); - -/** Configuration test */ -void validate_configuration(unsigned int m_value, unsigned int n_value, unsigned int k_value, unsigned int b_value, bool broadcast_bias, bool fp16_mixed_precision, const ActivationLayerInfo &act_info, DataType data_type, GPUTarget gpu_arch_value) -{ - GEMMReshapeInfo reshape_info(m_value, n_value, k_value, 1, 1, 0, false, broadcast_bias); - - const TensorShape lhs_shape(k_value, m_value, b_value); - const TensorShape rhs_shape(n_value, k_value, b_value); - - const TensorShape dst_shape = compute_mm_shape(TensorInfo(lhs_shape, 1, data_type), - TensorInfo(rhs_shape, 1, data_type), - reshape_info); - - const TensorShape bias_shape(n_value, - broadcast_bias? 1 : m_value, - broadcast_bias? 1 : b_value); - - // Create tensors - CLTensor lhs = create_tensor(lhs_shape, data_type); - CLTensor rhs = create_tensor(rhs_shape, data_type); - CLTensor bias = create_tensor(bias_shape, data_type); - CLTensor dst = create_tensor(dst_shape, data_type); - - ARM_COMPUTE_EXPECT(lhs.info()->is_resizable(), framework::LogLevel::ERRORS); - ARM_COMPUTE_EXPECT(rhs.info()->is_resizable(), framework::LogLevel::ERRORS); - ARM_COMPUTE_EXPECT(bias.info()->is_resizable(), framework::LogLevel::ERRORS); - ARM_COMPUTE_EXPECT(dst.info()->is_resizable(), framework::LogLevel::ERRORS); - - // Create and configure function - CLGEMMMatrixMultiplyNative gemm; - gemm.configure(gpu_arch_value, &lhs, &rhs, &bias, &dst, 1.0f, 2.0f, false, reshape_info, fp16_mixed_precision, act_info); -} } // namespace TEST_SUITE(CL) TEST_SUITE(GEMMMatrixMultiply) -TEST_SUITE(Float) -TEST_SUITE(FP32) -DATA_TEST_CASE(Configuration, framework::DatasetMode::ALL, combine(combine(combine(combine(combine(combine(combine(combine( - m_values_precommit, - n_values_precommit), - k_values_precommit), - framework::dataset::make("batch_size", 1)), - broadcast_bias_values), - framework::dataset::make("fp16_mixed_precision", false)), - act_values), - data_type_values), - gpu_arch_values), -m_value, n_value, k_value, b_value, broadcast_bias, fp16_mixed_precision_value, act_value, data_type_value, gpu_arch_value) +TEST_CASE(Negative, framework::DatasetMode::ALL) { - validate_configuration(m_value, n_value, k_value, b_value, broadcast_bias, fp16_mixed_precision_value, act_value, data_type_value, gpu_arch_value); + // Unsupported QASYMM8 data type + { + const auto lhs = TensorInfo(TensorShape(13U, 12U, 1U, 1U), 1, DataType::QASYMM8); + const auto rhs = TensorInfo(TensorShape(14U, 13U, 1U, 1U), 1, DataType::QASYMM8); + const auto out = TensorInfo(TensorShape(14U, 12U, 1U, 1U), 1, DataType::QASYMM8); + constexpr float alpha = 1.3f; + constexpr float beta = 0.7f; + const bool is_interleaved_transposed = false; + const GEMMReshapeInfo reshape_info = GEMMReshapeInfo(12, 14, 13, 1, 1, 0, false, false); + const GPUTarget gpu_target = GPUTarget::MIDGARD; + const auto status = CLGEMMMatrixMultiplyKernel::validate(&lhs, &rhs, nullptr, &out, alpha, beta, is_interleaved_transposed, reshape_info, gpu_target); + ARM_COMPUTE_EXPECT(bool(status) == false, framework::LogLevel::ERRORS); + } + + // Unsupported SIZE_T data type + { + const auto lhs = TensorInfo(TensorShape(13U, 12U, 1U, 1U), 1, DataType::SIZET); + const auto rhs = TensorInfo(TensorShape(14U, 13U, 1U, 1U), 1, DataType::SIZET); + const auto out = TensorInfo(TensorShape(14U, 12U, 1U, 1U), 1, DataType::SIZET); + constexpr float alpha = 1.3f; + constexpr float beta = 0.7f; + const bool is_interleaved_transposed = false; + const GEMMReshapeInfo reshape_info = GEMMReshapeInfo(12, 14, 13, 1, 1, 0, false, false); + const GPUTarget gpu_target = GPUTarget::MIDGARD; + const auto status = CLGEMMMatrixMultiplyKernel::validate(&lhs, &rhs, nullptr, &out, alpha, beta, is_interleaved_transposed, reshape_info, gpu_target); + ARM_COMPUTE_EXPECT(bool(status) == false, framework::LogLevel::ERRORS); + } + + // Mixed precision with F32 + { + const auto lhs = TensorInfo(TensorShape(13U, 12U, 1U, 1U), 1, DataType::F32); + const auto rhs = TensorInfo(TensorShape(14U, 13U, 1U, 1U), 1, DataType::F32); + const auto out = TensorInfo(TensorShape(14U, 12U, 1U, 1U), 1, DataType::F32); + constexpr float alpha = 1.3f; + constexpr float beta = 0.7f; + const bool is_interleaved_transposed = false; + const GEMMReshapeInfo reshape_info = GEMMReshapeInfo(12, 14, 13, 1, 1, 0, false, false); + const GPUTarget gpu_target = GPUTarget::MIDGARD; + const bool fp_mixed_precision = true; + const auto status = CLGEMMMatrixMultiplyKernel::validate(&lhs, &rhs, nullptr, &out, alpha, beta, is_interleaved_transposed, reshape_info, gpu_target, fp_mixed_precision); + ARM_COMPUTE_EXPECT(bool(status) == false, framework::LogLevel::ERRORS); + } + + // Max number of dimensions LHS matrix + { + const auto lhs = TensorInfo(TensorShape(13U, 12U, 1U, 1U, 4U), 1, DataType::F32); + const auto rhs = TensorInfo(TensorShape(14U, 13U, 1U, 1U), 1, DataType::F32); + const auto out = TensorInfo(TensorShape(14U, 12U, 1U, 1U), 1, DataType::F32); + constexpr float alpha = 1.3f; + constexpr float beta = 0.7f; + const bool is_interleaved_transposed = false; + const GEMMReshapeInfo reshape_info = GEMMReshapeInfo(12, 14, 13, 1, 1, 0, false, false); + const GPUTarget gpu_target = GPUTarget::MIDGARD; + const auto status = CLGEMMMatrixMultiplyKernel::validate(&lhs, &rhs, nullptr, &out, alpha, beta, is_interleaved_transposed, reshape_info, gpu_target); + ARM_COMPUTE_EXPECT(bool(status) == false, framework::LogLevel::ERRORS); + } + + // Max number of dimensions RHS matrix + { + const auto lhs = TensorInfo(TensorShape(13U, 12U, 1U, 4U), 1, DataType::F32); + const auto rhs = TensorInfo(TensorShape(14U, 13U, 1U, 4U), 1, DataType::F32); + const auto out = TensorInfo(TensorShape(14U, 12U, 1U, 4U), 1, DataType::F32); + constexpr float alpha = 1.3f; + constexpr float beta = 0.7f; + const bool is_interleaved_transposed = false; + const GEMMReshapeInfo reshape_info = GEMMReshapeInfo(12, 14, 13, 1, 1, 0, false, false); + const GPUTarget gpu_target = GPUTarget::MIDGARD; + const auto status = CLGEMMMatrixMultiplyKernel::validate(&lhs, &rhs, nullptr, &out, alpha, beta, is_interleaved_transposed, reshape_info, gpu_target); + ARM_COMPUTE_EXPECT(bool(status) == false, framework::LogLevel::ERRORS); + } + + // Broadcast bias + { + const auto lhs = TensorInfo(TensorShape(13U, 12U, 1U, 1U), 1, DataType::F16); + const auto rhs = TensorInfo(TensorShape(14U, 13U, 1U, 1U), 1, DataType::F16); + // The correct shape should be bias = TensorInfo(TensorShape(14U, 1U, 1U, 1U), 1, DataType::F32); + const auto bias = TensorInfo(TensorShape(14U, 12U, 1U, 1U), 1, DataType::F16); + const auto out = TensorInfo(TensorShape(14U, 12U, 1U, 1U), 1, DataType::F16); + constexpr float alpha = 1.3f; + constexpr float beta = 0.7f; + const bool is_interleaved_transposed = false; + const GEMMReshapeInfo reshape_info = GEMMReshapeInfo(12, 14, 13, 1, 1, 0, false, true); + const GPUTarget gpu_target = GPUTarget::MIDGARD; + const bool fp_mixed_precision = false; + const auto status = CLGEMMMatrixMultiplyKernel::validate(&lhs, &rhs, &bias, &out, alpha, beta, is_interleaved_transposed, reshape_info, gpu_target, fp_mixed_precision); + ARM_COMPUTE_EXPECT(bool(status) == false, framework::LogLevel::ERRORS); + } + + // Invalid dimensions for the bias + { + const auto lhs = TensorInfo(TensorShape(13U, 12U, 1U, 1U), 1, DataType::F32); + const auto rhs = TensorInfo(TensorShape(14U, 13U, 1U, 1U), 1, DataType::F32); + // The correct shape should be bias = TensorInfo(TensorShape(14U, 12U, 1U, 1U), 1, DataType::F32); + const auto bias = TensorInfo(TensorShape(14U, 8U, 1U, 1U), 1, DataType::F32); + const auto out = TensorInfo(TensorShape(14U, 12U, 1U, 1U), 1, DataType::F32); + constexpr float alpha = 1.3f; + constexpr float beta = 0.7f; + const bool is_interleaved_transposed = false; + const GEMMReshapeInfo reshape_info = GEMMReshapeInfo(12, 14, 13, 1, 1, 0, false, false); + const GPUTarget gpu_target = GPUTarget::MIDGARD; + const bool fp_mixed_precision = false; + const auto status = CLGEMMMatrixMultiplyKernel::validate(&lhs, &rhs, &bias, &out, alpha, beta, is_interleaved_transposed, reshape_info, gpu_target, fp_mixed_precision); + ARM_COMPUTE_EXPECT(bool(status) == false, framework::LogLevel::ERRORS); + } + + // Invalid dimensions for the output + { + const auto lhs = TensorInfo(TensorShape(13U, 12U, 1U, 1U), 1, DataType::F32); + const auto rhs = TensorInfo(TensorShape(14U, 13U, 1U, 1U), 1, DataType::F32); + // The correct shape should be out = TensorInfo(TensorShape(14U, 12U, 1U, 1U), 1, DataType::F32); + const auto out = TensorInfo(TensorShape(14U, 7U, 1U, 1U), 1, DataType::F32); + constexpr float alpha = 1.3f; + constexpr float beta = 0.7f; + const bool is_interleaved_transposed = false; + const GEMMReshapeInfo reshape_info = GEMMReshapeInfo(12, 14, 13, 1, 1, 0, false, false); + const GPUTarget gpu_target = GPUTarget::MIDGARD; + const auto status = CLGEMMMatrixMultiplyKernel::validate(&lhs, &rhs, nullptr, &out, alpha, beta, is_interleaved_transposed, reshape_info, gpu_target); + ARM_COMPUTE_EXPECT(bool(status) == false, framework::LogLevel::ERRORS); + } } -FIXTURE_DATA_TEST_CASE(RunSmall, CLGEMMMatrixMultiplyNativeFixture, framework::DatasetMode::ALL, - combine(combine(combine(combine(combine(combine(combine(combine(combine(combine( - m_values_precommit, - n_values_precommit), - k_values_precommit), - b_values), - alpha_values), - beta_values), - broadcast_bias_values), - framework::dataset::make("fp16_mixed_precision", false)), - act_values), - framework::dataset::make("DataType", DataType::F32)), - gpu_arch_values)) -{ - // Validate output - validate(CLAccessor(_target), _reference, rel_tolerance_f32, 0.f, abs_tolerance_f32); -} +TEST_SUITE(Float) +TEST_SUITE(FP32) -FIXTURE_DATA_TEST_CASE(RunLarge, CLGEMMMatrixMultiplyNativeFixture, framework::DatasetMode::DISABLED, +FIXTURE_DATA_TEST_CASE(RunSmall, CLGEMMMatrixMultiplyNativeFixture, framework::DatasetMode::ALL, combine(combine(combine(combine(combine(combine(combine(combine(combine(combine( - m_values_nightly, - n_values_nightly), - k_values_nightly), + m_values, + n_values), + k_values), b_values), alpha_values), beta_values), @@ -222,29 +266,10 @@ FIXTURE_DATA_TEST_CASE(RunLarge, CLGEMMMatrixMultiplyNativeFixture, frame FIXTURE_DATA_TEST_CASE(RunSmall3D, CLGEMMMatrixMultiplyNative3DFixture, framework::DatasetMode::ALL, combine(combine(combine(combine(combine(combine(combine(combine(combine(combine(combine( - m_w_values_precommit, - m_h_values_precommit), - n_values_precommit), - k_values_precommit), - b_values), - alpha_values), - beta_values), - broadcast_bias_values), - framework::dataset::make("fp16_mixed_precision", false)), - act_values), - framework::dataset::make("DataType", DataType::F32)), - gpu_arch_values)) -{ - // Validate output - validate(CLAccessor(_target), _reference, rel_tolerance_f32, 0.f, abs_tolerance_f32); -} - -FIXTURE_DATA_TEST_CASE(RunLarge3D, CLGEMMMatrixMultiplyNative3DFixture, framework::DatasetMode::DISABLED, - combine(combine(combine(combine(combine(combine(combine(combine(combine(combine(combine( - m_w_values_nightly, - m_h_values_nightly), - n_values_nightly), - k_values_nightly), + m_w_values, + m_h_values), + n_values), + k_values), b_values), alpha_values), beta_values), @@ -263,27 +288,9 @@ TEST_SUITE_END() // FP32 TEST_SUITE(FP16) FIXTURE_DATA_TEST_CASE(RunSmall, CLGEMMMatrixMultiplyNativeFixture, framework::DatasetMode::ALL, combine(combine(combine(combine(combine(combine(combine(combine(combine(combine( - m_values_precommit, - n_values_precommit), - k_values_precommit), - b_values), - alpha_values), - beta_values), - broadcast_bias_values), - fp16_mixed_precision_values), - act_values), - framework::dataset::make("DataType", DataType::F16)), - gpu_arch_values)) -{ - // Validate output - validate(CLAccessor(_target), _reference, rel_tolerance_f16, tolerance_num_f16); -} - -FIXTURE_DATA_TEST_CASE(RunLarge, CLGEMMMatrixMultiplyNativeFixture, framework::DatasetMode::DISABLED, - combine(combine(combine(combine(combine(combine(combine(combine(combine(combine( - m_values_nightly, - n_values_nightly), - k_values_nightly), + m_values, + n_values), + k_values), b_values), alpha_values), beta_values), @@ -299,29 +306,10 @@ FIXTURE_DATA_TEST_CASE(RunLarge, CLGEMMMatrixMultiplyNativeFixture, framew FIXTURE_DATA_TEST_CASE(RunSmall3D, CLGEMMMatrixMultiplyNative3DFixture, framework::DatasetMode::ALL, combine(combine(combine(combine(combine(combine(combine(combine(combine(combine(combine( - m_w_values_precommit, - m_h_values_precommit), - n_values_precommit), - k_values_precommit), - b_values), - alpha_values), - beta_values), - broadcast_bias_values), - fp16_mixed_precision_values), - act_values), - framework::dataset::make("DataType", DataType::F16)), - gpu_arch_values)) -{ - // Validate output - validate(CLAccessor(_target), _reference, rel_tolerance_f16, tolerance_num_f16); -} - -FIXTURE_DATA_TEST_CASE(RunLarge3D, CLGEMMMatrixMultiplyNative3DFixture, framework::DatasetMode::DISABLED, - combine(combine(combine(combine(combine(combine(combine(combine(combine(combine(combine( - m_w_values_nightly, - m_h_values_nightly), - n_values_nightly), - k_values_nightly), + m_w_values, + m_h_values), + n_values), + k_values), b_values), alpha_values), beta_values), -- cgit v1.2.1