提交 b2f14e49 编写于 作者: X xuwei06

Fix dynamic loading of Lapack caused by #1958

This only fixes the issue for ATLAS
MKL is still another fix.
上级 a3e975d9
...@@ -29,13 +29,20 @@ void* lapack_dso_handle = nullptr; ...@@ -29,13 +29,20 @@ void* lapack_dso_handle = nullptr;
* *
* note: default dynamic linked libs * 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) \ #define DYNAMIC_LOAD_LAPACK_WRAP(__name) \
struct DynLoad__##__name { \ struct DynLoad__##__name { \
template <typename... Args> \ template <typename... Args> \
auto operator()(Args... args) -> decltype(__name(args...)) { \ auto operator()(Args... args) -> decltype(__name(args...)) { \
using lapack_func = decltype(__name(args...)) (*)(Args...); \ using lapack_func = decltype(__name(args...)) (*)(Args...); \
std::call_once(lapack_dso_flag, GetLapackDsoHandle, &lapack_dso_handle); \ 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<lapack_func>(p_##__name)(args...); \ return reinterpret_cast<lapack_func>(p_##__name)(args...); \
} \ } \
} __name; // struct DynLoad__##__name } __name; // struct DynLoad__##__name
...@@ -51,7 +58,7 @@ void* lapack_dso_handle = nullptr; ...@@ -51,7 +58,7 @@ void* lapack_dso_handle = nullptr;
#define PADDLE_DGETRF LAPACKE_dgetrf #define PADDLE_DGETRF LAPACKE_dgetrf
#define PADDLE_SGETRI LAPACKE_sgetri #define PADDLE_SGETRI LAPACKE_sgetri
#define PADDLE_DGETRI LAPACKE_dgetri #define PADDLE_DGETRI LAPACKE_dgetri
#endif #endif
#define LAPACK_ROUTINE_EACH(__macro) \ #define LAPACK_ROUTINE_EACH(__macro) \
__macro(PADDLE_SGETRF) \ __macro(PADDLE_SGETRF) \
......
...@@ -237,14 +237,7 @@ TEST(Matrix, unary) { ...@@ -237,14 +237,7 @@ TEST(Matrix, unary) {
testMatrixRotate(height, width); testMatrixRotate(height, width);
} }
// inverse matrix // inverse matrix
void** dso_handler = nullptr; testMatrixInverse(height);
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);
}
} }
} }
......
...@@ -52,7 +52,7 @@ static inline std::string join(const std::string& part1, ...@@ -52,7 +52,7 @@ static inline std::string join(const std::string& part1,
static inline void GetDsoHandleFromDefaultPath(std::string& dso_path, static inline void GetDsoHandleFromDefaultPath(std::string& dso_path,
void** dso_handle, void** dso_handle,
int dynload_flags) { int dynload_flags) {
VLOG(3) << "Try to find cuda library: " << dso_path VLOG(3) << "Try to find library: " << dso_path
<< " from default system path."; << " from default system path.";
// default search from LD_LIBRARY_PATH/DYLD_LIBRARY_PATH // default search from LD_LIBRARY_PATH/DYLD_LIBRARY_PATH
*dso_handle = dlopen(dso_path.c_str(), dynload_flags); *dso_handle = dlopen(dso_path.c_str(), dynload_flags);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册