diff --git a/projects/miopen/test/gtest/CMakeLists.txt b/projects/miopen/test/gtest/CMakeLists.txt index 409ba9521788..3cfe35a98a1e 100644 --- a/projects/miopen/test/gtest/CMakeLists.txt +++ b/projects/miopen/test/gtest/CMakeLists.txt @@ -65,12 +65,6 @@ if(THEROCK_SANITIZER STREQUAL "ASAN") # temporarily disable: LeakSanitizer reports a memory leak at exit # (assertions pass but the process leaks). list(APPEND SKIP_TESTS find_2_conv.cpp) - # temporarily disable (ALMIOPEN-3097): LeakSanitizer reports leaks at exit because these tests never call - # miopenDestroySolution on the solutions returned by miopenFindSolutions (assertions pass). - list(APPEND SKIP_TESTS - na_inference_find2.cpp - na_train_find2.cpp - ) # temporarily disable: these fail under ASan even when run individually # on gfx942. list(APPEND SKIP_TESTS diff --git a/projects/miopen/test/gtest/na_inference_find2.cpp b/projects/miopen/test/gtest/na_inference_find2.cpp index fa45d8eddcc8..f5dba1a5e84e 100644 --- a/projects/miopen/test/gtest/na_inference_find2.cpp +++ b/projects/miopen/test/gtest/na_inference_find2.cpp @@ -22,6 +22,7 @@ using ptr_FusionPlanDesc = MIOPEN_MANAGE_PTR(miopenFusionPlanDescriptor_t, miope using ptr_FusionPlanArgs = MIOPEN_MANAGE_PTR(miopenOperatorArgs_t, miopenDestroyOperatorArgs); using ptr_ActivationDesc = MIOPEN_MANAGE_PTR(miopenActivationDescriptor_t, miopenDestroyActivationDescriptor); +using ptr_Solution = MIOPEN_MANAGE_PTR(miopenSolution_t, miopenDestroySolution); using ManagedFindOptions = std::unique_ptr, miopenStatus_t (*)(miopenFindOptions_t)>; @@ -42,6 +43,23 @@ static inline auto MakeFindOtions() -> ManagedFindOptions return {find_options_raw, &miopenDestroyFindOptions}; } +// Owns every solution as soon as find returns, so a later fatal assertion cannot leak them. +static std::vector +FindSolutions(miopenHandle_t handle, miopenProblem_t problem, miopenFindOptions_t options) +{ + auto raw_solutions = std::vector(1); + std::size_t solutions_found = 0; + EXPECT_EQ( + miopenFindSolutions( + handle, problem, options, raw_solutions.data(), &solutions_found, raw_solutions.size()), + miopenStatusSuccess); + + auto solutions = std::vector{}; + for(std::size_t i = 0; i < solutions_found; ++i) + solutions.emplace_back(raw_solutions[i]); + return solutions; +} + static inline void AddAndFuse(miopenProblem_t left, std::function&& make_right_problem) { @@ -156,26 +174,11 @@ struct verify_inference_batchnorm_activ // clang-format on }; - std::vector solutions; - solutions.resize(1); - - { - std::size_t solutions_found; - const auto find_ret = miopenFindSolutions(&handle, - m_problem, - find_options.get(), - solutions.data(), - &solutions_found, - solutions.size()); - - EXPECT_EQ(find_ret, miopenStatusSuccess); - solutions.resize(solutions_found); - } - - for(const auto solution : solutions) + const auto solutions = FindSolutions(&handle, m_problem, find_options.get()); + for(const auto& solution : solutions) { const auto run_ret = miopenRunSolution( - &handle, solution, run_tensors.size(), run_tensors.data(), nullptr, 0); + &handle, solution.get(), run_tensors.size(), run_tensors.data(), nullptr, 0); EXPECT_EQ(run_ret, miopenStatusSuccess); } diff --git a/projects/miopen/test/gtest/na_train_find2.cpp b/projects/miopen/test/gtest/na_train_find2.cpp index 88f5b50e0a38..0dbc25a093d5 100644 --- a/projects/miopen/test/gtest/na_train_find2.cpp +++ b/projects/miopen/test/gtest/na_train_find2.cpp @@ -22,6 +22,7 @@ using ptr_FusionPlanDesc = MIOPEN_MANAGE_PTR(miopenFusionPlanDescriptor_t, miope using ptr_FusionPlanArgs = MIOPEN_MANAGE_PTR(miopenOperatorArgs_t, miopenDestroyOperatorArgs); using ptr_ActivationDesc = MIOPEN_MANAGE_PTR(miopenActivationDescriptor_t, miopenDestroyActivationDescriptor); +using ptr_Solution = MIOPEN_MANAGE_PTR(miopenSolution_t, miopenDestroySolution); using ManagedFindOptions = std::unique_ptr, miopenStatus_t (*)(miopenFindOptions_t)>; @@ -47,6 +48,23 @@ static inline ManagedFindOptions MakeFindOtions() return {find_options_raw, &miopenDestroyFindOptions}; } +// Owns every solution as soon as find returns, so a later fatal assertion cannot leak them. +static std::vector +FindSolutions(miopenHandle_t handle, miopenProblem_t problem, miopenFindOptions_t options) +{ + auto raw_solutions = std::vector(1); + std::size_t solutions_found = 0; + EXPECT_EQ( + miopenFindSolutions( + handle, problem, options, raw_solutions.data(), &solutions_found, raw_solutions.size()), + miopenStatusSuccess); + + auto solutions = std::vector{}; + for(std::size_t i = 0; i < solutions_found; ++i) + solutions.emplace_back(raw_solutions[i]); + return solutions; +} + template struct verify_fwd_batchnorm_spatial_activ { @@ -173,26 +191,11 @@ struct verify_fwd_batchnorm_spatial_activ // clang-format on }; - std::vector solutions; - solutions.resize(1); - - { - std::size_t solutions_found; - const auto find_ret = miopenFindSolutions(&handle, - problem, - find_options.get(), - solutions.data(), - &solutions_found, - solutions.size()); - - EXPECT_EQ(find_ret, miopenStatusSuccess); - solutions.resize(solutions_found); - } - - for(const auto solution : solutions) + const auto solutions = FindSolutions(&handle, problem, find_options.get()); + for(const auto& solution : solutions) { const auto run_ret = miopenRunSolution( - &handle, solution, run_tensors.size(), run_tensors.data(), nullptr, 0); + &handle, solution.get(), run_tensors.size(), run_tensors.data(), nullptr, 0); EXPECT_EQ(run_ret, miopenStatusSuccess); } @@ -360,25 +363,11 @@ struct verify_bwd_batchnorm_spatial_activ // clang-format on }; - std::vector solutions; - solutions.resize(1); - - { - std::size_t solutions_found; - const auto find_ret = miopenFindSolutions(&handle, - problem, - find_options.get(), - solutions.data(), - &solutions_found, - solutions.size()); - EXPECT_EQ(find_ret, miopenStatusSuccess); - solutions.resize(solutions_found); - } - - for(const auto solution : solutions) + const auto solutions = FindSolutions(&handle, problem, find_options.get()); + for(const auto& solution : solutions) { const auto run_ret = miopenRunSolution( - &handle, solution, run_tensors.size(), run_tensors.data(), nullptr, 0); + &handle, solution.get(), run_tensors.size(), run_tensors.data(), nullptr, 0); EXPECT_EQ(run_ret, miopenStatusSuccess); } @@ -526,26 +515,11 @@ struct verify_fwd_batchnorm_peract_activ // clang-format on }; - std::vector solutions; - solutions.resize(1); - - { - std::size_t solutions_found; - const auto find_ret = miopenFindSolutions(&handle, - problem, - find_options.get(), - solutions.data(), - &solutions_found, - solutions.size()); - - EXPECT_EQ(find_ret, miopenStatusSuccess); - solutions.resize(solutions_found); - } - - for(const auto solution : solutions) + const auto solutions = FindSolutions(&handle, problem, find_options.get()); + for(const auto& solution : solutions) { const auto run_ret = miopenRunSolution( - &handle, solution, run_tensors.size(), run_tensors.data(), nullptr, 0); + &handle, solution.get(), run_tensors.size(), run_tensors.data(), nullptr, 0); EXPECT_EQ(run_ret, miopenStatusSuccess); } @@ -702,25 +676,11 @@ struct verify_bwd_batchnorm_peract_activ // clang-format on }; - std::vector solutions; - solutions.resize(1); - - { - std::size_t solutions_found; - const auto find_ret = miopenFindSolutions(&handle, - problem, - find_options.get(), - solutions.data(), - &solutions_found, - solutions.size()); - EXPECT_EQ(find_ret, miopenStatusSuccess); - solutions.resize(solutions_found); - } - - for(const auto solution : solutions) + const auto solutions = FindSolutions(&handle, problem, find_options.get()); + for(const auto& solution : solutions) { const auto run_ret = miopenRunSolution( - &handle, solution, run_tensors.size(), run_tensors.data(), nullptr, 0); + &handle, solution.get(), run_tensors.size(), run_tensors.data(), nullptr, 0); EXPECT_EQ(run_ret, miopenStatusSuccess); }