Browse Source

Merge pull request #116 from psychocrypt/topic-checkIfBinarySupportsGPUArch

check gpu architecture
tags/v2.0.0
fireice-uk 6 years ago
committed by GitHub
parent
commit
92dcd340d1
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 53 additions and 1 deletions
  1. +4
    -0
      CMakeLists.txt
  2. +1
    -1
      xmrstak/backend/nvidia/minethd.cpp
  3. +48
    -0
      xmrstak/backend/nvidia/nvcc_code/cuda_extra.cu

+ 4
- 0
CMakeLists.txt View File

@@ -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})


+ 1
- 1
xmrstak/backend/nvidia/minethd.cpp View File

@@ -220,7 +220,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);


+ 48
- 0
xmrstak/backend/nvidia/nvcc_code/cuda_extra.cu View File

@@ -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)
{


Loading…
Cancel
Save