From 70737c8d1a909c6d08f6e38e069566ae8af64917 Mon Sep 17 00:00:00 2001 From: psychocrypt Date: Tue, 14 Nov 2017 22:13:24 +0100 Subject: [PATCH] check gpu architecture - check if the gpu architecture is supported by the compiled miner binary - remove not supported gpus from the auto suggestion - disallow the selection of a not supported gpu by hand tuning the config --- CMakeLists.txt | 4 ++ xmrstak/backend/nvidia/minethd.cpp | 2 +- .../backend/nvidia/nvcc_code/cuda_extra.cu | 48 +++++++++++++++++++ 3 files changed, 53 insertions(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 6e0f282..09c7cec 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -109,6 +109,10 @@ if(CUDA_ENABLE) endif() set(CUDA_ARCH "${DEFAULT_CUDA_ARCH}" CACHE STRING "Set GPU architecture (semicolon separated list, e.g. '-DCUDA_ARCH=20;35;60')") + # generate comma separated list with architectures + string(REPLACE ";" "+" STR_CUDA_ARCH "${CUDA_ARCH}") + add_definitions("-DXMRSTAK_CUDA_ARCH_LIST=${STR_CUDA_ARCH}") + # validate architectures (only numbers are allowed) foreach(CUDA_ARCH_ELEM ${CUDA_ARCH}) string(REGEX MATCH "^[0-9]+$" IS_NUMBER ${CUDA_ARCH}) diff --git a/xmrstak/backend/nvidia/minethd.cpp b/xmrstak/backend/nvidia/minethd.cpp index a1cafa7..a4c0e7a 100644 --- a/xmrstak/backend/nvidia/minethd.cpp +++ b/xmrstak/backend/nvidia/minethd.cpp @@ -216,7 +216,7 @@ void minethd::work_main() globalStates::inst().iConsumeCnt++; - if(/*cuda_get_deviceinfo(&ctx) != 1 ||*/ cryptonight_extra_cpu_init(&ctx) != 1) + if(cuda_get_deviceinfo(&ctx) != 0 || cryptonight_extra_cpu_init(&ctx) != 1) { printer::inst()->print_msg(L0, "Setup failed for GPU %d. Exitting.\n", (int)iThreadNo); std::exit(0); diff --git a/xmrstak/backend/nvidia/nvcc_code/cuda_extra.cu b/xmrstak/backend/nvidia/nvcc_code/cuda_extra.cu index 61d45ed..9923cb2 100644 --- a/xmrstak/backend/nvidia/nvcc_code/cuda_extra.cu +++ b/xmrstak/backend/nvidia/nvcc_code/cuda_extra.cu @@ -1,6 +1,9 @@ #include #include #include +#include +#include +#include #include #include #include @@ -277,6 +280,7 @@ extern "C" int cuda_get_devicecount( int* deviceCount) * 2 = gpu cannot be selected, * 3 = context cannot be created * 4 = not enough memory + * 5 = architecture not supported (not compiled for the gpu architecture) */ extern "C" int cuda_get_deviceinfo(nvid_ctx* ctx) { @@ -321,8 +325,52 @@ extern "C" int cuda_get_deviceinfo(nvid_ctx* ctx) ctx->device_arch[0] = props.major; ctx->device_arch[1] = props.minor; + const int gpuArch = ctx->device_arch[0] * 10 + ctx->device_arch[1]; + ctx->name = std::string(props.name); + std::vector arch; +#define XMRSTAK_PP_TOSTRING1(str) #str +#define XMRSTAK_PP_TOSTRING(str) XMRSTAK_PP_TOSTRING1(str) + char const * archStringList = XMRSTAK_PP_TOSTRING(XMRSTAK_CUDA_ARCH_LIST); +#undef XMRSTAK_PP_TOSTRING +#undef XMRSTAK_PP_TOSTRING1 + std::stringstream ss(archStringList); + + //transform string list sperated with `+` into a vector of integers + int tmpArch; + while ( ss >> tmpArch ) + arch.push_back( tmpArch ); + + if(gpuArch >= 20 && gpuArch < 30) + { + // compiled binary must support sm_20 for fermi + std::vector::iterator it = std::find(arch.begin(), arch.end(), 20); + if(it == arch.end()) + { + printf("WARNING: NVIDIA GPU %d: miner not compiled for the gpu architecture %d.\n", ctx->device_id, gpuArch); + return 5; + } + } + if(gpuArch >= 30) + { + // search the minimum architecture greater than sm_20 + int minSupportedArch = 0; + /* - for newer architecture than fermi we need at least sm_30 + * or a architecture >= gpuArch + * - it is not possible to use a gpu with a architecture >= 30 + * with a sm_20 only compiled binary + */ + for(int i = 0; i < arch.size(); ++i) + if(minSupportedArch == 0 || (arch[i] >= 30 && arch[i] < minSupportedArch)) + minSupportedArch = arch[i]; + if(minSupportedArch >= 30 && gpuArch <= minSupportedArch) + { + printf("WARNING: NVIDIA GPU %d: miner not compiled for the gpu architecture %d.\n", ctx->device_id, gpuArch); + return 5; + } + } + // set all evice option those marked as auto (-1) to a valid value if(ctx->device_blocks == -1) {