Skip to content

Commit

Permalink
XMRig-AMD 2.14.3.1
Browse files Browse the repository at this point in the history
  • Loading branch information
IndeedMiners committed Mar 24, 2019
1 parent 943894f commit cb7a08b
Show file tree
Hide file tree
Showing 8 changed files with 211 additions and 210 deletions.
2 changes: 2 additions & 0 deletions src/amd/GpuContext.h
Original file line number Diff line number Diff line change
Expand Up @@ -65,6 +65,7 @@ struct GpuContext
Program(nullptr),
Kernels{ nullptr },
ProgramCryptonightR(nullptr),
HeightCryptonightR(0),
freeMem(0),
globalMem(0),
computeUnits(0),
Expand Down Expand Up @@ -98,6 +99,7 @@ struct GpuContext
cl_program Program;
cl_kernel Kernels[32];
cl_program ProgramCryptonightR;
uint64_t HeightCryptonightR;
size_t freeMem;
size_t globalMem;
cl_uint computeUnits;
Expand Down
49 changes: 31 additions & 18 deletions src/amd/OclCryptonightR_gen.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -225,7 +225,7 @@ static cl_program CryptonightR_build_program(const GpuContext *ctx, xmrig::Varia
return nullptr;
}

LOG_DEBUG("CryptonightR: program for height %" PRIu64 " compiled", height);
LOG_DEBUG("CryptonightR: programs for heights %" PRIu64 " - %" PRIu64 " compiled", height * 10, height * 10 + 9);

{
std::lock_guard<std::mutex> g(CryptonightR_cache_mutex);
Expand All @@ -248,10 +248,15 @@ cl_program CryptonightR_get_program(GpuContext* ctx, xmrig::Variant variant, uin
return nullptr;
}

const char* source_code_template =
std::string source_code =
#include "opencl/wolf-aes.cl"
#include "opencl/cryptonight_r_defines.cl"
;

const char* source_code_template =
#include "opencl/cryptonight_r.cl"
;

const char include_name[] = "XMRIG_INCLUDE_RANDOM_MATH";
const char* offset = strstr(source_code_template, include_name);
if (!offset)
Expand All @@ -260,24 +265,32 @@ cl_program CryptonightR_get_program(GpuContext* ctx, xmrig::Variant variant, uin
return nullptr;
}

V4_Instruction code[256];
int code_size;
switch (variant)
for (int i = 0; i < 10; ++i)
{
case xmrig::VARIANT_WOW:
code_size = v4_random_math_init<xmrig::VARIANT_WOW>(code, height);
break;
case xmrig::VARIANT_4:
code_size = v4_random_math_init<xmrig::VARIANT_4>(code, height);
break;
default:
LOG_ERR("CryptonightR_get_program: invalid variant %d", variant);
return nullptr;
}
V4_Instruction code[256];
int code_size;
switch (variant)
{
case xmrig::VARIANT_WOW:
code_size = v4_random_math_init<xmrig::VARIANT_WOW>(code, height * 10 + i);
break;
case xmrig::VARIANT_4:
code_size = v4_random_math_init<xmrig::VARIANT_4>(code, height * 10 + i);
break;
default:
LOG_ERR("CryptonightR_get_program: invalid variant %d", variant);
return nullptr;
}

std::string source_code(source_code_template, offset);
source_code.append(get_code(code, code_size));
source_code.append(offset + sizeof(include_name) - 1);
std::string s(source_code_template, offset);
s.append(get_code(code, code_size));
s.append(offset + sizeof(include_name) - 1);

const char kernel_name[] = "cn1_cryptonight_r_N";
s[s.find(kernel_name) + sizeof(kernel_name) - 2] = '0' + i;

source_code += s;
}

char options[512] = {};
OclCache::getOptions(xmrig::CRYPTONIGHT, variant, ctx, options, sizeof(options));
Expand Down
2 changes: 1 addition & 1 deletion src/amd/OclCryptonightR_gen.h
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@

enum
{
PRECOMPILATION_DEPTH = 3,
PRECOMPILATION_DEPTH = 1,
};
static_assert((PRECOMPILATION_DEPTH >= 1) && (PRECOMPILATION_DEPTH <= 10), "Invalid precompilation depth");

