mirror of
https://github.com/jwinterm/xmr-stak.git
synced 2026-10-26 06:08:32 +01:00
Merge pull request #116 from psychocrypt/topic-checkIfBinarySupportsGPUArch
check gpu architecture
This commit is contained in:
@@ -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);
|
||||
|
||||
@@ -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)
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user