Fixing some opencl issues.

This commit is contained in:
Colin LeMahieu 2016-04-06 19:53:53 -05:00
commit 52ae2d7fd8
4 changed files with 45 additions and 22 deletions

View file

@ -160,6 +160,15 @@ static inline ulong rotr64( const ulong w, const unsigned c )
return ( w >> c ) | ( w << ( 64 - c ) );
}
static void ucharset (void * dest_a, int val, size_t count)
{
uchar * dest = (uchar *)dest_a;
for (size_t i = 0; i < count; ++i)
{
*dest++ = val;
}
}
/* init xors IV with input parameter block */
static inline int blake2b_init_param( blake2b_state *S, const blake2b_param *P )
{
@ -168,7 +177,7 @@ static inline int blake2b_init_param( blake2b_state *S, const blake2b_param *P )
h = ( uchar * )( S->h );
p = ( uchar * )( P );
/* IV XOR ParamBlock */
memset( S, 0, sizeof( blake2b_state ) );
ucharset( S, 0, sizeof( blake2b_state ) );
for( int i = 0; i < BLAKE2B_OUTBYTES; ++i ) h[i] = v[i] ^ p[i];
@ -189,9 +198,9 @@ static inline int blake2b_init( blake2b_state *S, const uchar outlen )
store64( &P->node_offset, 0 );
P->node_depth = 0;
P->inner_length = 0;
memset( P->reserved, 0, sizeof( P->reserved ) );
memset( P->salt, 0, sizeof( P->salt ) );
memset( P->personal, 0, sizeof( P->personal ) );
ucharset( P->reserved, 0, sizeof( P->reserved ) );
ucharset( P->salt, 0, sizeof( P->salt ) );
ucharset( P->personal, 0, sizeof( P->personal ) );
return blake2b_init_param( S, P );
}
@ -307,14 +316,6 @@ static int blake2b_update( blake2b_state *S, const uchar *in, ulong inlen )
return 0;
}
static void ucharset (uchar * dest, int val, size_t count)
{
for (size_t i = 0; i < count; ++i)
{
*dest++ = val;
}
}
/* Is this correct? */
static int blake2b_final( blake2b_state *S, uchar *out, uchar outlen )
{
@ -496,7 +497,7 @@ pool (pool_a)
auto i (environment_a.devices.begin ());
auto selected_platform (i->first);
std::array <cl_device_id, 1> selected_devices;
selected_devices [0] = i->second [1];
selected_devices [0] = i->second [0];
cl_context_properties contextProperties [] =
{
CL_CONTEXT_PLATFORM,
@ -536,17 +537,10 @@ pool (pool_a)
error_a |= program_error != CL_SUCCESS;
if (!error_a)
{
error_a |= clBuildProgram (program, selected_devices.size (), selected_devices.data (), "-D __APPLE__", nullptr, nullptr) != CL_SUCCESS;
auto clBuildProgramError(clBuildProgram(program, selected_devices.size(), selected_devices.data(), "-D __APPLE__", nullptr, nullptr));
error_a |= clBuildProgramError != CL_SUCCESS;
if (!error_a)
{
/*for (auto i (selected_devices.begin ()), n (selected_devices.end ()); i != n; ++i)
{
size_t log_size (0);
clGetProgramBuildInfo (program, *i, CL_PROGRAM_BUILD_LOG, 0, nullptr, &log_size);
std::vector <char> log (log_size);
clGetProgramBuildInfo (program, *i, CL_PROGRAM_BUILD_LOG, log.size (), log.data (), nullptr);
std::cout << log.data () << std::endl;
}*/
cl_int kernel_error (0);
kernel = clCreateKernel (program, "raiblocks_work", &kernel_error);
error_a |= kernel_error != CL_SUCCESS;
@ -566,6 +560,17 @@ pool (pool_a)
}
}
}
else
{
for (auto i (selected_devices.begin ()), n (selected_devices.end ()); i != n; ++i)
{
size_t log_size (0);
clGetProgramBuildInfo (program, *i, CL_PROGRAM_BUILD_LOG, 0, nullptr, &log_size);
std::vector <char> log (log_size);
clGetProgramBuildInfo (program, *i, CL_PROGRAM_BUILD_LOG, log.size (), log.data (), nullptr);
std::cout << log.data () << std::endl;
}
}
}
}
}

View file

@ -33,6 +33,10 @@ done (false)
auto error (false);
rai::opencl_environment environment (error);
opencl.reset (new rai::opencl_work (error, environment, *this));
if (error)
{
opencl.reset();
}
}
}

View file

