diff options
author | psychocrypt <psychocrypt@users.noreply.github.com> | 2017-11-14 22:13:24 +0100 |
---|---|---|
committer | psychocrypt <psychocrypt@users.noreply.github.com> | 2017-11-15 16:29:41 +0100 |
commit | 70737c8d1a909c6d08f6e38e069566ae8af64917 (patch) | |
tree | 50df29d60399e7843a69d343fddc1efc00e11d87 /xmrstak/backend/nvidia/nvcc_code | |
parent | 0659458523671d53e4eddd940ade8ac9f72b1bbe (diff) | |
download | xmr-stak-70737c8d1a909c6d08f6e38e069566ae8af64917.zip xmr-stak-70737c8d1a909c6d08f6e38e069566ae8af64917.tar.gz |
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
Diffstat (limited to 'xmrstak/backend/nvidia/nvcc_code')
-rw-r--r-- | xmrstak/backend/nvidia/nvcc_code/cuda_extra.cu | 48 |
1 files changed, 48 insertions, 0 deletions
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 <stdio.h> #include <stdint.h> #include <string.h> +#include <sstream> +#include <algorithm> +#include <vector> #include <cuda.h> #include <cuda_runtime.h> #include <device_functions.hpp> @@ -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<int> 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<int>::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) { |