summaryrefslogtreecommitdiffstats
path: root/xmrstak/backend/nvidia/nvcc_code
diff options
context:
space:
mode:
authorpsychocrypt <psychocrypt@users.noreply.github.com>2017-11-14 22:13:24 +0100
committerpsychocrypt <psychocrypt@users.noreply.github.com>2017-11-15 16:29:41 +0100
commit70737c8d1a909c6d08f6e38e069566ae8af64917 (patch)
tree50df29d60399e7843a69d343fddc1efc00e11d87 /xmrstak/backend/nvidia/nvcc_code
parent0659458523671d53e4eddd940ade8ac9f72b1bbe (diff)
downloadxmr-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.cu48
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)
{
OpenPOWER on IntegriCloud