From 9382ab366997cbf6fdb0d4a6312bce113ea74a51 Mon Sep 17 00:00:00 2001 From: Gian Marco Iodice Date: Mon, 17 Dec 2018 15:12:07 +0000 Subject: COMPMID-1710: Improve test coverage for CLGEMMMatrixMultiplyReshapedKernel Added test for: 1) Fp16 2) GEMM3D Change-Id: I17c03fe04fe49fba71685d33a6fd8572c91e1a56 Reviewed-on: https://review.mlplatform.org/416 Tested-by: Arm Jenkins Reviewed-by: Michele Di Giorgio --- tests/validation/CL/GEMMMatrixMultiplyReshaped.cpp | 257 +++++++++++++++++---- 1 file changed, 206 insertions(+), 51 deletions(-) (limited to 'tests/validation/CL/GEMMMatrixMultiplyReshaped.cpp') diff --git a/tests/validation/CL/GEMMMatrixMultiplyReshaped.cpp b/tests/validation/CL/GEMMMatrixMultiplyReshaped.cpp index e2fa194765..1a41e459bd 100644 --- a/tests/validation/CL/GEMMMatrixMultiplyReshaped.cpp +++ b/tests/validation/CL/GEMMMatrixMultiplyReshaped.cpp @@ -44,16 +44,47 @@ namespace test { namespace validation { +using namespace arm_compute::misc::shape_calculator; + +// Create function for CLGEMMReshapeLHSMatrixKernel +using CLGEMMReshapeLHSMatrix = CLSynthetizeFunctionInitOutputWithZeroAndWithZeroConstantBorder; + +// Create function for CLGEMMReshapeRHSMatrixKernel +using CLGEMMReshapeRHSMatrix = CLSynthetizeFunctionInitOutputWithZeroAndWithZeroConstantBorder; + +// Create function for CLGEMMMatrixMultiplyReshapedKernel +using CLGEMMMatrixMultiplyReshaped = CLSynthetizeFunction; + +// Fixture for CLGEMMMatrixMultiplyReshaped +template +using CLGEMMMatrixMultiplyReshapedFixture = GEMMMatrixMultiplyReshapedValidationFixture; + +// Fixture for CLGEMMMatrixMultiplyReshaped3D +template +using CLGEMMMatrixMultiplyReshaped3DFixture = GEMMMatrixMultiplyReshaped3DValidationFixture; + namespace { // *INDENT-OFF* // clang-format off -RelativeTolerance tolerance_f32(0.001f); +RelativeTolerance rel_tolerance_f32(0.001f); 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 */ +const auto a_values_precommit = framework::dataset::make("alpha", {1.0f, -0.75f} ); + /** M values to test */ const auto m_values = framework::dataset::make("M", 37); +/** M_W values to test */ +const auto m_w_values = framework::dataset::make("M_W", 5); + +/** M_H values to test */ +const auto m_h_values = framework::dataset::make("M_H", 7); + /** N values to test */ const auto n_values = framework::dataset::make("N", 51); @@ -64,13 +95,13 @@ const auto k_values = framework::dataset::make("K", 43); const auto b_values = framework::dataset::make("batch_size", 1, 3); /** M0 values to test - Precommit */ -const auto m0_values_precommit = framework::dataset::make("M0", {4, 5, 6}); +const auto m0_values_precommit = framework::dataset::make("M0", {4, 6}); /** N0 values to test - Precommit */ -const auto n0_values_precommit = framework::dataset::make("N0", { 2, 4, 8 }); +const auto n0_values_precommit = framework::dataset::make("N0", { 2, 4 }); /** K0 values to test - Precommit */ -const auto k0_values_precommit = framework::dataset::make("K0", { 4, 8 }); +const auto k0_values_precommit = framework::dataset::make("K0", { 4 }); /** V0 values to test - Precommit */ const auto v0_values_precommit = framework::dataset::make("V0", 1, 3); @@ -78,6 +109,9 @@ const auto v0_values_precommit = framework::dataset::make("V0", 1, 3); /** H0 values to test - Precommit */ const auto h0_values_precommit = framework::dataset::make("H0", 1, 3); +/** Alpha values to test - Nightly */ +const auto a_values_nightly = framework::dataset::make("alpha", {1.0f, -0.75f, 0.85f} ); + /** M0 values to test - Nightly */ const auto m0_values_nightly = framework::dataset::make("M0", 2, 8); @@ -99,37 +133,8 @@ const auto i_values_lhs = framework::dataset::make("interleave_lhs", { true, fal /** Interleave values to test with RHS matrix */ const auto i_values_rhs = framework::dataset::make("interleave_rhs", { true, false }); -} // namespace - -using namespace arm_compute::misc::shape_calculator; - -// Create function for CLGEMMReshapeLHSMatrixKernel -using CLGEMMReshapeLHSMatrix = CLSynthetizeFunctionInitOutputWithZeroAndWithZeroConstantBorder; - -// Create function for CLGEMMReshapeRHSMatrixKernel -using CLGEMMReshapeRHSMatrix = CLSynthetizeFunctionInitOutputWithZeroAndWithZeroConstantBorder; - -// Create function for CLGEMMMatrixMultiplyReshapedKernel -using CLGEMMMatrixMultiplyReshaped = CLSynthetizeFunction; - -// Fixture for CLGEMMMatrixMultiplyReshaped -using CLGEMMMatrixMultiplyReshapedFixture = GEMMMatrixMultiplyReshapedValidationFixture; - -TEST_SUITE(CL) -TEST_SUITE(GEMMMatrixMultiplyReshaped) -DATA_TEST_CASE(Configuration, framework::DatasetMode::ALL, combine(combine(combine(combine(combine(combine(combine(combine(combine(combine( - m_values, - n_values), - k_values), - framework::dataset::make("batch_size", 1)), - m0_values_precommit), - n0_values_precommit), - k0_values_precommit), - v0_values_precommit), - h0_values_precommit), - i_values_lhs), - i_values_rhs), -m_value, n_value, k_value, b_value, m0_value, n0_value, k0_value, v0_value, h0_value, i_value_lhs, i_value_rhs) +/** Configuration test */ +void validate_configuration(unsigned int m_value, unsigned int n_value, unsigned int k_value, unsigned int b_value, unsigned int m0_value, unsigned int n0_value, unsigned int k0_value, unsigned int v0_value, unsigned int h0_value, bool i_value_lhs, bool i_value_rhs, DataType data_type) { const unsigned int M = m_value; const unsigned int N = n_value; @@ -152,22 +157,22 @@ m_value, n_value, k_value, b_value, m0_value, n0_value, k0_value, v0_value, h0_v GEMMReshapeInfo gemm_info(M, N, K); const TensorShape lhs_shape(K, M, b_value); - const TensorShape lhs_shape_reshaped = compute_lhs_reshaped_shape(TensorInfo(lhs_shape, 1, DataType::F32), + const TensorShape lhs_shape_reshaped = compute_lhs_reshaped_shape(TensorInfo(lhs_shape, 1, data_type), lhs_info, false); const TensorShape rhs_shape(N, K, b_value); - const TensorShape rhs_shape_reshaped = compute_rhs_reshaped_shape(TensorInfo(rhs_shape, 1, DataType::F32), + 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, DataType::F32), - TensorInfo(rhs_shape_reshaped, 1, DataType::F32), + const TensorShape dst_shape = compute_mm_shape(TensorInfo(lhs_shape_reshaped, 1, data_type), + TensorInfo(rhs_shape_reshaped, 1, data_type), gemm_info); // Create tensors - CLTensor lhs_reshaped = create_tensor(lhs_shape_reshaped, DataType::F32); - CLTensor rhs_reshaped = create_tensor(rhs_shape_reshaped, DataType::F32); - CLTensor dst = create_tensor(dst_shape, DataType::F32); + CLTensor lhs_reshaped = create_tensor(lhs_shape_reshaped, data_type); + CLTensor rhs_reshaped = create_tensor(rhs_shape_reshaped, data_type); + CLTensor dst = create_tensor(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); @@ -177,11 +182,31 @@ m_value, n_value, k_value, b_value, m0_value, n0_value, k0_value, v0_value, h0_v CLGEMMMatrixMultiplyReshaped gemm; gemm.configure(&lhs_reshaped, &rhs_reshaped, &dst, 1.0f, lhs_info, rhs_info, gemm_info); } +} // namespace +TEST_SUITE(CL) +TEST_SUITE(GEMMMatrixMultiplyReshaped) TEST_SUITE(Float) TEST_SUITE(FP32) -FIXTURE_DATA_TEST_CASE(RunSmall, CLGEMMMatrixMultiplyReshapedFixture, framework::DatasetMode::ALL, - combine(combine(combine(combine(combine(combine(combine(combine(combine(combine( +DATA_TEST_CASE(Configuration, framework::DatasetMode::ALL, combine(combine(combine(combine(combine(combine(combine(combine(combine(combine( + m_values, + n_values), + k_values), + framework::dataset::make("batch_size", 1)), + m0_values_precommit), + n0_values_precommit), + k0_values_precommit), + v0_values_precommit), + h0_values_precommit), + i_values_lhs), + i_values_rhs), +m_value, n_value, k_value, b_value, m0_value, n0_value, k0_value, v0_value, h0_value, i_value_lhs, i_value_rhs) +{ + validate_configuration(m_value, n_value, k_value, b_value, m0_value, n0_value, k0_value, v0_value, h0_value, i_value_lhs, i_value_rhs, DataType::F32); +} + +FIXTURE_DATA_TEST_CASE(RunSmall, CLGEMMMatrixMultiplyReshapedFixture, framework::DatasetMode::ALL, + combine(combine(combine(combine(combine(combine(combine(combine(combine(combine(combine(combine( m_values, n_values), k_values), @@ -192,14 +217,16 @@ FIXTURE_DATA_TEST_CASE(RunSmall, CLGEMMMatrixMultiplyReshapedFixture, framework: v0_values_precommit), h0_values_precommit), i_values_lhs), - i_values_rhs)) + i_values_rhs), + framework::dataset::make("DataType", DataType::F32)), + a_values_precommit)) { // Validate output - validate(CLAccessor(_target), _reference, tolerance_f32, 0.f, abs_tolerance_f32); + validate(CLAccessor(_target), _reference, rel_tolerance_f32, 0.f, abs_tolerance_f32); } -FIXTURE_DATA_TEST_CASE(RunLarge, CLGEMMMatrixMultiplyReshapedFixture, framework::DatasetMode::NIGHTLY, - combine(combine(combine(combine(combine(combine(combine(combine(combine(combine( +FIXTURE_DATA_TEST_CASE(RunLarge, CLGEMMMatrixMultiplyReshapedFixture, framework::DatasetMode::NIGHTLY, + combine(combine(combine(combine(combine(combine(combine(combine(combine(combine(combine(combine( m_values, n_values), k_values), @@ -210,13 +237,141 @@ FIXTURE_DATA_TEST_CASE(RunLarge, CLGEMMMatrixMultiplyReshapedFixture, framework: v0_values_nightly), h0_values_nightly), i_values_lhs), - i_values_rhs)) + i_values_rhs), + framework::dataset::make("DataType", DataType::F32)), + a_values_nightly)) { // Validate output - validate(CLAccessor(_target), _reference, tolerance_f32, 0.f, abs_tolerance_f32); + validate(CLAccessor(_target), _reference, rel_tolerance_f32, 0.f, abs_tolerance_f32); +} + +FIXTURE_DATA_TEST_CASE(RunSmall3D, CLGEMMMatrixMultiplyReshaped3DFixture, framework::DatasetMode::ALL, + combine(combine(combine(combine(combine(combine(combine(combine(combine(combine(combine(combine(combine( + m_w_values, + m_h_values), + n_values), + k_values), + b_values), + m0_values_precommit), + n0_values_precommit), + k0_values_precommit), + v0_values_precommit), + h0_values_precommit), + i_values_lhs), + i_values_rhs), + framework::dataset::make("DataType", DataType::F32)), + a_values_precommit)) +{ + // Validate output + validate(CLAccessor(_target), _reference, rel_tolerance_f32, 0.f, abs_tolerance_f32); +} + +FIXTURE_DATA_TEST_CASE(RunLarge3D, CLGEMMMatrixMultiplyReshaped3DFixture, framework::DatasetMode::NIGHTLY, + combine(combine(combine(combine(combine(combine(combine(combine(combine(combine(combine(combine(combine( + m_w_values, + m_h_values), + n_values), + k_values), + b_values), + m0_values_nightly), + n0_values_nightly), + k0_values_nightly), + v0_values_nightly), + h0_values_nightly), + i_values_lhs), + i_values_rhs), + framework::dataset::make("DataType", DataType::F32)), + a_values_nightly)) +{ + // Validate output + validate(CLAccessor(_target), _reference, rel_tolerance_f32, 0.f, abs_tolerance_f32); } -TEST_SUITE_END() // Float TEST_SUITE_END() // FP32 + +TEST_SUITE(FP16) +FIXTURE_DATA_TEST_CASE(RunSmall, CLGEMMMatrixMultiplyReshapedFixture, framework::DatasetMode::ALL, + combine(combine(combine(combine(combine(combine(combine(combine(combine(combine(combine(combine( + m_values, + n_values), + k_values), + b_values), + m0_values_precommit), + n0_values_precommit), + k0_values_precommit), + v0_values_precommit), + h0_values_precommit), + i_values_lhs), + i_values_rhs), + framework::dataset::make("DataType", DataType::F16)), + a_values_precommit)) +{ + // Validate output + validate(CLAccessor(_target), _reference, rel_tolerance_f16, tolerance_num_f16); +} + +FIXTURE_DATA_TEST_CASE(RunLarge, CLGEMMMatrixMultiplyReshapedFixture, framework::DatasetMode::NIGHTLY, + combine(combine(combine(combine(combine(combine(combine(combine(combine(combine(combine(combine( + m_values, + n_values), + k_values), + b_values), + m0_values_nightly), + n0_values_nightly), + k0_values_nightly), + v0_values_nightly), + h0_values_nightly), + i_values_lhs), + i_values_rhs), + framework::dataset::make("DataType", DataType::F16)), + a_values_nightly)) +{ + // Validate output + validate(CLAccessor(_target), _reference, rel_tolerance_f16, tolerance_num_f16); +} + +FIXTURE_DATA_TEST_CASE(RunSmall3D, CLGEMMMatrixMultiplyReshaped3DFixture, framework::DatasetMode::ALL, + combine(combine(combine(combine(combine(combine(combine(combine(combine(combine(combine(combine(combine( + m_w_values, + m_h_values), + n_values), + k_values), + b_values), + m0_values_precommit), + n0_values_precommit), + k0_values_precommit), + v0_values_precommit), + h0_values_precommit), + i_values_lhs), + i_values_rhs), + framework::dataset::make("DataType", DataType::F16)), + a_values_precommit)) +{ + // Validate output + validate(CLAccessor(_target), _reference, rel_tolerance_f16, tolerance_num_f16); +} + +FIXTURE_DATA_TEST_CASE(RunLarge3D, CLGEMMMatrixMultiplyReshaped3DFixture, framework::DatasetMode::NIGHTLY, + combine(combine(combine(combine(combine(combine(combine(combine(combine(combine(combine(combine(combine( + m_w_values, + m_h_values), + n_values), + k_values), + b_values), + m0_values_nightly), + n0_values_nightly), + k0_values_nightly), + v0_values_nightly), + h0_values_nightly), + i_values_lhs), + i_values_rhs), + framework::dataset::make("DataType", DataType::F16)), + a_values_nightly)) +{ + // Validate output + validate(CLAccessor(_target), _reference, rel_tolerance_f16, tolerance_num_f16); +} +TEST_SUITE_END() // FP16 +TEST_SUITE_END() // Float TEST_SUITE_END() // GEMMMatrixMulipltyReshaped TEST_SUITE_END() // CL } // namespace validation -- cgit v1.2.1