Skip to content
Snippets Groups Projects
Unverified Commit 92dcd340 authored by fireice-uk's avatar fireice-uk Committed by GitHub
Browse files

Merge pull request #116 from psychocrypt/topic-checkIfBinarySupportsGPUArch

check gpu architecture 
parents 6d6c1853 70737c8d
No related branches found
No related tags found
No related merge requests found
......@@ -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})
......
......@@ -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);
......
#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)
{
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment