summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGian Marco Iodice <gianmarco.iodice@arm.com>2020-05-11 12:15:54 +0100
committerGian Marco Iodice <gianmarco.iodice@arm.com>2020-05-12 13:09:00 +0000
commitc630e94d143ac5f46381f53a4994b29ea7ef2ac0 (patch)
tree650261f5b0e87603b269f5f5e4743b9c392cb5ee
parentbeb2d45ed515a2d0f0727c038ff837f21c61d2dd (diff)
downloadarmcl-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.cpp312
-rw-r--r--tests/validation/CL/GEMMMatrixMultiplyInterleavedTransposed.cpp344
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),