opencl-private.h

Go to the documentation of this file.
00001 /*
00002 Copyright 1999-2020 ImageMagick Studio LLC, a non-profit organization
00003 dedicated to making software imaging solutions freely available.
00004 
00005 You may not use this file except in compliance with the License.  You may
00006 obtain a copy of the License at
00007 
00008 https://imagemagick.org/script/license.php
00009 
00010 Unless required by applicable law or agreed to in writing, software
00011 distributed under the License is distributed on an "AS IS" BASIS,
00012 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
00013 See the License for the specific language governing permissions and
00014 limitations under the License.
00015 
00016 MagickCore OpenCL private methods.
00017 */
00018 #ifndef MAGICKCORE_OPENCL_PRIVATE_H
00019 #define MAGICKCORE_OPENCL_PRIVATE_H
00020 
00021 /*
00022 Include declarations.
00023 */
00024 #include "magick/studio.h"
00025 #include "magick/opencl.h"
00026 
00027 #if defined(__cplusplus) || defined(c_plusplus)
00028 extern "C" {
00029 #endif
00030 
00031 #if !defined(MAGICKCORE_OPENCL_SUPPORT)
00032   typedef void* cl_event;
00033   typedef void* cl_mem;
00034   typedef void* cl_uint;
00035 #else
00036 
00037 #define MAX_COMMAND_QUEUES 16
00038 
00039 /*
00040  *
00041  * function pointer typedefs
00042  *
00043  */
00044 
00045 /* Platform APIs */
00046 typedef CL_API_ENTRY cl_int (CL_API_CALL *MAGICKpfn_clGetPlatformIDs)(
00047                  cl_uint          num_entries,
00048                  cl_platform_id * platforms,
00049                  cl_uint *        num_platforms) CL_API_SUFFIX__VERSION_1_0;
00050 
00051 typedef CL_API_ENTRY cl_int (CL_API_CALL *MAGICKpfn_clGetPlatformInfo)(
00052     cl_platform_id   platform, 
00053     cl_platform_info param_name,
00054     size_t           param_value_size, 
00055     void *           param_value,
00056     size_t *         param_value_size_ret) CL_API_SUFFIX__VERSION_1_0;
00057 
00058 /* Device APIs */
00059 typedef CL_API_ENTRY cl_int (CL_API_CALL *MAGICKpfn_clGetDeviceIDs)(
00060     cl_platform_id   platform,
00061     cl_device_type   device_type, 
00062     cl_uint          num_entries, 
00063     cl_device_id *   devices, 
00064     cl_uint *        num_devices) CL_API_SUFFIX__VERSION_1_0;
00065 
00066 typedef CL_API_ENTRY cl_int (CL_API_CALL *MAGICKpfn_clGetDeviceInfo)(
00067     cl_device_id    device,
00068     cl_device_info  param_name, 
00069     size_t          param_value_size, 
00070     void *          param_value,
00071     size_t *        param_value_size_ret) CL_API_SUFFIX__VERSION_1_0;
00072 
00073 /* Context APIs */
00074 typedef CL_API_ENTRY cl_context (CL_API_CALL *MAGICKpfn_clCreateContext)(
00075     const cl_context_properties * properties,
00076     cl_uint                 num_devices,
00077     const cl_device_id *    devices,
00078     void (CL_CALLBACK *pfn_notify)(const char *, const void *, size_t, void *),
00079     void *                  user_data,
00080     cl_int *                errcode_ret) CL_API_SUFFIX__VERSION_1_0;
00081 
00082 typedef CL_API_ENTRY cl_int (CL_API_CALL *MAGICKpfn_clReleaseContext)(
00083     cl_context context) CL_API_SUFFIX__VERSION_1_0;
00084 
00085 /* Command Queue APIs */
00086 typedef CL_API_ENTRY cl_command_queue (CL_API_CALL *MAGICKpfn_clCreateCommandQueue)(
00087     cl_context                     context, 
00088     cl_device_id                   device, 
00089     cl_command_queue_properties    properties,
00090     cl_int *                       errcode_ret) CL_API_SUFFIX__VERSION_1_0;
00091 
00092 typedef CL_API_ENTRY cl_int (CL_API_CALL *MAGICKpfn_clReleaseCommandQueue)(
00093     cl_command_queue command_queue) CL_API_SUFFIX__VERSION_1_0;
00094 
00095 /* Memory Object APIs */
00096 typedef CL_API_ENTRY cl_mem (CL_API_CALL *MAGICKpfn_clCreateBuffer)(
00097     cl_context   context,
00098     cl_mem_flags flags,
00099     size_t       size,
00100     void *       host_ptr,
00101     cl_int *     errcode_ret) CL_API_SUFFIX__VERSION_1_0;
00102 
00103 typedef CL_API_ENTRY cl_int
00104   (CL_API_CALL *MAGICKpfn_clRetainMemObject)(cl_mem memobj)
00105     CL_API_SUFFIX__VERSION_1_0;
00106 
00107 typedef CL_API_ENTRY cl_int
00108   (CL_API_CALL *MAGICKpfn_clReleaseMemObject)(cl_mem memobj)
00109     CL_API_SUFFIX__VERSION_1_0;
00110 
00111 /* Program Object APIs */
00112 typedef CL_API_ENTRY cl_program (CL_API_CALL *MAGICKpfn_clCreateProgramWithSource)(
00113     cl_context        context,
00114     cl_uint           count,
00115     const char **     strings,
00116     const size_t *    lengths,
00117     cl_int *          errcode_ret) CL_API_SUFFIX__VERSION_1_0;
00118 
00119 typedef CL_API_ENTRY cl_program (CL_API_CALL *MAGICKpfn_clCreateProgramWithBinary)(
00120     cl_context                     context,
00121     cl_uint                        num_devices,
00122     const cl_device_id *           device_list,
00123     const size_t *                 lengths,
00124     const unsigned char **         binaries,
00125     cl_int *                       binary_status,
00126     cl_int *                       errcode_ret) CL_API_SUFFIX__VERSION_1_0;
00127 
00128 typedef CL_API_ENTRY cl_int (CL_API_CALL *MAGICKpfn_clReleaseProgram)(cl_program program) CL_API_SUFFIX__VERSION_1_0;
00129 
00130 typedef CL_API_ENTRY cl_int (CL_API_CALL *MAGICKpfn_clBuildProgram)(
00131     cl_program           program,
00132     cl_uint              num_devices,
00133     const cl_device_id * device_list,
00134     const char *         options, 
00135     void (CL_CALLBACK *pfn_notify)(cl_program program, void * user_data),
00136     void *               user_data) CL_API_SUFFIX__VERSION_1_0;
00137 
00138 typedef CL_API_ENTRY cl_int (CL_API_CALL *MAGICKpfn_clGetProgramInfo)(
00139     cl_program         program,
00140     cl_program_info    param_name,
00141     size_t             param_value_size,
00142     void *             param_value,
00143     size_t *           param_value_size_ret) CL_API_SUFFIX__VERSION_1_0;
00144 
00145 typedef CL_API_ENTRY cl_int (CL_API_CALL *MAGICKpfn_clGetProgramBuildInfo)(
00146     cl_program            program,
00147     cl_device_id          device,
00148     cl_program_build_info param_name,
00149     size_t                param_value_size,
00150     void *                param_value,
00151     size_t *              param_value_size_ret) CL_API_SUFFIX__VERSION_1_0;
00152                             
00153 /* Kernel Object APIs */
00154 typedef CL_API_ENTRY cl_kernel (CL_API_CALL *MAGICKpfn_clCreateKernel)(
00155     cl_program      program,
00156     const char *    kernel_name,
00157     cl_int *        errcode_ret) CL_API_SUFFIX__VERSION_1_0;
00158 
00159 typedef CL_API_ENTRY cl_int (CL_API_CALL *MAGICKpfn_clReleaseKernel)(cl_kernel   kernel) CL_API_SUFFIX__VERSION_1_0;
00160 
00161 typedef CL_API_ENTRY cl_int (CL_API_CALL *MAGICKpfn_clSetKernelArg)(
00162     cl_kernel    kernel,
00163     cl_uint      arg_index,
00164     size_t       arg_size,
00165     const void * arg_value) CL_API_SUFFIX__VERSION_1_0;
00166 
00167 typedef CL_API_ENTRY cl_int
00168   (CL_API_CALL *MAGICKpfn_clFlush)(cl_command_queue command_queue)
00169     CL_API_SUFFIX__VERSION_1_0;
00170 
00171 typedef CL_API_ENTRY cl_int (CL_API_CALL *MAGICKpfn_clFinish)(cl_command_queue command_queue) CL_API_SUFFIX__VERSION_1_0;
00172 
00173 /* Enqueued Commands APIs */
00174 typedef CL_API_ENTRY cl_int (CL_API_CALL *MAGICKpfn_clEnqueueReadBuffer)(
00175     cl_command_queue    command_queue,
00176     cl_mem              buffer,
00177     cl_bool             blocking_read,
00178     size_t              offset,
00179     size_t              cb, 
00180     void *              ptr,
00181     cl_uint             num_events_in_wait_list,
00182     const cl_event *    event_wait_list,
00183     cl_event *          event) CL_API_SUFFIX__VERSION_1_0;
00184 
00185 typedef CL_API_ENTRY void * (CL_API_CALL *MAGICKpfn_clEnqueueMapBuffer)(
00186     cl_command_queue command_queue,
00187     cl_mem           buffer,
00188     cl_bool          blocking_map, 
00189     cl_map_flags     map_flags,
00190     size_t           offset,
00191     size_t           cb,
00192     cl_uint          num_events_in_wait_list,
00193     const cl_event * event_wait_list,
00194     cl_event *       event,
00195     cl_int *         errcode_ret) CL_API_SUFFIX__VERSION_1_0;
00196 
00197 typedef CL_API_ENTRY cl_int (CL_API_CALL *MAGICKpfn_clEnqueueUnmapMemObject)(
00198     cl_command_queue command_queue,
00199     cl_mem           memobj,
00200     void *           mapped_ptr,
00201     cl_uint          num_events_in_wait_list,
00202     const cl_event *  event_wait_list,
00203     cl_event *        event) CL_API_SUFFIX__VERSION_1_0;
00204 
00205 typedef CL_API_ENTRY cl_int (CL_API_CALL *MAGICKpfn_clEnqueueNDRangeKernel)(
00206     cl_command_queue command_queue,
00207     cl_kernel        kernel,
00208     cl_uint          work_dim,
00209     const size_t *   global_work_offset,
00210     const size_t *   global_work_size,
00211     const size_t *   local_work_size,
00212     cl_uint          num_events_in_wait_list,
00213     const cl_event * event_wait_list,
00214     cl_event *       event) CL_API_SUFFIX__VERSION_1_0;
00215 
00216 typedef CL_API_ENTRY cl_int(CL_API_CALL *MAGICKpfn_clGetEventProfilingInfo)(
00217     cl_event event,
00218     cl_profiling_info param_name,
00219     size_t param_value_size,
00220     void *param_value,
00221     size_t *param_value_size_ret) CL_API_SUFFIX__VERSION_1_0;
00222 
00223 typedef CL_API_ENTRY cl_int
00224   (CL_API_CALL *MAGICKpfn_clGetEventInfo)(cl_event event,
00225     cl_profiling_info param_name,size_t param_value_size,void *param_value,
00226     size_t *param_value_size_ret) CL_API_SUFFIX__VERSION_1_0;
00227 
00228 typedef CL_API_ENTRY cl_int(CL_API_CALL *MAGICKpfn_clWaitForEvents)(
00229     cl_uint num_events,
00230     const cl_event *event_list) CL_API_SUFFIX__VERSION_1_0;
00231 
00232 typedef CL_API_ENTRY cl_int(CL_API_CALL *MAGICKpfn_clReleaseEvent)(
00233     cl_event event) CL_API_SUFFIX__VERSION_1_0;
00234 
00235 typedef CL_API_ENTRY cl_int(CL_API_CALL *MAGICKpfn_clRetainEvent)(
00236     cl_event event) CL_API_SUFFIX__VERSION_1_0;
00237 
00238 typedef CL_API_ENTRY cl_int(CL_API_CALL *MAGICKpfn_clSetEventCallback)(
00239     cl_event event,cl_int command_exec_callback_type,
00240     void (CL_CALLBACK *MAGICKpfn_notify)(cl_event,cl_int,void *),
00241     void *user_data) CL_API_SUFFIX__VERSION_1_1;
00242 
00243 /*
00244  *
00245  * vendor dispatch table structure
00246  *
00247  * note that the types in the structure KHRicdVendorDispatch mirror the function 
00248  * names listed in the string table khrIcdVendorDispatchFunctionNames
00249  *
00250  */
00251 
00252 typedef struct MagickLibraryRec MagickLibrary;
00253 
00254 struct MagickLibraryRec
00255 {
00256   void * base;
00257 
00258   MAGICKpfn_clGetPlatformIDs          clGetPlatformIDs;
00259   MAGICKpfn_clGetPlatformInfo         clGetPlatformInfo;
00260 
00261   MAGICKpfn_clGetDeviceIDs            clGetDeviceIDs;
00262   MAGICKpfn_clGetDeviceInfo           clGetDeviceInfo;
00263 
00264   MAGICKpfn_clCreateContext           clCreateContext;
00265   MAGICKpfn_clReleaseContext          clReleaseContext;
00266 
00267   MAGICKpfn_clCreateCommandQueue      clCreateCommandQueue;
00268   MAGICKpfn_clReleaseCommandQueue     clReleaseCommandQueue;
00269   MAGICKpfn_clFlush                   clFlush;
00270   MAGICKpfn_clFinish                  clFinish;
00271 
00272   MAGICKpfn_clCreateBuffer            clCreateBuffer;
00273   MAGICKpfn_clRetainMemObject         clRetainMemObject;
00274   MAGICKpfn_clReleaseMemObject        clReleaseMemObject;
00275   MAGICKpfn_clCreateProgramWithSource clCreateProgramWithSource;
00276   MAGICKpfn_clCreateProgramWithBinary clCreateProgramWithBinary;
00277   MAGICKpfn_clReleaseProgram          clReleaseProgram;
00278   MAGICKpfn_clBuildProgram            clBuildProgram;
00279   MAGICKpfn_clGetProgramInfo          clGetProgramInfo;
00280   MAGICKpfn_clGetProgramBuildInfo     clGetProgramBuildInfo;
00281 
00282   MAGICKpfn_clCreateKernel            clCreateKernel;
00283   MAGICKpfn_clReleaseKernel           clReleaseKernel;
00284   MAGICKpfn_clSetKernelArg            clSetKernelArg;
00285 
00286   MAGICKpfn_clEnqueueReadBuffer       clEnqueueReadBuffer;
00287   MAGICKpfn_clEnqueueMapBuffer        clEnqueueMapBuffer;
00288   MAGICKpfn_clEnqueueUnmapMemObject   clEnqueueUnmapMemObject;
00289   MAGICKpfn_clEnqueueNDRangeKernel    clEnqueueNDRangeKernel;
00290 
00291   MAGICKpfn_clGetEventProfilingInfo   clGetEventProfilingInfo;
00292 
00293   MAGICKpfn_clGetEventInfo            clGetEventInfo;
00294   MAGICKpfn_clWaitForEvents           clWaitForEvents;
00295   MAGICKpfn_clReleaseEvent            clReleaseEvent;
00296   MAGICKpfn_clRetainEvent             clRetainEvent;
00297   MAGICKpfn_clSetEventCallback        clSetEventCallback;
00298 };
00299 
00300 struct _MagickCLEnv {
00301   MagickBooleanType OpenCLInitialized;  /* whether OpenCL environment is initialized. */
00302   MagickBooleanType OpenCLDisabled;     /* whether if OpenCL has been explicitely disabled. */
00303 
00304   MagickLibrary * library;
00305 
00306   /*OpenCL objects */
00307   cl_platform_id platform;
00308   cl_device_type deviceType;
00309   cl_device_id device;
00310   cl_context context;
00311 
00312   MagickBooleanType disableProgramCache; /* disable the OpenCL program cache */
00313   cl_program programs[MAGICK_OPENCL_NUM_PROGRAMS]; /* one program object maps one kernel source file */
00314 
00315   MagickBooleanType regenerateProfile;   /* re-run the microbenchmark in auto device selection mode */ 
00316 
00317   SemaphoreInfo* lock;
00318 
00319   cl_command_queue commandQueues[MAX_COMMAND_QUEUES];
00320   ssize_t commandQueuesPos;
00321   SemaphoreInfo* commandQueuesLock;
00322 };
00323 
00324 
00325 #if defined(MAGICKCORE_HDRI_SUPPORT)
00326 #define CLOptions "-cl-single-precision-constant -cl-mad-enable -DMAGICKCORE_HDRI_SUPPORT=1 "\
00327   "-DCLQuantum=float -DCLSignedQuantum=float -DCLPixelType=float4 -DQuantumRange=%f " \
00328   "-DQuantumScale=%f -DCharQuantumScale=%f -DMagickEpsilon=%f -DMagickPI=%f "\
00329   " -DMaxMap=%u -DMAGICKCORE_QUANTUM_DEPTH=%u"
00330 #define CLPixelPacket  cl_float4
00331 #define CLCharQuantumScale 1.0f
00332 #elif (MAGICKCORE_QUANTUM_DEPTH == 8)
00333 #define CLOptions "-cl-single-precision-constant -cl-mad-enable " \
00334   "-DCLQuantum=uchar -DCLSignedQuantum=char -DCLPixelType=uchar4 -DQuantumRange=%ff " \
00335   "-DQuantumScale=%ff -DCharQuantumScale=%ff -DMagickEpsilon=%ff -DMagickPI=%ff "\
00336   "-DMaxMap=%u -DMAGICKCORE_QUANTUM_DEPTH=%u"
00337 #define CLPixelPacket  cl_uchar4
00338 #define CLCharQuantumScale 1.0f
00339 #elif (MAGICKCORE_QUANTUM_DEPTH == 16)
00340 #define CLOptions "-cl-single-precision-constant -cl-mad-enable " \
00341   "-DCLQuantum=ushort -DCLSignedQuantum=short -DCLPixelType=ushort4 -DQuantumRange=%f "\
00342   "-DQuantumScale=%f -DCharQuantumScale=%f -DMagickEpsilon=%f -DMagickPI=%f "\
00343   "-DMaxMap=%u -DMAGICKCORE_QUANTUM_DEPTH=%u"
00344 #define CLPixelPacket  cl_ushort4
00345 #define CLCharQuantumScale 257.0f
00346 #elif (MAGICKCORE_QUANTUM_DEPTH == 32)
00347 #define CLOptions "-cl-single-precision-constant -cl-mad-enable " \
00348   "-DCLQuantum=uint -DCLSignedQuantum=int -DCLPixelType=uint4 -DQuantumRange=%f "\
00349   "-DQuantumScale=%f -DCharQuantumScale=%f -DMagickEpsilon=%f -DMagickPI=%f "\
00350   "-DMaxMap=%u -DMAGICKCORE_QUANTUM_DEPTH=%u"
00351 #define CLPixelPacket  cl_uint4
00352 #define CLCharQuantumScale 16843009.0f
00353 #elif (MAGICKCORE_QUANTUM_DEPTH == 64)
00354 #define CLOptions "-cl-single-precision-constant -cl-mad-enable " \
00355   "-DCLQuantum=ulong -DCLSignedQuantum=long -DCLPixelType=ulong4 -DQuantumRange=%f "\
00356   "-DQuantumScale=%f -DCharQuantumScale=%f -DMagickEpsilon=%f -DMagickPI=%f "\
00357   "-DMaxMap=%u -DMAGICKCORE_QUANTUM_DEPTH=%u"
00358 #define CLPixelPacket  cl_ulong4
00359 #define CLCharQuantumScale 72340172838076673.0f
00360 #endif
00361 
00362 typedef enum {
00363   AddNoiseKernel,
00364   BlurRowKernel,
00365   BlurColumnKernel,
00366   CompositeKernel,
00367   ComputeFunctionKernel,
00368   ContrastKernel,
00369   ContrastStretchKernel,
00370   ConvolveKernel,
00371   EqualizeKernel,
00372   GrayScaleKernel,
00373   HistogramKernel,
00374   HullPass1Kernel,
00375   HullPass2Kernel,
00376   LocalContrastBlurRowKernel,
00377   LocalContrastBlurApplyColumnKernel,
00378   ModulateKernel,
00379   MotionBlurKernel,
00380   RadialBlurKernel,
00381   RandomNumberGeneratorKernel,
00382   ResizeHorizontalKernel,
00383   ResizeVerticalKernel,
00384   UnsharpMaskBlurColumnKernel,
00385   UnsharpMaskKernel,
00386   WaveletDenoiseKernel,
00387   KERNEL_COUNT
00388 } ProfiledKernels;
00389 
00390 extern MagickPrivate cl_context
00391   GetOpenCLContext(MagickCLEnv);
00392 
00393 extern MagickPrivate cl_kernel
00394   AcquireOpenCLKernel(MagickCLEnv, MagickOpenCLProgram, const char*);
00395 
00396 extern MagickPrivate cl_command_queue
00397   AcquireOpenCLCommandQueue(MagickCLEnv);
00398 
00399 extern MagickPrivate MagickBooleanType
00400   OpenCLThrowMagickException(ExceptionInfo *,
00401     const char *,const char *,const size_t,
00402     const ExceptionType,const char *,const char *,...),
00403   RecordProfileData(MagickCLEnv,ProfiledKernels,cl_event),
00404   RelinquishMagickOpenCLEnv(MagickCLEnv),
00405   RelinquishOpenCLCommandQueue(MagickCLEnv, cl_command_queue),
00406   RelinquishOpenCLKernel(MagickCLEnv, cl_kernel);
00407 
00408 extern MagickPrivate MagickCLEnv
00409   AcquireMagickOpenCLEnv(),
00410   SetDefaultOpenCLEnv(MagickCLEnv);
00411 
00412 extern MagickPrivate unsigned long
00413   GetOpenCLDeviceLocalMemorySize(MagickCLEnv),
00414   GetOpenCLDeviceMaxMemAllocSize(MagickCLEnv);
00415 
00416 extern MagickPrivate const char*
00417   GetOpenCLCachedFilesDirectory();
00418 
00419 extern MagickPrivate void
00420   OpenCLLog(const char*),
00421   OpenCLTerminus();
00422 
00423 /* #define OPENCLLOG_ENABLED 1 */
00424 static inline void OpenCLLogException(const char* function, 
00425                         const unsigned int line, 
00426                         ExceptionInfo* exception) {
00427 #ifdef OPENCLLOG_ENABLED
00428   if (exception->severity!=0) {
00429     char message[MaxTextExtent];
00430     /*  dump the source into a file */
00431     (void) FormatLocaleString(message,MaxTextExtent,"%s:%d Exception(%d):%s "
00432         ,function,line,exception->severity,exception->reason);
00433     OpenCLLog(message);
00434   }
00435 #else
00436   magick_unreferenced(function);
00437   magick_unreferenced(line);
00438   magick_unreferenced(exception);
00439 #endif
00440 }
00441 #endif
00442 
00443 #if defined(__cplusplus) || defined(c_plusplus)
00444 }
00445 #endif
00446 
00447 #endif

Generated on 30 Nov 2020 for MagickCore by  doxygen 1.6.1