提交 42d64085 编写于 作者: G gangliao 提交者: GitHub

Merge pull request #1998 from emailweixu/fix_lapack

Fix dynamic loading of Lapack caused by #1958
......@@ -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 <typename... Args> \
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<lapack_func>(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) \
......
......@@ -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);
}
}
......
......@@ -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);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册