2 * Authors.....: Jens Steube <jens.steube@gmail.com>
3 * Gabriele Gristina <matrix@hashcat.net>
8 #include <ext_OpenCL.h>
10 const char *val2cstr_cl (cl_int CL_err
)
12 #define CLERR(a) case a: return #a
16 CLERR (CL_BUILD_PROGRAM_FAILURE
);
17 CLERR (CL_COMPILER_NOT_AVAILABLE
);
18 CLERR (CL_DEVICE_NOT_FOUND
);
19 CLERR (CL_INVALID_ARG_INDEX
);
20 CLERR (CL_INVALID_ARG_SIZE
);
21 CLERR (CL_INVALID_ARG_VALUE
);
22 CLERR (CL_INVALID_BINARY
);
23 CLERR (CL_INVALID_BUFFER_SIZE
);
24 CLERR (CL_INVALID_BUILD_OPTIONS
);
25 CLERR (CL_INVALID_COMMAND_QUEUE
);
26 CLERR (CL_INVALID_CONTEXT
);
27 CLERR (CL_INVALID_DEVICE
);
28 CLERR (CL_INVALID_DEVICE_TYPE
);
29 CLERR (CL_INVALID_EVENT
);
30 CLERR (CL_INVALID_EVENT_WAIT_LIST
);
31 CLERR (CL_INVALID_GLOBAL_OFFSET
);
32 CLERR (CL_INVALID_HOST_PTR
);
33 CLERR (CL_INVALID_KERNEL
);
34 CLERR (CL_INVALID_KERNEL_ARGS
);
35 CLERR (CL_INVALID_KERNEL_DEFINITION
);
36 CLERR (CL_INVALID_KERNEL_NAME
);
37 CLERR (CL_INVALID_MEM_OBJECT
);
38 CLERR (CL_INVALID_OPERATION
);
39 CLERR (CL_INVALID_PLATFORM
);
40 CLERR (CL_INVALID_PROGRAM
);
41 CLERR (CL_INVALID_PROGRAM_EXECUTABLE
);
42 CLERR (CL_INVALID_QUEUE_PROPERTIES
);
43 CLERR (CL_INVALID_SAMPLER
);
44 CLERR (CL_INVALID_VALUE
);
45 CLERR (CL_INVALID_WORK_DIMENSION
);
46 CLERR (CL_INVALID_WORK_GROUP_SIZE
);
47 CLERR (CL_INVALID_WORK_ITEM_SIZE
);
48 CLERR (CL_MISALIGNED_SUB_BUFFER_OFFSET
);
49 CLERR (CL_MAP_FAILURE
);
50 CLERR (CL_MEM_COPY_OVERLAP
);
51 CLERR (CL_MEM_OBJECT_ALLOCATION_FAILURE
);
52 CLERR (CL_OUT_OF_HOST_MEMORY
);
53 CLERR (CL_OUT_OF_RESOURCES
);
56 return "CL_UNKNOWN_ERROR";
59 int ocl_init (OCL_PTR
*ocl
)
63 log_error ("ERROR: OpenCL library pointer is null");
68 memset (ocl
, 0, sizeof (hc_opencl_lib_t
));
71 ocl
->lib
= hc_dlopen ("OpenCL");
73 ocl
->lib
= hc_dlopen ("/System/Library/Frameworks/OpenCL.framework/OpenCL", RTLD_NOW
);
75 ocl
->lib
= hc_dlopen ("libOpenCL.so", RTLD_NOW
);
77 if (ocl
->lib
== NULL
) ocl
->lib
= hc_dlopen ("libOpenCL.so.1", RTLD_NOW
);
83 log_info ("ATTENTION! Can't find OpenCL ICD loader library");
86 log_info ("You're probably missing the \"ocl-icd-libopencl1\" package (Debian/Ubuntu)");
87 log_info (" sudo apt-get install ocl-icd-libopencl1");
90 log_info ("You're probably missing the OpenCL runtime installation");
91 log_info (" AMD users require AMD drivers 14.9 or later (recommended 15.12 or later)");
92 log_info (" Intel users require Intel OpenCL Runtime 14.2 or later (recommended 15.1 or later)");
93 log_info (" NVidia users require NVidia drivers 346.59 or later (recommended 361.x or later)");
100 HC_LOAD_FUNC(ocl
, clBuildProgram
, OCL_CLBUILDPROGRAM
, OpenCL
, 1)
101 HC_LOAD_FUNC(ocl
, clCreateBuffer
, OCL_CLCREATEBUFFER
, OpenCL
, 1)
102 HC_LOAD_FUNC(ocl
, clCreateCommandQueue
, OCL_CLCREATECOMMANDQUEUE
, OpenCL
, 1)
103 HC_LOAD_FUNC(ocl
, clCreateContext
, OCL_CLCREATECONTEXT
, OpenCL
, 1)
104 HC_LOAD_FUNC(ocl
, clCreateKernel
, OCL_CLCREATEKERNEL
, OpenCL
, 1)
105 HC_LOAD_FUNC(ocl
, clCreateProgramWithBinary
, OCL_CLCREATEPROGRAMWITHBINARY
, OpenCL
, 1)
106 HC_LOAD_FUNC(ocl
, clCreateProgramWithSource
, OCL_CLCREATEPROGRAMWITHSOURCE
, OpenCL
, 1)
107 HC_LOAD_FUNC(ocl
, clEnqueueCopyBuffer
, OCL_CLENQUEUECOPYBUFFER
, OpenCL
, 1)
108 HC_LOAD_FUNC(ocl
, clEnqueueMapBuffer
, OCL_CLENQUEUEMAPBUFFER
, OpenCL
, 1)
109 HC_LOAD_FUNC(ocl
, clEnqueueNDRangeKernel
, OCL_CLENQUEUENDRANGEKERNEL
, OpenCL
, 1)
110 HC_LOAD_FUNC(ocl
, clEnqueueReadBuffer
, OCL_CLENQUEUEREADBUFFER
, OpenCL
, 1)
111 HC_LOAD_FUNC(ocl
, clEnqueueUnmapMemObject
, OCL_CLENQUEUEUNMAPMEMOBJECT
, OpenCL
, 1)
112 HC_LOAD_FUNC(ocl
, clEnqueueWriteBuffer
, OCL_CLENQUEUEWRITEBUFFER
, OpenCL
, 1)
113 HC_LOAD_FUNC(ocl
, clFinish
, OCL_CLFINISH
, OpenCL
, 1)
114 HC_LOAD_FUNC(ocl
, clFlush
, OCL_CLFLUSH
, OpenCL
, 1)
115 HC_LOAD_FUNC(ocl
, clGetDeviceIDs
, OCL_CLGETDEVICEIDS
, OpenCL
, 1)
116 HC_LOAD_FUNC(ocl
, clGetDeviceInfo
, OCL_CLGETDEVICEINFO
, OpenCL
, 1)
117 HC_LOAD_FUNC(ocl
, clGetEventInfo
, OCL_CLGETEVENTINFO
, OpenCL
, 1)
118 HC_LOAD_FUNC(ocl
, clGetKernelWorkGroupInfo
, OCL_CLGETKERNELWORKGROUPINFO
, OpenCL
, 1)
119 HC_LOAD_FUNC(ocl
, clGetPlatformIDs
, OCL_CLGETPLATFORMIDS
, OpenCL
, 1)
120 HC_LOAD_FUNC(ocl
, clGetPlatformInfo
, OCL_CLGETPLATFORMINFO
, OpenCL
, 1)
121 HC_LOAD_FUNC(ocl
, clGetProgramBuildInfo
, OCL_CLGETPROGRAMBUILDINFO
, OpenCL
, 1)
122 HC_LOAD_FUNC(ocl
, clGetProgramInfo
, OCL_CLGETPROGRAMINFO
, OpenCL
, 1)
123 HC_LOAD_FUNC(ocl
, clReleaseCommandQueue
, OCL_CLRELEASECOMMANDQUEUE
, OpenCL
, 1)
124 HC_LOAD_FUNC(ocl
, clReleaseContext
, OCL_CLRELEASECONTEXT
, OpenCL
, 1)
125 HC_LOAD_FUNC(ocl
, clReleaseKernel
, OCL_CLRELEASEKERNEL
, OpenCL
, 1)
126 HC_LOAD_FUNC(ocl
, clReleaseMemObject
, OCL_CLRELEASEMEMOBJECT
, OpenCL
, 1)
127 HC_LOAD_FUNC(ocl
, clReleaseProgram
, OCL_CLRELEASEPROGRAM
, OpenCL
, 1)
128 HC_LOAD_FUNC(ocl
, clSetKernelArg
, OCL_CLSETKERNELARG
, OpenCL
, 1)
129 HC_LOAD_FUNC(ocl
, clWaitForEvents
, OCL_CLWAITFOREVENTS
, OpenCL
, 1)
130 HC_LOAD_FUNC(ocl
, clGetEventProfilingInfo
, OCL_CLGETEVENTPROFILINGINFO
, OpenCL
, 1)
131 HC_LOAD_FUNC(ocl
, clReleaseEvent
, OCL_CLRELEASEEVENT
, OpenCL
, 1)
136 void ocl_close (OCL_PTR
*ocl
)
141 hc_dlclose (ocl
->lib
);
147 cl_int
hc_clEnqueueNDRangeKernel (OCL_PTR
*ocl
, cl_command_queue command_queue
, cl_kernel kernel
, cl_uint work_dim
, const size_t *global_work_offset
, const size_t *global_work_size
, const size_t *local_work_size
, cl_uint num_events_in_wait_list
, const cl_event
*event_wait_list
, cl_event
*event
)
149 return ocl
->clEnqueueNDRangeKernel (command_queue
, kernel
, work_dim
, global_work_offset
, global_work_size
, local_work_size
, num_events_in_wait_list
, event_wait_list
, event
);
152 cl_int
hc_clGetEventInfo (OCL_PTR
*ocl
, cl_event event
, cl_event_info param_name
, size_t param_value_size
, void *param_value
, size_t *param_value_size_ret
)
154 return ocl
->clGetEventInfo (event
, param_name
, param_value_size
, param_value
, param_value_size_ret
);
157 cl_int
hc_clFlush (OCL_PTR
*ocl
, cl_command_queue command_queue
)
159 return ocl
->clFlush (command_queue
);
162 cl_int
hc_clFinish (OCL_PTR
*ocl
, cl_command_queue command_queue
)
164 return ocl
->clFinish (command_queue
);
167 cl_int
hc_clSetKernelArg (OCL_PTR
*ocl
, cl_kernel kernel
, cl_uint arg_index
, size_t arg_size
, const void *arg_value
)
169 return ocl
->clSetKernelArg (kernel
, arg_index
, arg_size
, arg_value
);
172 cl_int
hc_clEnqueueWriteBuffer (OCL_PTR
*ocl
, cl_command_queue command_queue
, cl_mem buffer
, cl_bool blocking_write
, size_t offset
, size_t cb
, const void *ptr
, cl_uint num_events_in_wait_list
, const cl_event
*event_wait_list
, cl_event
*event
)
174 return ocl
->clEnqueueWriteBuffer (command_queue
, buffer
, blocking_write
, offset
, cb
, ptr
, num_events_in_wait_list
, event_wait_list
, event
);
177 cl_int
hc_clEnqueueCopyBuffer (OCL_PTR
*ocl
, cl_command_queue command_queue
, cl_mem src_buffer
, cl_mem dst_buffer
, size_t src_offset
, size_t dst_offset
, size_t cb
, cl_uint num_events_in_wait_list
, const cl_event
*event_wait_list
, cl_event
*event
)
179 return ocl
->clEnqueueCopyBuffer (command_queue
, src_buffer
, dst_buffer
, src_offset
, dst_offset
, cb
, num_events_in_wait_list
, event_wait_list
, event
);
182 cl_int
hc_clEnqueueReadBuffer (OCL_PTR
*ocl
, cl_command_queue command_queue
, cl_mem buffer
, cl_bool blocking_read
, size_t offset
, size_t cb
, void *ptr
, cl_uint num_events_in_wait_list
, const cl_event
*event_wait_list
, cl_event
*event
)
184 return ocl
->clEnqueueReadBuffer (command_queue
, buffer
, blocking_read
, offset
, cb
, ptr
, num_events_in_wait_list
, event_wait_list
, event
);
187 cl_int
hc_clGetPlatformIDs (OCL_PTR
*ocl
, cl_uint num_entries
, cl_platform_id
*platforms
, cl_uint
*num_platforms
)
189 return ocl
->clGetPlatformIDs (num_entries
, platforms
, num_platforms
);
192 cl_int
hc_clGetPlatformInfo (OCL_PTR
*ocl
, cl_platform_id platform
, cl_platform_info param_name
, size_t param_value_size
, void *param_value
, size_t *param_value_size_ret
)
194 return ocl
->clGetPlatformInfo (platform
, param_name
, param_value_size
, param_value
, param_value_size_ret
);
197 cl_int
hc_clGetDeviceIDs (OCL_PTR
*ocl
, cl_platform_id platform
, cl_device_type device_type
, cl_uint num_entries
, cl_device_id
*devices
, cl_uint
*num_devices
)
199 return ocl
->clGetDeviceIDs (platform
, device_type
, num_entries
, devices
, num_devices
);
202 cl_int
hc_clGetDeviceInfo (OCL_PTR
*ocl
, cl_device_id device
, cl_device_info param_name
, size_t param_value_size
, void *param_value
, size_t *param_value_size_ret
)
204 return ocl
->clGetDeviceInfo (device
, param_name
, param_value_size
, param_value
, param_value_size_ret
);
207 cl_int
hc_clCreateContext (OCL_PTR
*ocl
, cl_context_properties
*properties
, cl_uint num_devices
, const cl_device_id
*devices
, void (CL_CALLBACK
*pfn_notify
) (const char *, const void *, size_t, void *), void *user_data
, cl_context
*context
)
211 *context
= ocl
->clCreateContext (properties
, num_devices
, devices
, pfn_notify
, user_data
, &CL_err
);
216 cl_int
hc_clCreateCommandQueue (OCL_PTR
*ocl
, cl_context context
, cl_device_id device
, cl_command_queue_properties properties
, cl_command_queue
*command_queue
)
220 *command_queue
= ocl
->clCreateCommandQueue (context
, device
, properties
, &CL_err
);
225 cl_int
hc_clCreateBuffer (OCL_PTR
*ocl
, cl_context context
, cl_mem_flags flags
, size_t size
, void *host_ptr
, cl_mem
*mem
)
229 *mem
= ocl
->clCreateBuffer (context
, flags
, size
, host_ptr
, &CL_err
);
234 cl_int
hc_clCreateProgramWithSource (OCL_PTR
*ocl
, cl_context context
, cl_uint count
, const char **strings
, const size_t *lengths
, cl_program
*program
)
238 *program
= ocl
->clCreateProgramWithSource (context
, count
, strings
, lengths
, &CL_err
);
243 cl_int
hc_clCreateProgramWithBinary (OCL_PTR
*ocl
, cl_context context
, cl_uint num_devices
, const cl_device_id
*device_list
, const size_t *lengths
, const unsigned char **binaries
, cl_int
*binary_status
, cl_program
*program
)
247 *program
= ocl
->clCreateProgramWithBinary (context
, num_devices
, device_list
, lengths
, binaries
, binary_status
, &CL_err
);
252 cl_int
hc_clBuildProgram (OCL_PTR
*ocl
, cl_program program
, cl_uint num_devices
, const cl_device_id
*device_list
, const char *options
, void (CL_CALLBACK
*pfn_notify
) (cl_program program
, void *user_data
), void *user_data
)
254 return ocl
->clBuildProgram (program
, num_devices
, device_list
, options
, pfn_notify
, user_data
);
257 cl_int
hc_clCreateKernel (OCL_PTR
*ocl
, cl_program program
, const char *kernel_name
, cl_kernel
*kernel
)
261 *kernel
= ocl
->clCreateKernel (program
, kernel_name
, &CL_err
);
266 cl_int
hc_clReleaseMemObject (OCL_PTR
*ocl
, cl_mem mem
)
268 return ocl
->clReleaseMemObject (mem
);
271 cl_int
hc_clReleaseKernel (OCL_PTR
*ocl
, cl_kernel kernel
)
273 return ocl
->clReleaseKernel (kernel
);
276 cl_int
hc_clReleaseProgram (OCL_PTR
*ocl
, cl_program program
)
278 return ocl
->clReleaseProgram (program
);
281 cl_int
hc_clReleaseCommandQueue (OCL_PTR
*ocl
, cl_command_queue command_queue
)
283 return ocl
->clReleaseCommandQueue (command_queue
);
286 cl_int
hc_clReleaseContext (OCL_PTR
*ocl
, cl_context context
)
288 return ocl
->clReleaseContext (context
);
291 cl_int
hc_clEnqueueMapBuffer (OCL_PTR
*ocl
, cl_command_queue command_queue
, cl_mem buffer
, cl_bool blocking_read
, cl_map_flags map_flags
, size_t offset
, size_t cb
, cl_uint num_events_in_wait_list
, const cl_event
*event_wait_list
, cl_event
*event
, void **buf
)
295 *buf
= ocl
->clEnqueueMapBuffer (command_queue
, buffer
, blocking_read
, map_flags
, offset
, cb
, num_events_in_wait_list
, event_wait_list
, event
, &CL_err
);
300 cl_int
hc_clEnqueueUnmapMemObject (OCL_PTR
*ocl
, cl_command_queue command_queue
, cl_mem memobj
, void *mapped_ptr
, cl_uint num_events_in_wait_list
, const cl_event
*event_wait_list
, cl_event
*event
)
302 return ocl
->clEnqueueUnmapMemObject (command_queue
, memobj
, mapped_ptr
, num_events_in_wait_list
, event_wait_list
, event
);
305 cl_int
hc_clGetKernelWorkGroupInfo (OCL_PTR
*ocl
, cl_kernel kernel
, cl_device_id device
, cl_kernel_work_group_info param_name
, size_t param_value_size
, void *param_value
, size_t *param_value_size_ret
)
307 return ocl
->clGetKernelWorkGroupInfo (kernel
, device
, param_name
, param_value_size
, param_value
, param_value_size_ret
);
310 cl_int
hc_clGetProgramBuildInfo (OCL_PTR
*ocl
, 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
)
312 return ocl
->clGetProgramBuildInfo (program
, device
, param_name
, param_value_size
, param_value
, param_value_size_ret
);
315 cl_int
hc_clGetProgramInfo (OCL_PTR
*ocl
, cl_program program
, cl_program_info param_name
, size_t param_value_size
, void *param_value
, size_t *param_value_size_ret
)
317 return ocl
->clGetProgramInfo (program
, param_name
, param_value_size
, param_value
, param_value_size_ret
);
320 cl_int
hc_clWaitForEvents (OCL_PTR
*ocl
, cl_uint num_events
, const cl_event
*event_list
)
322 return ocl
->clWaitForEvents (num_events
, event_list
);
325 cl_int
hc_clGetEventProfilingInfo (OCL_PTR
*ocl
, cl_event event
, cl_profiling_info param_name
, size_t param_value_size
, void *param_value
, size_t *param_value_size_ret
)
327 return ocl
->clGetEventProfilingInfo (event
, param_name
, param_value_size
, param_value
, param_value_size_ret
);
330 cl_int
hc_clReleaseEvent (OCL_PTR
*ocl
, cl_event event
)
332 return ocl
->clReleaseEvent (event
);