From b2f14e496faaea09e20ccfeae6bf2b6d51c81bf8 Mon Sep 17 00:00:00 2001 From: xuwei06 Date: Wed, 3 May 2017 16:05:52 -0700 Subject: [PATCH] Fix dynamic loading of Lapack caused by #1958 This only fixes the issue for ATLAS MKL is still another fix. --- paddle/math/MathFunctions.cpp | 11 +++++++++-- paddle/math/tests/test_matrixCompare.cpp | 9 +-------- paddle/utils/DynamicLoader.cpp | 2 +- 3 files changed, 11 insertions(+), 11 deletions(-) diff --git a/paddle/math/MathFunctions.cpp b/paddle/math/MathFunctions.cpp index 178fce5b0a9..802a56a0d15 100644 --- a/paddle/math/MathFunctions.cpp +++ b/paddle/math/MathFunctions.cpp @@ -29,13 +29,20 @@ void* lapack_dso_handle = nullptr; * * note: default dynamic linked libs */ + +// The argument for stringizing operator is not macro-expanded first. +// We have to use two levels of macro to do the expansion. +// See https://gcc.gnu.org/onlinedocs/cpp/Stringizing.html +#define STR(x) #x #define DYNAMIC_LOAD_LAPACK_WRAP(__name) \ struct DynLoad__##__name { \ template \ auto operator()(Args... args) -> decltype(__name(args...)) { \ using lapack_func = decltype(__name(args...)) (*)(Args...); \ std::call_once(lapack_dso_flag, GetLapackDsoHandle, &lapack_dso_handle); \ - void* p_##__name = dlsym(lapack_dso_handle, #__name); \ + void* p_##__name = dlsym(lapack_dso_handle, STR(__name)); \ + CHECK(p_##__name) << "Cannot find symbol " << STR(__name) \ + << " in liblapack.so"; \ return reinterpret_cast(p_##__name)(args...); \ } \ } __name; // struct DynLoad__##__name @@ -51,7 +58,7 @@ void* lapack_dso_handle = nullptr; #define PADDLE_DGETRF LAPACKE_dgetrf #define PADDLE_SGETRI LAPACKE_sgetri #define PADDLE_DGETRI LAPACKE_dgetri -#endif +#endif #define LAPACK_ROUTINE_EACH(__macro) \ __macro(PADDLE_SGETRF) \ diff --git a/paddle/math/tests/test_matrixCompare.cpp b/paddle/math/tests/test_matrixCompare.cpp index 3b1b0065af3..782a9613d87 100644 --- a/paddle/math/tests/test_matrixCompare.cpp +++ b/paddle/math/tests/test_matrixCompare.cpp @@ -237,14 +237,7 @@ TEST(Matrix, unary) { testMatrixRotate(height, width); } // inverse matrix - void** dso_handler = nullptr; - GetLapackDsoHandle(dso_handler); - if (nullptr == *dso_handler) { - LOG(WARNING) << "Failed to find liblapack.so, please specify its path " - "using LD_LIBRARY_PATH."; - } else { - testMatrixInverse(height); - } + testMatrixInverse(height); } } diff --git a/paddle/utils/DynamicLoader.cpp b/paddle/utils/DynamicLoader.cpp index 368c35e1518..87c36eae6fb 100644 --- a/paddle/utils/DynamicLoader.cpp +++ b/paddle/utils/DynamicLoader.cpp @@ -52,7 +52,7 @@ static inline std::string join(const std::string& part1, static inline void GetDsoHandleFromDefaultPath(std::string& dso_path, void** dso_handle, int dynload_flags) { - VLOG(3) << "Try to find cuda library: " << dso_path + VLOG(3) << "Try to find library: " << dso_path << " from default system path."; // default search from LD_LIBRARY_PATH/DYLD_LIBRARY_PATH *dso_handle = dlopen(dso_path.c_str(), dynload_flags); -- GitLab