diff options
author | Gian Marco Iodice <gianmarco.iodice@arm.com> | 2020-05-11 12:15:54 +0100 |
---|---|---|
committer | Gian Marco Iodice <gianmarco.iodice@arm.com> | 2020-05-12 13:09:00 +0000 |
commit | c630e94d143ac5f46381f53a4994b29ea7ef2ac0 (patch) | |
tree | 650261f5b0e87603b269f5f5e4743b9c392cb5ee | |
parent | beb2d45ed515a2d0f0727c038ff837f21c61d2dd (diff) | |
download | armcl-c630e94d143ac5f46381f53a4994b29ea7ef2ac0.tar.gz armcl-c630e94d143ac5f46381f53a4994b29ea7ef2ac0.tar.bz2 armcl-c630e94d143ac5f46381f53a4994b29ea7ef2ac0.zip |
COMPMID-3286: Test improvement for CLGEMMMatrixMultiplyKernel
Change-Id: Idef4065ae98b1f41bd38d1fdef3c5f7eff45d940
Signed-off-by: Gian Marco Iodice <gianmarco.iodice@arm.com>
Reviewed-on: https://review.mlplatform.org/c/ml/ComputeLibrary/+/3169
Reviewed-by: Sang-Hoon Park <sang-hoon.park@arm.com>
Comments-Addressed: Arm Jenkins <bsgcomp@arm.com>
Tested-by: Arm Jenkins <bsgcomp@arm.com>
-rw-r--r-- | tests/validation/CL/GEMMMatrixMultiply.cpp | 312 | ||||
-rw-r--r-- | tests/validation/CL/GEMMMatrixMultiplyInterleavedTransposed.cpp | 344 |
2 files changed, 284 insertions, 372 deletions
diff --git a/tests/validation/CL/GEMMMatrixMultiply.cpp b/tests/validation/CL/GEMMMatrixMultiply.cpp index 9115aa8a1..e0c1a446c 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<half> 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<CLTensor>(lhs_shape, data_type); - CLTensor rhs = create_tensor<CLTensor>(rhs_shape, data_type); - CLTensor bias = create_tensor<CLTensor>(bias_shape, data_type); - CLTensor dst = create_tensor<CLTensor>(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<float>, 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<float>, framework::DatasetMode::DISABLED, +FIXTURE_DATA_TEST_CASE(RunSmall, CLGEMMMatrixMultiplyNativeFixture<float>, 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<float>, frame FIXTURE_DATA_TEST_CASE(RunSmall3D, CLGEMMMatrixMultiplyNative3DFixture<float>, 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<float>, 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<half>, 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<half>, 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<half>, framew FIXTURE_DATA_TEST_CASE(RunSmall3D, CLGEMMMatrixMultiplyNative3DFixture<half>, 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<half>, 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), diff --git a/tests/validation/CL/GEMMMatrixMultiplyInterleavedTransposed.cpp b/tests/validation/CL/GEMMMatrixMultiplyInterleavedTransposed.cpp index d36b2dada..63e1b57d3 100644 --- a/tests/validation/CL/GEMMMatrixMultiplyInterleavedTransposed.cpp +++ b/tests/validation/CL/GEMMMatrixMultiplyInterleavedTransposed.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019 ARM Limited. + * Copyright (c) 2019-2020 ARM Limited. * * SPDX-License-Identifier: MIT * @@ -76,41 +76,26 @@ constexpr float abs_tolerance_f32(0.0001f); RelativeTolerance<half> 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); - -/** 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); - -/** 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); -/** 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); @@ -122,17 +107,11 @@ const auto act_values = framework::dataset::make("Activation", ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::LU_BOUNDED_RELU, 8.f, 2.f), }); -/** V0 values to test - Precommit */ -const auto v0_values_precommit = framework::dataset::make("V0", 2); - -/** H0 values to test - Precommit */ -const auto h0_values_precommit = framework::dataset::make("H0", 4); - -/** V0 values to test - Nightly */ -const auto v0_values_nightly = framework::dataset::make("V0", {2, 4}); +/** V0 values to test */ +const auto v0_values = framework::dataset::make("V0", 2); -/** H0 values to test - Nightly */ -const auto h0_values_nightly = framework::dataset::make("H0", { 2, 4 }); +/** H0 values to test */ +const auto h0_values = framework::dataset::make("H0", 4); /** Broadcast bias from vector to matrix */ const auto broadcast_bias_values = framework::dataset::make("broadcast_bias", {false, true} ); @@ -153,111 +132,118 @@ 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, unsigned int v0_value, unsigned int h0_value, bool broadcast_bias, bool fp16_mixed_precision, const ActivationLayerInfo &act_info, DataType data_type, GPUTarget gpu_arch_value) -{ - GEMMLHSMatrixInfo lhs_info; - lhs_info.m0 = 4; - lhs_info.k0 = 4; - lhs_info.v0 = v0_value; - lhs_info.interleave = true; - lhs_info.transpose = true; - - GEMMRHSMatrixInfo rhs_info; - rhs_info.n0 = data_type == DataType::F32? 4 : 8; - rhs_info.k0 = 1; - rhs_info.h0 = h0_value; - rhs_info.interleave = false; - rhs_info.transpose = false; - - GEMMReshapeInfo reshape_info(m_value, n_value, k_value, rhs_info.h0, lhs_info.v0, 0, false, broadcast_bias); - - const TensorShape lhs_shape(k_value, m_value, b_value); - const TensorShape lhs_shape_reshaped = compute_lhs_reshaped_shape(TensorInfo(lhs_shape, 1, data_type), - lhs_info, - false); - - const TensorShape rhs_shape(n_value, k_value, b_value); - const TensorShape rhs_shape_reshaped = compute_rhs_reshaped_shape(TensorInfo(rhs_shape, 1, data_type), - rhs_info); - - const TensorShape dst_shape = compute_mm_shape(TensorInfo(lhs_shape_reshaped, 1, data_type), - TensorInfo(rhs_shape_reshaped, 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_reshaped = create_tensor<CLTensor>(lhs_shape_reshaped, data_type); - CLTensor rhs_reshaped = create_tensor<CLTensor>(rhs_shape_reshaped, data_type); - CLTensor bias = create_tensor<CLTensor>(bias_shape, data_type); - CLTensor dst = create_tensor<CLTensor>(dst_shape, data_type); - - ARM_COMPUTE_EXPECT(lhs_reshaped.info()->is_resizable(), framework::LogLevel::ERRORS); - ARM_COMPUTE_EXPECT(rhs_reshaped.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 - CLGEMMMatrixMultiplyReshaped gemm; - gemm.configure(gpu_arch_value, &lhs_reshaped, &rhs_reshaped, &bias, &dst, 1.0f, 2.0f, true, reshape_info, fp16_mixed_precision, act_info); -} } // namespace TEST_SUITE(CL) TEST_SUITE(GEMMMatrixMultiplyInterleavedTransposed) -TEST_SUITE(Float) -TEST_SUITE(FP32) -DATA_TEST_CASE(Configuration, framework::DatasetMode::ALL, combine(combine(combine(combine(combine(combine(combine(combine(combine(combine( - m_values_precommit, - n_values_precommit), - k_values_precommit), - framework::dataset::make("batch_size", 1)), - v0_values_precommit), - h0_values_precommit), - 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, v0_value, h0_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, v0_value, h0_value, broadcast_bias, fp16_mixed_precision_value, act_value, data_type_value, gpu_arch_value); + // The following tests are already integrated in the GEMMMatrixMultiply validation because + // in common with this validation + // - Unsupported QASYMM8 data type + // - Unsupported SIZE_T data type + // - Mixed precision with F32 + // - Max number of dimensions LHS matrix + // - Max number of dimensions RHS matrix + + // Invalid LHS dimensions + { + // The correct shape should be: lhs = TensorInfo(TensorShape(256U, 1U, 1U, 1U), 1, DataType::F32); + const auto lhs = TensorInfo(TensorShape(256U, 2U, 1U, 1U), 1, DataType::F32); + const auto rhs = TensorInfo(TensorShape(104U, 3U, 1U, 1U), 1, DataType::F32); + const auto bias = TensorInfo(TensorShape(24U, 16U, 1U, 1U), 1, DataType::F32); + const auto out = TensorInfo(TensorShape(24U, 16U, 1U, 1U), 1, DataType::F32); + constexpr float alpha = 1.3f; + constexpr float beta = 0.7f; + const bool is_interleaved_transposed = true; + const GEMMReshapeInfo reshape_info = GEMMReshapeInfo(16, 24, 13, 2, 4, 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 RHS dimensions + { + const auto lhs = TensorInfo(TensorShape(256U, 1U, 1U, 1U), 1, DataType::F32); + // The correct shape should be rhs = TensorInfo(TensorShape(104U, 3U, 1U, 1U), 1, DataType::F32); + const auto rhs = TensorInfo(TensorShape(104U, 4U, 1U, 1U), 1, DataType::F32); + const auto bias = TensorInfo(TensorShape(24U, 16U, 1U, 1U), 1, DataType::F32); + const auto out = TensorInfo(TensorShape(24U, 16U, 1U, 1U), 1, DataType::F32); + constexpr float alpha = 1.3f; + constexpr float beta = 0.7f; + const bool is_interleaved_transposed = true; + const GEMMReshapeInfo reshape_info = GEMMReshapeInfo(16, 24, 13, 2, 4, 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); + } + + // Broadcast bias + { + const auto lhs = TensorInfo(TensorShape(256U, 1U, 1U, 1U), 1, DataType::F32); + const auto rhs = TensorInfo(TensorShape(104U, 3U, 1U, 1U), 1, DataType::F32); + // The correct shape should be bias = TensorInfo(TensorShape(24U, 1U, 1U, 1U), 1, DataType::F32); + const auto bias = TensorInfo(TensorShape(24U, 16U, 1U, 1U), 1, DataType::F32); + const auto out = TensorInfo(TensorShape(24U, 16U, 1U, 1U), 1, DataType::F32); + constexpr float alpha = 1.3f; + constexpr float beta = 0.7f; + const bool is_interleaved_transposed = true; + const GEMMReshapeInfo reshape_info = GEMMReshapeInfo(16, 24, 13, 2, 4, 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(256U, 1U, 1U, 1U), 1, DataType::F32); + const auto rhs = TensorInfo(TensorShape(104U, 3U, 1U, 1U), 1, DataType::F32); + // The correct shape should be bias = TensorInfo(TensorShape(24U, 16U, 1U, 1U), 1, DataType::F32); + const auto bias = TensorInfo(TensorShape(25U, 16U, 1U, 1U), 1, DataType::F32); + const auto out = TensorInfo(TensorShape(24U, 16U, 1U, 1U), 1, DataType::F32); + constexpr float alpha = 1.3f; + constexpr float beta = 0.7f; + const bool is_interleaved_transposed = true; + const GEMMReshapeInfo reshape_info = GEMMReshapeInfo(16, 24, 13, 2, 4, 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(256U, 1U, 1U, 1U), 1, DataType::F32); + const auto rhs = TensorInfo(TensorShape(104U, 3U, 1U, 1U), 1, DataType::F32); + const auto bias = TensorInfo(TensorShape(24U, 16U, 1U, 1U), 1, DataType::F32); + // The correct shape should be out = TensorInfo(TensorShape(24U, 16U, 1U, 1U), 1, DataType::F32); + const auto out = TensorInfo(TensorShape(24U, 13U, 1U, 1U), 1, DataType::F32); + constexpr float alpha = 1.3f; + constexpr float beta = 0.7f; + const bool is_interleaved_transposed = true; + const GEMMReshapeInfo reshape_info = GEMMReshapeInfo(16, 24, 13, 2, 4, 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); + } } +TEST_SUITE(Float) +TEST_SUITE(FP32) FIXTURE_DATA_TEST_CASE(RunSmall, CLGEMMMatrixMultiplyReshapedFixture<float>, framework::DatasetMode::ALL, combine(combine(combine(combine(combine(combine(combine(combine(combine(combine(combine(combine( - m_values_precommit, - n_values_precommit), - k_values_precommit), + m_values, + n_values), + k_values), b_values), alpha_values), beta_values), - v0_values_precommit), - h0_values_precommit), - 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(RunLarge, CLGEMMMatrixMultiplyReshapedFixture<float>, framework::DatasetMode::DISABLED, - combine(combine(combine(combine(combine(combine(combine(combine(combine(combine(combine(combine( - m_values_nightly, - n_values_nightly), - k_values_nightly), - b_values), - alpha_values), - beta_values), - v0_values_nightly), - h0_values_nightly), + v0_values), + h0_values), broadcast_bias_values), framework::dataset::make("fp16_mixed_precision", false)), act_values), @@ -270,36 +256,15 @@ FIXTURE_DATA_TEST_CASE(RunLarge, CLGEMMMatrixMultiplyReshapedFixture<float>, fra FIXTURE_DATA_TEST_CASE(RunSmall3D, CLGEMMMatrixMultiplyReshaped3DFixture<float>, framework::DatasetMode::ALL, combine(combine(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), - v0_values_precommit), - h0_values_precommit), - 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, CLGEMMMatrixMultiplyReshaped3DFixture<float>, framework::DatasetMode::DISABLED, - combine(combine(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), - v0_values_nightly), - h0_values_nightly), + v0_values), + h0_values), broadcast_bias_values), framework::dataset::make("fp16_mixed_precision", false)), act_values), @@ -315,34 +280,14 @@ TEST_SUITE_END() // FP32 TEST_SUITE(FP16) FIXTURE_DATA_TEST_CASE(RunSmall, CLGEMMMatrixMultiplyReshapedFixture<half>, framework::DatasetMode::ALL, combine(combine(combine(combine(combine(combine(combine(combine(combine(combine(combine(combine( - m_values_precommit, - n_values_precommit), - k_values_precommit), + m_values, + n_values), + k_values), b_values), alpha_values), beta_values), - v0_values_precommit), - h0_values_precommit), - 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, CLGEMMMatrixMultiplyReshapedFixture<half>, framework::DatasetMode::DISABLED, - combine(combine(combine(combine(combine(combine(combine(combine(combine(combine(combine(combine( - m_values_nightly, - n_values_nightly), - k_values_nightly), - b_values), - alpha_values), - beta_values), - v0_values_nightly), - h0_values_nightly), + v0_values), + h0_values), broadcast_bias_values), fp16_mixed_precision_values), act_values), @@ -355,36 +300,15 @@ FIXTURE_DATA_TEST_CASE(RunLarge, CLGEMMMatrixMultiplyReshapedFixture<half>, fram FIXTURE_DATA_TEST_CASE(RunSmall3D, CLGEMMMatrixMultiplyReshaped3DFixture<half>, framework::DatasetMode::ALL, combine(combine(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), - v0_values_precommit), - h0_values_precommit), - 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, CLGEMMMatrixMultiplyReshaped3DFixture<half>, framework::DatasetMode::DISABLED, - combine(combine(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), - v0_values_nightly), - h0_values_nightly), + v0_values), + h0_values), broadcast_bias_values), fp16_mixed_precision_values), act_values), |