// Copyright © Advanced Micro Devices, Inc., or its affiliates. // SPDX-License-Identifier: MIT #include "unit_conv_solver_group_xdlops.hpp" namespace { // numeric part of test case using TestCase = miopen::unit_tests::GroupXdlopsNumericData; using TestDataType = miopen::unit_tests::TestDataType; template std::vector GetConvSmokeTestCases() { const bool tf32_compute = type == TestDataType::TF32; return { // clang-format off //TestCase {{1, 4, 14, 28, 28}, {4, 4, 3, 3, 3}, {1, 1, 1}, {1, 1, 1}, {1, 1, 1}, 1} TestCase {{1, 4, 8, 28, 28}, {4, 4, 3, 3, 3}, {0, 0, 0}, {1, 1, 1}, {1, 1, 1}, 1, false, tf32_compute} // clang-format on }; } template std::vector GetConvFullTestCases() { const bool tf32_compute = type == TestDataType::TF32; return { // clang-format off // Group Count = 1 TestCase {{1, 1, 8, 8, 8}, {1, 1, 2, 2, 2}, {0, 0, 0}, {2, 2, 2}, {1, 1, 1}, 1, false, tf32_compute}, TestCase {{6, 448, 3, 118, 182}, {896, 448, 1, 1, 1}, {0, 0, 0}, {1, 2, 2}, {1, 1, 1}, 1, false, tf32_compute}, // Group Count > 1 (2, 3, 4) TestCase {{128, 2, 28, 28, 28}, {2, 1, 3, 3, 3}, {1, 1, 1}, {1, 1, 1}, {1, 1, 1}, 2, false, tf32_compute}, TestCase {{128, 2, 28, 28, 28}, {2, 1, 3, 3, 3}, {1, 1, 1}, {2, 2, 2}, {1, 1, 1}, 2, false, tf32_compute}, TestCase {{256, 9, 2, 14, 14}, {27, 3, 2, 14, 14}, {1, 1, 1}, {1, 1, 1}, {1, 1, 1}, 3, false, tf32_compute}, TestCase {{128, 4, 28, 28, 28}, {8, 1, 3, 3, 3}, {1, 1, 1}, {2, 2, 2}, {1, 1, 1}, 4, false, tf32_compute} // clang-format on }; } auto GetDevApplicabilityConvCase() { // For device applicability checks return GetConvTestForGroupXdlops( miopenTensorNDHWC, std::move(GetConvSmokeTestCases()[0])); } template miopen::unit_tests::UnitTestConvSolverParams GetTestParams() { // CK dynamic-library tests are HIP-only; runtime plugin availability is checked by the harness. #if MIOPEN_BACKEND_HIP Gpu supportedDevices; if constexpr(type == TestDataType::FP32) { supportedDevices = Gpu::gfx908 | Gpu::gfx90A | Gpu::gfx94X | Gpu::gfx950; } else if constexpr(type == TestDataType::TF32) { supportedDevices = Gpu::gfx94X | Gpu::gfx950; } else { supportedDevices = Gpu::gfx908 | Gpu::gfx90A | Gpu::gfx94X | Gpu::gfx950 | Gpu::gfx110X | Gpu::gfx115X | Gpu::gfx120X; } #else Gpu supportedDevices = Gpu::None; #endif miopen::unit_tests::UnitTestConvSolverParams p(supportedDevices); p.ExcludeDevice("gfx1103"); p.Tunable(5); p.UsesCKDynamicLib(); return p; } // Deterministic test case (for CPU deterministic applicability test) auto GetDeterministicConvCase() { TestCase test_case = { // clang-format off TestCase {{1, 4, 8, 28, 28}, {4, 4, 3, 3, 3}, {0, 0, 0}, {1, 1, 1}, {1, 1, 1}, 1, true} // clang-format on }; return GetConvTestForGroupXdlops(miopenTensorNDHWC, std::move(test_case)); } } // namespace // CK Applicability checks fail on I8 type // ie for this case: TestCase {{1, 4, 8, 28, 28}, {4, 4, 3, 3, 3}, {0, 0, 0}, {1, 1, 1}, {1, 1, 1}, // 1} using GPU_UnitTestConvSolverImplicitGemm3DGroupBwdXdlops_I8 = // miopen::unit_tests::UnitTestConvSolverGroupXDlops; using GPU_UnitTestConvSolverImplicitGemm3DGroupBwdXdlops_FP16 = miopen::unit_tests::UnitTestConvSolverGroupXDlops; using GPU_UnitTestConvSolverImplicitGemm3DGroupBwdXdlops_BFP16 = miopen::unit_tests::UnitTestConvSolverGroupXDlops; using GPU_UnitTestConvSolverImplicitGemm3DGroupBwdXdlops_FP32 = miopen::unit_tests::UnitTestConvSolverGroupXDlops; using GPU_UnitTestConvSolverImplicitGemm3DGroupBwdXdlops_TF32 = miopen::unit_tests::UnitTestConvSolverGroupXDlops; using CPU_UnitTestConvSolverImplicitGemm3DGroupBwdXdlopsDevApplicability_FP16 = CPU_UnitTestConvSolverDevApplicabilityBwd_NONE; using CPU_UnitTestConvSolverImplicitGemm3DGroupBwdXdlopsDeterministicApplicability_NONE = CPU_UnitTestConvSolverDevApplicabilityBwd_NONE; TEST_P(GPU_UnitTestConvSolverImplicitGemm3DGroupBwdXdlops_FP16, ConvHipImplicitGemm3DGroupBwdXdlops) { this->RunTest(miopen::solver::conv::ConvHipImplicitGemm3DGroupBwdXdlops{}); }; TEST_P(GPU_UnitTestConvSolverImplicitGemm3DGroupBwdXdlops_BFP16, ConvHipImplicitGemm3DGroupBwdXdlops) { this->RunTest(miopen::solver::conv::ConvHipImplicitGemm3DGroupBwdXdlops{}); }; TEST_P(GPU_UnitTestConvSolverImplicitGemm3DGroupBwdXdlops_FP32, ConvHipImplicitGemm3DGroupBwdXdlops) { this->RunTest(miopen::solver::conv::ConvHipImplicitGemm3DGroupBwdXdlops{}); }; TEST_P(GPU_UnitTestConvSolverImplicitGemm3DGroupBwdXdlops_TF32, ConvHipImplicitGemm3DGroupBwdXdlops) { this->RunTest(miopen::solver::conv::ConvHipImplicitGemm3DGroupBwdXdlops{}); }; TEST_P(CPU_UnitTestConvSolverImplicitGemm3DGroupBwdXdlopsDevApplicability_FP16, ConvHipImplicitGemm3DGroupBwdXdlops) { this->RunTest(miopen::solver::conv::ConvHipImplicitGemm3DGroupBwdXdlops{}); }; TEST_P(CPU_UnitTestConvSolverImplicitGemm3DGroupBwdXdlopsDeterministicApplicability_NONE, ConvHipImplicitGemm3DGroupBwdXdlops) { this->RunTest(miopen::solver::conv::ConvHipImplicitGemm3DGroupBwdXdlops{}); }; // Smoke tests INSTANTIATE_TEST_SUITE_P( Smoke, GPU_UnitTestConvSolverImplicitGemm3DGroupBwdXdlops_FP16, testing::Combine(testing::Values(GetTestParams()), testing::Values(miopenTensorNDHWC, miopenTensorNCDHW), testing::ValuesIn(GetConvSmokeTestCases()))); INSTANTIATE_TEST_SUITE_P( Smoke, GPU_UnitTestConvSolverImplicitGemm3DGroupBwdXdlops_BFP16, testing::Combine(testing::Values(GetTestParams()), testing::Values(miopenTensorNDHWC, miopenTensorNCDHW), testing::ValuesIn(GetConvSmokeTestCases()))); INSTANTIATE_TEST_SUITE_P( Smoke, GPU_UnitTestConvSolverImplicitGemm3DGroupBwdXdlops_FP32, testing::Combine(testing::Values(GetTestParams()), testing::Values(miopenTensorNDHWC, miopenTensorNCDHW), testing::ValuesIn(GetConvSmokeTestCases()))); INSTANTIATE_TEST_SUITE_P( Smoke, GPU_UnitTestConvSolverImplicitGemm3DGroupBwdXdlops_TF32, testing::Combine(testing::Values(GetTestParams()), testing::Values(miopenTensorNDHWC, miopenTensorNCDHW), testing::ValuesIn(GetConvSmokeTestCases()))); // Full tests INSTANTIATE_TEST_SUITE_P( Full, GPU_UnitTestConvSolverImplicitGemm3DGroupBwdXdlops_FP16, testing::Combine(testing::Values(GetTestParams()), testing::Values(miopenTensorNDHWC, miopenTensorNCDHW), testing::ValuesIn(GetConvFullTestCases()))); INSTANTIATE_TEST_SUITE_P( Full, GPU_UnitTestConvSolverImplicitGemm3DGroupBwdXdlops_BFP16, testing::Combine(testing::Values(GetTestParams()), testing::Values(miopenTensorNDHWC, miopenTensorNCDHW), testing::ValuesIn(GetConvFullTestCases()))); INSTANTIATE_TEST_SUITE_P( Full, GPU_UnitTestConvSolverImplicitGemm3DGroupBwdXdlops_FP32, testing::Combine(testing::Values(GetTestParams()), testing::Values(miopenTensorNDHWC, miopenTensorNCDHW), testing::ValuesIn(GetConvFullTestCases()))); INSTANTIATE_TEST_SUITE_P( Full, GPU_UnitTestConvSolverImplicitGemm3DGroupBwdXdlops_TF32, testing::Combine(testing::Values(GetTestParams()), testing::Values(miopenTensorNDHWC, miopenTensorNCDHW), testing::ValuesIn(GetConvFullTestCases()))); // Device applicability tests INSTANTIATE_TEST_SUITE_P(Smoke, CPU_UnitTestConvSolverImplicitGemm3DGroupBwdXdlopsDevApplicability_FP16, testing::Combine(testing::Values(GetTestParams()), testing::Values(GetDevApplicabilityConvCase()))); INSTANTIATE_TEST_SUITE_P( Smoke, CPU_UnitTestConvSolverImplicitGemm3DGroupBwdXdlopsDeterministicApplicability_NONE, testing::Combine(testing::Values(GetTestParams()), testing::Values(GetDeterministicConvCase())));