From 1404437a90843e94b301506df11d653c3b6e3b09 Mon Sep 17 00:00:00 2001 From: Megvii Engine Team Date: Wed, 10 Aug 2022 17:23:04 +0800 Subject: [PATCH] fix(mgb): fix the compatibility issue of cuda stub with older version drivers GitOrigin-RevId: 628afbf3cf58fb6286fea65d315ac08e2b62245f --- dnn/cuda-stub/src/dlopen_helper.h | 2 +- dnn/cuda-stub/src/libcuda-wrap_10.1.h | 10 +++++++++- dnn/cuda-stub/src/libcuda-wrap_10.2.h | 10 +++++++++- dnn/cuda-stub/src/libcuda-wrap_11.1.h | 10 +++++++++- dnn/cuda-stub/src/libcuda-wrap_11.2.h | 10 +++++++++- dnn/cuda-stub/src/libcuda-wrap_11.4.h | 10 +++++++++- dnn/cuda-stub/src/libcuda.cpp | 4 ++-- 7 files changed, 48 insertions(+), 8 deletions(-) diff --git a/dnn/cuda-stub/src/dlopen_helper.h b/dnn/cuda-stub/src/dlopen_helper.h index 728c348a..c6ca2ebf 100644 --- a/dnn/cuda-stub/src/dlopen_helper.h +++ b/dnn/cuda-stub/src/dlopen_helper.h @@ -111,7 +111,7 @@ static void* resolve_library_func(void* handle, const char* func) { } auto ret = dlsym(handle, func); if (!ret) { - LOGD("failed to load %s func: %s", g_default_api_name, func); + LOGD("failed to load %s func: %s.(It seems that the currently used version of the library containing the function is too old.)", g_default_api_name, func); } return ret; } diff --git a/dnn/cuda-stub/src/libcuda-wrap_10.1.h b/dnn/cuda-stub/src/libcuda-wrap_10.1.h index 106ae99e..c35b8d1d 100644 --- a/dnn/cuda-stub/src/libcuda-wrap_10.1.h +++ b/dnn/cuda-stub/src/libcuda-wrap_10.1.h @@ -3829,6 +3829,7 @@ static void load_library() { return; void* handle = get_library_handle(); + int num = 0; for (size_t i = 0; i < NR_FUNC; ++i) { void* func; if (!handle) { @@ -3837,10 +3838,17 @@ static void load_library() { func = resolve_library_func(handle, g_func_name[i]); } if (!func) { - func = g_func_table_error[i]; + break; } + num++; __atomic_store_n(g_func_table + i, func, __ATOMIC_RELAXED); } + if (num != NR_FUNC) { + for (size_t i = 0; i < NR_FUNC; ++i) { + void* func = g_func_table_error[i]; + __atomic_store_n(g_func_table + i, func, __ATOMIC_RELAXED); + } + } done = true; } diff --git a/dnn/cuda-stub/src/libcuda-wrap_10.2.h b/dnn/cuda-stub/src/libcuda-wrap_10.2.h index fbbc8eba..be6d05ce 100644 --- a/dnn/cuda-stub/src/libcuda-wrap_10.2.h +++ b/dnn/cuda-stub/src/libcuda-wrap_10.2.h @@ -3999,6 +3999,7 @@ static void load_library() { return; void* handle = get_library_handle(); + int num = 0; for (size_t i = 0; i < NR_FUNC; ++i) { void* func; if (!handle) { @@ -4007,10 +4008,17 @@ static void load_library() { func = resolve_library_func(handle, g_func_name[i]); } if (!func) { - func = g_func_table_error[i]; + break; } + num++; __atomic_store_n(g_func_table + i, func, __ATOMIC_RELAXED); } + if (num != NR_FUNC) { + for (size_t i = 0; i < NR_FUNC; ++i) { + void* func = g_func_table_error[i]; + __atomic_store_n(g_func_table + i, func, __ATOMIC_RELAXED); + } + } done = true; } diff --git a/dnn/cuda-stub/src/libcuda-wrap_11.1.h b/dnn/cuda-stub/src/libcuda-wrap_11.1.h index e528c56e..31f7b6f4 100644 --- a/dnn/cuda-stub/src/libcuda-wrap_11.1.h +++ b/dnn/cuda-stub/src/libcuda-wrap_11.1.h @@ -4369,6 +4369,7 @@ static void load_library() { return; void* handle = get_library_handle(); + int num = 0; for (size_t i = 0; i < NR_FUNC; ++i) { void* func; if (!handle) { @@ -4377,10 +4378,17 @@ static void load_library() { func = resolve_library_func(handle, g_func_name[i]); } if (!func) { - func = g_func_table_error[i]; + break; } + num++; __atomic_store_n(g_func_table + i, func, __ATOMIC_RELAXED); } + if (num != NR_FUNC) { + for (size_t i = 0; i < NR_FUNC; ++i) { + void* func = g_func_table_error[i]; + __atomic_store_n(g_func_table + i, func, __ATOMIC_RELAXED); + } + } done = true; } diff --git a/dnn/cuda-stub/src/libcuda-wrap_11.2.h b/dnn/cuda-stub/src/libcuda-wrap_11.2.h index 738aef5a..1f7ec35a 100644 --- a/dnn/cuda-stub/src/libcuda-wrap_11.2.h +++ b/dnn/cuda-stub/src/libcuda-wrap_11.2.h @@ -4659,6 +4659,7 @@ static void load_library() { return; void* handle = get_library_handle(); + int num = 0; for (size_t i = 0; i < NR_FUNC; ++i) { void* func; if (!handle) { @@ -4667,10 +4668,17 @@ static void load_library() { func = resolve_library_func(handle, g_func_name[i]); } if (!func) { - func = g_func_table_error[i]; + break; } + num++; __atomic_store_n(g_func_table + i, func, __ATOMIC_RELAXED); } + if (num != NR_FUNC) { + for (size_t i = 0; i < NR_FUNC; ++i) { + void* func = g_func_table_error[i]; + __atomic_store_n(g_func_table + i, func, __ATOMIC_RELAXED); + } + } done = true; } diff --git a/dnn/cuda-stub/src/libcuda-wrap_11.4.h b/dnn/cuda-stub/src/libcuda-wrap_11.4.h index 37a906c6..83a0ef9a 100644 --- a/dnn/cuda-stub/src/libcuda-wrap_11.4.h +++ b/dnn/cuda-stub/src/libcuda-wrap_11.4.h @@ -4899,6 +4899,7 @@ static void load_library() { return; void* handle = get_library_handle(); + int num = 0; for (size_t i = 0; i < NR_FUNC; ++i) { void* func; if (!handle) { @@ -4907,10 +4908,17 @@ static void load_library() { func = resolve_library_func(handle, g_func_name[i]); } if (!func) { - func = g_func_table_error[i]; + break; } + num++; __atomic_store_n(g_func_table + i, func, __ATOMIC_RELAXED); } + if (num != NR_FUNC) { + for (size_t i = 0; i < NR_FUNC; ++i) { + void* func = g_func_table_error[i]; + __atomic_store_n(g_func_table + i, func, __ATOMIC_RELAXED); + } + } done = true; } diff --git a/dnn/cuda-stub/src/libcuda.cpp b/dnn/cuda-stub/src/libcuda.cpp index b2fd129f..c613ce81 100644 --- a/dnn/cuda-stub/src/libcuda.cpp +++ b/dnn/cuda-stub/src/libcuda.cpp @@ -3,8 +3,8 @@ #pragma GCC visibility push(default) #include -#define LOGI(fmt, v...) fprintf(stdout, "info: " fmt "\n", ##v) -#define LOGD(fmt, v...) fprintf(stdout, "debug: " fmt "\n", ##v) +#define LOGI(fmt, v...) fprintf(stderr, "info: " fmt "\n", ##v) +#define LOGD(fmt, v...) fprintf(stderr, "debug: " fmt "\n", ##v) extern "C" { #include "cuda.h"