@ -21,6 +21,7 @@ public:
clCreateBuffer = reinterpret_cast <decltype (clCreateBuffer)> (dlsym(opencl_library, "clCreateBuffer"));
clCreateProgramWithSource = reinterpret_cast <decltype (clCreateProgramWithSource)> (dlsym(opencl_library, "clCreateProgramWithSource"));
clBuildProgram = reinterpret_cast <decltype (clBuildProgram)> (dlsym(opencl_library, "clBuildProgram"));
clGetProgramBuildInfo = reinterpret_cast <decltype (clGetProgramBuildInfo)> (GetProcAddress(opencl_library, "clGetProgramBuildInfo"));
clCreateKernel = reinterpret_cast <decltype (clCreateKernel)> (dlsym(opencl_library, "clCreateKernel"));
clSetKernelArg = reinterpret_cast <decltype (clSetKernelArg)> (dlsym(opencl_library, "clSetKernelArg"));
clReleaseKernel = reinterpret_cast <decltype (clReleaseKernel)> (dlsym(opencl_library, "clReleaseKernel"));
@ -46,6 +47,7 @@ public:
cl_mem (* clCreateBuffer) (cl_context, cl_mem_flags, size_t, void *, cl_int *);
cl_program (* clCreateProgramWithSource) (cl_context, cl_uint, char const **, size_t const *, cl_int *);
cl_int (* clBuildProgram) (cl_program, cl_uint, cl_device_id const *, char const *, void (*)(cl_program, void *), void *);
cl_int(*clGetProgramBuildInfo) (cl_program, cl_device_id, cl_program_build_info, size_t, void *, size_t *);
cl_kernel (* clCreateKernel) (cl_program, char const *, cl_int *);
cl_int (* clSetKernelArg) (cl_kernel, cl_uint, size_t, void const *);
cl_int (* clReleaseKernel) (cl_kernel);
@ -116,6 +118,11 @@ cl_int clBuildProgram (cl_program program, cl_uint num_devices, cl_device_id con
return opencl_initializer::initializer.clBuildProgram (program, num_devices, device_list, options, pfn_notify, user_data);
}
cl_int clGetProgramBuildInfo(cl_program program, cl_device_id device, cl_program_build_info param_name, size_t param_value_size, void * param_value, size_t * param_value_size_ret)
{
return opencl_initializer::initializer.clGetProgramBuildInfo(program, device, param_name, param_value_size, param_value, param_value_size_ret);
}
cl_kernel clCreateKernel (cl_program program, char const * kernel_name, cl_int * errcode_ret)
{
return opencl_initializer::initializer.clCreateKernel (program, kernel_name, errcode_ret);

View file

@ -21,6 +21,7 @@ namespace
clCreateBuffer = reinterpret_cast <decltype (clCreateBuffer)> (GetProcAddress(opencl_library, "clCreateBuffer"));
clCreateProgramWithSource = reinterpret_cast <decltype (clCreateProgramWithSource)> (GetProcAddress(opencl_library, "clCreateProgramWithSource"));
clBuildProgram = reinterpret_cast <decltype (clBuildProgram)> (GetProcAddress(opencl_library, "clBuildProgram"));
clGetProgramBuildInfo = reinterpret_cast <decltype (clGetProgramBuildInfo)> (GetProcAddress(opencl_library, "clGetProgramBuildInfo"));
clCreateKernel = reinterpret_cast <decltype (clCreateKernel)> (GetProcAddress(opencl_library, "clCreateKernel"));
clSetKernelArg = reinterpret_cast <decltype (clSetKernelArg)> (GetProcAddress(opencl_library, "clSetKernelArg"));
clReleaseKernel = reinterpret_cast <decltype (clReleaseKernel)> (GetProcAddress(opencl_library, "clReleaseKernel"));
@ -46,6 +47,7 @@ namespace
cl_mem(*clCreateBuffer) (cl_context, cl_mem_flags, size_t, void *, cl_int *);
cl_program(*clCreateProgramWithSource) (cl_context, cl_uint, char const **, size_t const *, cl_int *);
cl_int(*clBuildProgram) (cl_program, cl_uint, cl_device_id const *, char const *, void(*)(cl_program, void *), void *);
cl_int (*clGetProgramBuildInfo) (cl_program, cl_device_id, cl_program_build_info, size_t, void *, size_t *);
cl_kernel(*clCreateKernel) (cl_program, char const *, cl_int *);
cl_int(*clSetKernelArg) (cl_kernel, cl_uint, size_t, void const *);
cl_int(*clReleaseKernel) (cl_kernel);
@ -119,6 +121,11 @@ cl_int clBuildProgram(cl_program program, cl_uint num_devices, cl_device_id cons
return opencl_initializer::initializer.clBuildProgram(program, num_devices, device_list, options, pfn_notify, user_data);
}
cl_int clGetProgramBuildInfo(cl_program program, cl_device_id device, cl_program_build_info param_name, size_t param_value_size, void * param_value, size_t * param_value_size_ret)
{
return opencl_initializer::initializer.clGetProgramBuildInfo(program, device, param_name, param_value_size, param_value, param_value_size_ret);
}
cl_kernel clCreateKernel(cl_program program, char const * kernel_name, cl_int * errcode_ret)
{
return opencl_initializer::initializer.clCreateKernel(program, kernel_name, errcode_ret);