Expand Down
13 changes: 9 additions & 4 deletions src/amd/OclGPU.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -614,11 +614,13 @@ size_t XMRSetJob(GpuContext *ctx, uint8_t *input, size_t input_len, uint64_t tar
# endif

// Get new kernel
cl_program program = CryptonightR_get_program(ctx, variant, height);
cl_program program = CryptonightR_get_program(ctx, variant, height / 10);

if (program != ctx->ProgramCryptonightR) {
if ((program != ctx->ProgramCryptonightR) || (height != ctx->HeightCryptonightR)) {
cl_int ret;
cl_kernel kernel = OclLib::createKernel(program, "cn1_cryptonight_r", &ret);
char kernel_name[32];
sprintf(kernel_name, "cn1_cryptonight_r_%d", static_cast<int>(height % 10));
cl_kernel kernel = OclLib::createKernel(program, kernel_name, &ret);

if (ret != CL_SUCCESS) {
LOG_ERR("CryptonightR: clCreateKernel returned error %s", OclError::toString(ret));
Expand All @@ -627,12 +629,15 @@ size_t XMRSetJob(GpuContext *ctx, uint8_t *input, size_t input_len, uint64_t tar
OclLib::releaseKernel(ctx->Kernels[cn1_kernel_offset]);
ctx->Kernels[cn1_kernel_offset] = kernel;
}
ctx->HeightCryptonightR = height;
}

if (program != ctx->ProgramCryptonightR) {
ctx->ProgramCryptonightR = program;

// Precompile next program in background
for (size_t i = 1; i <= PRECOMPILATION_DEPTH; ++i) {
CryptonightR_get_program(ctx, variant, height + i, true);
CryptonightR_get_program(ctx, variant, height / 10 + i, true);
}

# ifdef APP_DEBUG
Expand Down
40 changes: 22 additions & 18 deletions src/amd/OclLib.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -49,16 +49,17 @@ static const char *kEnqueueWriteBuffer = "clEnqueueWriteBuffer";
static const char *kFinish = "clFinish";
static const char *kGetDeviceIDs = "clGetDeviceIDs";
static const char *kGetDeviceInfo = "clGetDeviceInfo";
static const char *kGetKernelInfo = "clGetKernelInfo";
static const char *kGetPlatformIDs = "clGetPlatformIDs";
static const char *kGetPlatformInfo = "clGetPlatformInfo";
static const char *kGetProgramBuildInfo = "clGetProgramBuildInfo";
static const char *kGetProgramInfo = "clGetProgramInfo";
static const char *kSetKernelArg = "clSetKernelArg";
static const char *kReleaseMemObject = "clReleaseMemObject";
static const char *kReleaseProgram = "clReleaseProgram";
static const char *kReleaseKernel = "clReleaseKernel";
static const char *kReleaseCommandQueue = "clReleaseCommandQueue";
static const char *kReleaseContext = "clReleaseContext";
static const char *kReleaseKernel = "clReleaseKernel";
static const char *kReleaseMemObject = "clReleaseMemObject";
static const char *kReleaseProgram = "clReleaseProgram";
static const char *kSetKernelArg = "clSetKernelArg";

#if defined(CL_VERSION_2_0)
typedef cl_command_queue (CL_API_CALL *createCommandQueueWithProperties_t)(cl_context, cl_device_id, const cl_queue_properties *, cl_int *);
Expand All @@ -73,49 +74,51 @@ typedef cl_int (CL_API_CALL *enqueueWriteBuffer_t)(cl_command_queue, cl_mem, cl_
typedef cl_int (CL_API_CALL *finish_t)(cl_command_queue);
typedef cl_int (CL_API_CALL *getDeviceIDs_t)(cl_platform_id, cl_device_type, cl_uint, cl_device_id *, cl_uint *);
typedef cl_int (CL_API_CALL *getDeviceInfo_t)(cl_device_id, cl_device_info, size_t, void *, size_t *);
typedef cl_int (CL_API_CALL *getKernelInfo_t)(cl_kernel, cl_kernel_info, size_t, void *, size_t *);
typedef cl_int (CL_API_CALL *getPlatformIDs_t)(cl_uint, cl_platform_id *, cl_uint *);
typedef cl_int (CL_API_CALL *getPlatformInfo_t)(cl_platform_id, cl_platform_info, size_t, void *, size_t *);
typedef cl_int (CL_API_CALL *getProgramBuildInfo_t)(cl_program, cl_device_id, cl_program_build_info, size_t, void *, size_t *);
typedef cl_int (CL_API_CALL *getProgramInfo_t)(cl_program, cl_program_info, size_t, void *, size_t *);
typedef cl_int (CL_API_CALL *releaseCommandQueue_t)(cl_command_queue);
typedef cl_int (CL_API_CALL *releaseContext_t)(cl_context);
typedef cl_int (CL_API_CALL *releaseKernel_t)(cl_kernel);
typedef cl_int (CL_API_CALL *releaseMemObject_t)(cl_mem);
typedef cl_int (CL_API_CALL *releaseProgram_t)(cl_program);
typedef cl_int (CL_API_CALL *setKernelArg_t)(cl_kernel, cl_uint, size_t, const void *);
typedef cl_kernel (CL_API_CALL *createKernel_t)(cl_program, const char *, cl_int *);
typedef cl_mem (CL_API_CALL *createBuffer_t)(cl_context, cl_mem_flags, size_t, void *, cl_int *);
typedef cl_program (CL_API_CALL *createProgramWithBinary_t)(cl_context, cl_uint, const cl_device_id *, const size_t *, const unsigned char **, cl_int *, cl_int *);
typedef cl_program (CL_API_CALL *createProgramWithSource_t)(cl_context, cl_uint, const char **, const size_t *, cl_int *);
typedef cl_int (CL_API_CALL *releaseMemObject_t)(cl_mem);
typedef cl_int (CL_API_CALL *releaseProgram_t)(cl_program);
typedef cl_int (CL_API_CALL *releaseKernel_t)(cl_kernel);
typedef cl_int (CL_API_CALL *releaseCommandQueue_t)(cl_command_queue);
typedef cl_int (CL_API_CALL *releaseContext_t)(cl_context);


#if defined(CL_VERSION_2_0)
static createCommandQueueWithProperties_t pCreateCommandQueueWithProperties = nullptr;
#endif

static buildProgram_t pBuildProgram = nullptr;
static createBuffer_t pCreateBuffer = nullptr;
static createCommandQueue_t pCreateCommandQueue = nullptr;
static createContext_t pCreateContext = nullptr;
static buildProgram_t pBuildProgram = nullptr;
static createKernel_t pCreateKernel = nullptr;
static createProgramWithBinary_t pCreateProgramWithBinary = nullptr;
static createProgramWithSource_t pCreateProgramWithSource = nullptr;
static enqueueNDRangeKernel_t pEnqueueNDRangeKernel = nullptr;
static enqueueReadBuffer_t pEnqueueReadBuffer = nullptr;
static enqueueWriteBuffer_t pEnqueueWriteBuffer = nullptr;
static finish_t pFinish = nullptr;
static getDeviceIDs_t pGetDeviceIDs = nullptr;
static getDeviceInfo_t pGetDeviceInfo = nullptr;
static getKernelInfo_t pGetKernelInfo = nullptr;
static getPlatformIDs_t pGetPlatformIDs = nullptr;
static getPlatformInfo_t pGetPlatformInfo = nullptr;
static getProgramBuildInfo_t pGetProgramBuildInfo = nullptr;
static getProgramInfo_t pGetProgramInfo = nullptr;
static setKernelArg_t pSetKernelArg = nullptr;
static createKernel_t pCreateKernel = nullptr;
static createBuffer_t pCreateBuffer = nullptr;
static createProgramWithBinary_t pCreateProgramWithBinary = nullptr;
static createProgramWithSource_t pCreateProgramWithSource = nullptr;
static releaseMemObject_t pReleaseMemObject = nullptr;
static releaseProgram_t pReleaseProgram = nullptr;
static releaseKernel_t pReleaseKernel = nullptr;
static releaseCommandQueue_t pReleaseCommandQueue = nullptr;
static releaseContext_t pReleaseContext = nullptr;
static releaseKernel_t pReleaseKernel = nullptr;
static releaseMemObject_t pReleaseMemObject = nullptr;
static releaseProgram_t pReleaseProgram = nullptr;
static setKernelArg_t pSetKernelArg = nullptr;

#define DLSYM(x) if (uv_dlsym(&oclLib, k##x, reinterpret_cast<void**>(&p##x)) == -1) { return false; }

Expand Down Expand Up @@ -156,6 +159,7 @@ bool OclLib::load()
DLSYM(ReleaseKernel);
DLSYM(ReleaseCommandQueue);
DLSYM(ReleaseContext);
DLSYM(GetKernelInfo);

# if defined(CL_VERSION_2_0)
uv_dlsym(&oclLib, kCreateCommandQueueWithProperties, reinterpret_cast<void**>(&pCreateCommandQueueWithProperties));
Expand Down
Loading

0 comments on commit cb7a08b

Please sign in to comment.