mirror of https://github.com/GOSTSec/sgminer
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
72 lines
2.2 KiB
72 lines
2.2 KiB
#include <sys/stat.h> |
|
#include <stdio.h> |
|
|
|
#include "miner.h" |
|
#include "binary_kernel.h" |
|
|
|
cl_program load_opencl_binary_kernel(build_kernel_data *data) |
|
{ |
|
FILE *binaryfile = NULL; |
|
size_t binary_size; |
|
char **binaries = (char **)calloc(MAX_GPUDEVICES * 4, sizeof(char *)); |
|
cl_int status; |
|
cl_program program; |
|
cl_program ret = NULL; |
|
|
|
binaryfile = fopen(data->binary_filename, "rb"); |
|
if (!binaryfile) { |
|
applog(LOG_DEBUG, "No binary found, generating from source"); |
|
goto out; |
|
} else { |
|
struct stat binary_stat; |
|
|
|
if (unlikely(stat(data->binary_filename, &binary_stat))) { |
|
applog(LOG_DEBUG, "Unable to stat binary, generating from source"); |
|
goto out; |
|
} |
|
if (!binary_stat.st_size) |
|
goto out; |
|
|
|
binary_size = binary_stat.st_size; |
|
binaries[0] = (char *)calloc(binary_size, 1); |
|
if (unlikely(!binaries[0])) { |
|
quit(1, "Unable to calloc binaries"); |
|
} |
|
|
|
if (fread(binaries[0], 1, binary_size, binaryfile) != binary_size) { |
|
applog(LOG_ERR, "Unable to fread binary"); |
|
goto out; |
|
} |
|
|
|
program = clCreateProgramWithBinary(data->context, 1, data->device, &binary_size, (const unsigned char **)binaries, &status, NULL); |
|
if (status != CL_SUCCESS) { |
|
applog(LOG_ERR, "Error %d: Loading Binary into cl_program (clCreateProgramWithBinary)", status); |
|
goto out; |
|
} |
|
|
|
applog(LOG_DEBUG, "Loaded binary image %s", data->binary_filename); |
|
|
|
/* create a cl program executable for all the devices specified */ |
|
status = clBuildProgram(program, 1, data->device, NULL, NULL, NULL); |
|
if (status != CL_SUCCESS) { |
|
applog(LOG_ERR, "Error %d: Building Program (clBuildProgram)", status); |
|
size_t log_size; |
|
status = clGetProgramBuildInfo(program, *data->device, CL_PROGRAM_BUILD_LOG, 0, NULL, &log_size); |
|
|
|
char *sz_log = (char *)malloc(log_size + 1); |
|
status = clGetProgramBuildInfo(program, *data->device, CL_PROGRAM_BUILD_LOG, log_size, sz_log, NULL); |
|
sz_log[log_size] = '\0'; |
|
applog(LOG_ERR, "%s", sz_log); |
|
free(sz_log); |
|
clReleaseProgram(program); |
|
goto out; |
|
} |
|
|
|
ret = program; |
|
} |
|
out: |
|
if (binaryfile) fclose(binaryfile); |
|
if (binaries[0]) free(binaries[0]); |
|
if (binaries) free(binaries); |
|
return ret; |
|
}
|
|
|