Some const fixes.
(void) OpenCLThrowMagickException(device,exception, GetMagickModule(), ResourceLimitWarning, "clEnv->library->clEnqueueNDRangeKernel failed.", "'%s'", ".");
goto cleanup;
}
- RecordProfileData(device,HistogramKernel,event);
+ RecordProfileData(device,histogramKernel,event);
outputReady = MagickTrue;
goto cleanup;
}
- RecordProfileData(device,AddNoiseKernel,event);
+ RecordProfileData(device,addNoiseKernel,event);
if (copyWriteBuffer(filteredImage,clEnv,device,queue,filteredImageBuffer,filteredPixels,exception) == MagickFalse)
goto cleanup;
(void) OpenCLThrowMagickException(device,exception, GetMagickModule(), ResourceLimitWarning, "clEnv->library->clEnqueueNDRangeKernel failed.", "'%s'", ".");
goto cleanup;
}
- RecordProfileData(device,BlurRowKernel,event);
+ RecordProfileData(device,blurRowKernel,event);
}
}
(void) OpenCLThrowMagickException(device,exception, GetMagickModule(), ResourceLimitWarning, "clEnv->library->clEnqueueNDRangeKernel failed.", "'%s'", ".");
goto cleanup;
}
- RecordProfileData(device,BlurColumnKernel,event);
+ RecordProfileData(device,blurColumnKernel,event);
}
}
clStatus = clEnv->library->clEnqueueNDRangeKernel(queue, compositeKernel, 2, NULL,
global_work_size, local_work_size, 0, NULL, &event);
- RecordProfileData(device,CompositeKernel,event);
+ RecordProfileData(device,compositeKernel,event);
RelinquishOpenCLKernel(compositeKernel);
(void) OpenCLThrowMagickException(device,exception, GetMagickModule(), ResourceLimitWarning, "clEnv->library->clEnqueueNDRangeKernel failed.", "'%s'", ".");
goto cleanup;
}
- RecordProfileData(device,ContrastKernel,event);
+ RecordProfileData(device,filterKernel,event);
if (ALIGNED(inputPixels,CLPixelPacket))
{
(void) OpenCLThrowMagickException(device,exception, GetMagickModule(), ResourceLimitWarning, "clEnv->library->clEnqueueNDRangeKernel failed.", "'%s'", ".");
goto cleanup;
}
- RecordProfileData(device,ContrastStretchKernel,event);
+ RecordProfileData(device,stretchKernel,event);
/* read the data back */
if (ALIGNED(inputPixels,CLPixelPacket))
(void) OpenCLThrowMagickException(device,exception, GetMagickModule(), ResourceLimitWarning, "clEnv->library->clEnqueueNDRangeKernel failed.", "'%s'", ".");
goto cleanup;
}
- RecordProfileData(device,ConvolveOptimizedKernel,event);
+ RecordProfileData(device,clkernel,event);
}
else
{
goto cleanup;
}
}
- RecordProfileData(device,ConvolveKernel,event);
+ RecordProfileData(device,clkernel,event);
if (ALIGNED(filteredPixels,CLPixelPacket))
{
(void) OpenCLThrowMagickException(device,exception, GetMagickModule(), ResourceLimitWarning, "clEnv->library->clEnqueueNDRangeKernel failed.", "'%s'", ".");
goto cleanup;
}
- RecordProfileData(device,HullPass1Kernel,event);
+ RecordProfileData(device,hullPass1,event);
/* launch the kernel */
clStatus = clEnv->library->clEnqueueNDRangeKernel(queue, hullPass2, 2, NULL, global_work_size, NULL, 0, NULL, &event);
(void) OpenCLThrowMagickException(device,exception, GetMagickModule(), ResourceLimitWarning, "clEnv->library->clEnqueueNDRangeKernel failed.", "'%s'", ".");
goto cleanup;
}
- RecordProfileData(device,HullPass2Kernel,event);
+ RecordProfileData(device,hullPass2,event);
if (k == 0)
clStatus =clEnv->library->clSetKernelArg(hullPass1,0,sizeof(cl_mem),(void *)(tempImageBuffer));
(void) OpenCLThrowMagickException(device,exception, GetMagickModule(), ResourceLimitWarning, "clEnv->library->clEnqueueNDRangeKernel failed.", "'%s'", ".");
goto cleanup;
}
- RecordProfileData(device,HullPass1Kernel,event);
+ RecordProfileData(device,hullPass1,event);
/* launch the kernel */
clStatus = clEnv->library->clEnqueueNDRangeKernel(queue, hullPass2, 2, NULL, global_work_size, NULL, 0, NULL, &event);
(void) OpenCLThrowMagickException(device,exception, GetMagickModule(), ResourceLimitWarning, "clEnv->library->clEnqueueNDRangeKernel failed.", "'%s'", ".");
goto cleanup;
}
- RecordProfileData(device,HullPass2Kernel,event);
+ RecordProfileData(device,hullPass2,event);
offset.s[0] = -X[k];
offset.s[1] = -Y[k];
(void) OpenCLThrowMagickException(device,exception, GetMagickModule(), ResourceLimitWarning, "clEnv->library->clEnqueueNDRangeKernel failed.", "'%s'", ".");
goto cleanup;
}
- RecordProfileData(device,HullPass1Kernel,event);
+ RecordProfileData(device,hullPass1,event);
/* launch the kernel */
clStatus = clEnv->library->clEnqueueNDRangeKernel(queue, hullPass2, 2, NULL, global_work_size, NULL, 0, NULL, &event);
(void) OpenCLThrowMagickException(device,exception, GetMagickModule(), ResourceLimitWarning, "clEnv->library->clEnqueueNDRangeKernel failed.", "'%s'", ".");
goto cleanup;
}
- RecordProfileData(device,HullPass2Kernel,event);
+ RecordProfileData(device,hullPass2,event);
offset.s[0] = X[k];
offset.s[1] = Y[k];
(void) OpenCLThrowMagickException(device,exception, GetMagickModule(), ResourceLimitWarning, "clEnv->library->clEnqueueNDRangeKernel failed.", "'%s'", ".");
goto cleanup;
}
- RecordProfileData(device,HullPass1Kernel,event);
+ RecordProfileData(device,hullPass1,event);
/* launch the kernel */
clStatus = clEnv->library->clEnqueueNDRangeKernel(queue, hullPass2, 2, NULL, global_work_size, NULL, 0, NULL, &event);
(void) OpenCLThrowMagickException(device,exception, GetMagickModule(), ResourceLimitWarning, "clEnv->library->clEnqueueNDRangeKernel failed.", "'%s'", ".");
goto cleanup;
}
- RecordProfileData(device,HullPass2Kernel,event);
+ RecordProfileData(device,hullPass2,event);
}
if (ALIGNED(filteredPixels,CLPixelPacket))
(void) OpenCLThrowMagickException(device,exception, GetMagickModule(), ResourceLimitWarning, "clEnv->library->clEnqueueNDRangeKernel failed.", "'%s'", ".");
goto cleanup;
}
- RecordProfileData(device,EqualizeKernel,event);
+ RecordProfileData(device,equalizeKernel,event);
/* read the data back */
if (ALIGNED(inputPixels,CLPixelPacket))
(void) OpenCLThrowMagickException(device,exception, GetMagickModule(), ResourceLimitWarning, "clEnv->library->clEnqueueNDRangeKernel failed.", "'%s'", ".");
goto cleanup;
}
- RecordProfileData(device,ComputeFunctionKernel,event);
+ RecordProfileData(device,clkernel,event);
if (copyWriteBuffer(image,clEnv,device,queue,imageBuffer,pixels,exception) == MagickFalse)
goto cleanup;
(void) OpenCLThrowMagickException(device,exception, GetMagickModule(), ResourceLimitWarning, "clEnv->library->clEnqueueNDRangeKernel failed.", "'%s'", ".");
goto cleanup;
}
- RecordProfileData(device,GrayScaleKernel,event);
+ RecordProfileData(device,grayscaleKernel,event);
}
if (copyWriteBuffer(image,clEnv,device,queue,imageBuffer,inputPixels,exception) == MagickFalse)
(void) OpenCLThrowMagickException(device,exception, GetMagickModule(), ResourceLimitWarning, "clEnv->library->clEnqueueNDRangeKernel failed.", "'%s'", ".");
goto cleanup;
}
- RecordProfileData(device,LocalContrastBlurRowKernel,event);
+ RecordProfileData(device,blurRowKernel,event);
}
}
(void) OpenCLThrowMagickException(device,exception, GetMagickModule(), ResourceLimitWarning, "clEnv->library->clEnqueueNDRangeKernel failed.", "'%s'", ".");
goto cleanup;
}
- RecordProfileData(device,LocalContrastBlurApplyColumnKernel,event);
+ RecordProfileData(device,blurColumnKernel,event);
}
}
}
(void) OpenCLThrowMagickException(device,exception, GetMagickModule(), ResourceLimitWarning, "clEnv->library->clEnqueueNDRangeKernel failed.", "'%s'", ".");
goto cleanup;
}
- RecordProfileData(device,ModulateKernel,event);
+ RecordProfileData(device,modulateKernel,event);
}
if (ALIGNED(inputPixels,CLPixelPacket))
"clEnv->library->clEnqueueNDRangeKernel failed.", "'%s'", ".");
goto cleanup;
}
- RecordProfileData(device,MotionBlurKernel,event);
+ RecordProfileData(device,motionBlurKernel,event);
if (ALIGNED(filteredPixels,CLPixelPacket))
{
(void) OpenCLThrowMagickException(device,exception, GetMagickModule(), ResourceLimitWarning, "clEnv->library->clEnqueueNDRangeKernel failed.", "'%s'", ".");
goto cleanup;
}
- RecordProfileData(device,ResizeHorizontalKernel,event);
+ RecordProfileData(device,horizontalKernel,event);
status = MagickTrue;
(void) OpenCLThrowMagickException(device,exception, GetMagickModule(), ResourceLimitWarning, "clEnv->library->clEnqueueNDRangeKernel failed.", "'%s'", ".");
goto cleanup;
}
- RecordProfileData(device,ResizeVerticalKernel,event);
+ RecordProfileData(device,verticalKernel,event);
status = MagickTrue;
(void) OpenCLThrowMagickException(device,exception, GetMagickModule(), ResourceLimitWarning, "clEnv->library->clEnqueueNDRangeKernel failed.", "'%s'", ".");
goto cleanup;
}
- RecordProfileData(device,RotationalBlurKernel,event);
+ RecordProfileData(device,rotationalBlurKernel,event);
if (copyWriteBuffer(filteredImage,clEnv,device,queue,filteredImageBuffer,filteredPixels,exception) == MagickFalse)
{
(void) OpenCLThrowMagickException(device,exception, GetMagickModule(), ResourceLimitWarning, "clEnv->library->clEnqueueNDRangeKernel failed.", "'%s'", ".");
goto cleanup;
}
- RecordProfileData(device,BlurRowKernel,event);
+ RecordProfileData(device,blurRowKernel,event);
}
(void) OpenCLThrowMagickException(device,exception, GetMagickModule(), ResourceLimitWarning, "clEnv->library->clEnqueueNDRangeKernel failed.", "'%s'", ".");
goto cleanup;
}
- RecordProfileData(device,UnsharpMaskBlurColumnKernel,event);
+ RecordProfileData(device,unsharpMaskBlurColumnKernel,event);
}
}
(void) OpenCLThrowMagickException(device,exception, GetMagickModule(), ResourceLimitWarning, "clEnv->library->clEnqueueNDRangeKernel failed.", "'%s'", ".");
goto cleanup;
}
- RecordProfileData(device,UnsharpMaskKernel,event);
+ RecordProfileData(device,unsharpMaskKernel,event);
}
}
goto cleanup;
}
}
- RecordProfileData(device,WaveletDenoiseKernel,event);
+ RecordProfileData(device,denoiseKernel,event);
}
if (copyWriteBuffer(filteredImage,clEnv,device,queue,filteredImageBuffer,filteredPixels,exception) == MagickFalse)
extern "C" {
#endif
-typedef enum
-{
- AddNoiseKernel,
- BlurColumnKernel,
- BlurRowKernel,
- CompositeKernel,
- ContrastKernel,
- ContrastStretchKernel,
- ConvolveKernel,
- ConvolveOptimizedKernel,
- ComputeFunctionKernel,
- EqualizeKernel,
- GrayScaleKernel,
- HistogramKernel,
- HullPass1Kernel,
- HullPass2Kernel,
- LocalContrastBlurApplyColumnKernel,
- LocalContrastBlurRowKernel,
- ModulateKernel,
- MotionBlurKernel,
- ResizeHorizontalKernel,
- ResizeVerticalKernel,
- RotationalBlurKernel,
- UnsharpMaskKernel,
- UnsharpMaskBlurColumnKernel,
- WaveletDenoiseKernel,
- KERNEL_COUNT
-} ProfiledKernels;
-
#if !defined(MAGICKCORE_OPENCL_SUPPORT)
typedef void* cl_context;
typedef void* cl_command_queue;
Define declarations.
*/
#define MAGICKCORE_OPENCL_UNDEFINED_SCORE -1.0
-#define MAGICKCORE_OPENCL_PROFILE_KERNELS 0
#define MAGICKCORE_OPENCL_COMMAND_QUEUES 16
-#if MAGICKCORE_OPENCL_PROFILE_KERNELS
-typedef struct
-{
- cl_ulong min;
- cl_ulong max;
- cl_ulong total;
- cl_ulong count;
-} KernelProfileRecord;
-#endif
-
/* Platform APIs */
typedef CL_API_ENTRY cl_int
(CL_API_CALL *MAGICKpfn_clGetPlatformIDs)(cl_uint num_entries,
(CL_API_CALL *MAGICKpfn_clSetKernelArg)(cl_kernel kernel,cl_uint arg_index,
size_t arg_size,const void * arg_value) CL_API_SUFFIX__VERSION_1_0;
+typedef CL_API_ENTRY cl_int
+ (CL_API_CALL *MAGICKpfn_clGetKernelInfo)(cl_kernel kernel,
+ cl_kernel_info param_name,size_t param_value_size,void *param_value,
+ size_t *param_value_size_ret) CL_API_SUFFIX__VERSION_1_0;
+
/* Enqueued Commands APIs */
typedef CL_API_ENTRY cl_int
MAGICKpfn_clCreateKernel clCreateKernel;
MAGICKpfn_clReleaseKernel clReleaseKernel;
MAGICKpfn_clSetKernelArg clSetKernelArg;
+ MAGICKpfn_clGetKernelInfo clGetKernelInfo;
MAGICKpfn_clEnqueueReadBuffer clEnqueueReadBuffer;
MAGICKpfn_clEnqueueMapBuffer clEnqueueMapBuffer;
double
score;
+ KernelProfileRecord
+ *profile_records;
+
MagickBooleanType
- enabled;
+ enabled,
+ profile_kernels;
SemaphoreInfo
*lock;
ssize_t
command_queues_index,
created_queues;
-
-#if MAGICKCORE_OPENCL_PROFILE_KERNELS
- KernelProfileRecord
- profileRecords[KERNEL_COUNT];
-#endif
};
struct _MagickCLEnv
extern MagickPrivate void
DumpOpenCLProfileData(),
OpenCLTerminus(),
- RecordProfileData(MagickCLDevice,ProfiledKernels,cl_event),
+ RecordProfileData(MagickCLDevice,cl_kernel,cl_event),
RelinquishOpenCLCommandQueue(MagickCLDevice,cl_command_queue),
RelinquishOpenCLKernel(cl_kernel);
{
UnlockSemaphoreInfo(device->lock);
properties=(cl_command_queue_properties) NULL;
-#if MAGICKCORE_OPENCL_PROFILE_KERNELS
- properties=CL_QUEUE_PROFILING_ENABLE;
-#endif
+ if (device->profile_kernels != MagickFalse)
+ properties=CL_QUEUE_PROFILING_ENABLE;
queue=openCL_library->clCreateCommandQueue(device->context,
device->deviceID,properties,NULL);
}
MagickPrivate void DumpOpenCLProfileData()
{
-#if MAGICKCORE_OPENCL_PROFILE_KERNELS
#define OpenCLLog(message) \
fwrite(message,sizeof(char),strlen(message),log); \
fwrite("\n",sizeof(char),1,log);
clEnv=GetCurrentOpenCLEnv();
+ for (i = 0; i < clEnv->number_devices; i++)
+ if (clEnv->devices[i]->profile_kernels != MagickFalse)
+ break;
+ if (i == clEnv->number_devices)
+ return;
+
(void) FormatLocaleString(filename,MagickPathExtent,"%s%s%s",
GetOpenCLCacheDirectory(),DirectorySeparator,"ImageMagickOpenCL.log");
device;
device=clEnv->devices[i];
+ if ((device->profile_kernels == MagickFalse) ||
+ (device->profile_records == (KernelProfileRecord *) NULL))
+ continue;
+
OpenCLLog("====================================================");
fprintf(log,"Device: %s\n",device->name);
fprintf(log,"Version: %s\n",device->version);
OpenCLLog("====================================================");
OpenCLLog(" average calls min max");
OpenCLLog(" ------- ----- --- ---");
- for (j = 0; j < KERNEL_COUNT; j++)
+ j=0;
+ while (device->profile_records[j] != (KernelProfileRecord) NULL)
{
KernelProfileRecord
profile;
- profile=device->profileRecords[j];
- if (profile.count == 0)
- continue;
+ profile=device->profile_records[j];
strcpy(indent," ");
strncpy(indent,kernelNames[j],min(strlen(kernelNames[j]),
strlen(indent)-1));
- sprintf(buf,"%s %7d %7d %7d %7d",indent,(int) (profile.total/
- profile.count),(int) profile.count,(int) profile.min,
- (int) profile.max);
+ sprintf(buf,"%s %7d %7d %7d %7d",indent,(int) (profile->total/
+ profile->count),(int) profile->count,(int) profile->min,
+ (int) profile->max);
OpenCLLog(buf);
+ j++;
}
OpenCLLog("====================================================");
fwrite("\n\n",sizeof(char),2,log);
}
fclose(log);
-#endif
}
/*
%
% The format of the GetOpenCLDevices method is:
%
-% MagickBooleanType GetOpenCLDevices()
+% const MagickCLDevice *GetOpenCLDevices(size_t *length,
+% ExceptionInfo *exception)
%
% A description of each parameter follows:
%
-% o device: the OpenCL device.
+% o length: the number of device.
+%
+% o exception: return any errors or warnings in this structure.
+%
*/
-MagickExport const MagickCLDevice *GetOpenCLDevices(size_t *length)
+MagickExport MagickCLDevice *GetOpenCLDevices(size_t *length,
+ ExceptionInfo *exception)
{
MagickCLEnv
clEnv;
clEnv=GetCurrentOpenCLEnv();
if (clEnv == (MagickCLEnv) NULL)
- {
- if (length != (size_t *) NULL)
- *length=0;
- return((MagickCLDevice *) NULL);
- }
+ {
+ if (length != (size_t *) NULL)
+ *length=0;
+ return((MagickCLDevice *) NULL);
+ }
+ InitializeOpenCL(clEnv,exception);
if (length != (size_t *) NULL)
*length=clEnv->number_devices;
return(clEnv->devices);
%
% The format of the GetOpenCLDeviceName method is:
%
-% MagickBooleanType GetOpenCLDeviceVersion(MagickCLDevice device)
+% const char *GetOpenCLDeviceVersion(MagickCLDevice device)
%
% A description of each parameter follows:
%
return(clEnv->enabled);
}
+/*
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% %
+% %
+% %
+% G e t O p e n C L K e r n e l P r o f i l e R e c o r d s %
+% %
+% %
+% %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% GetOpenCLKernelProfileRecords() returns the profile records for the
+% specified device and sets length to the number of profile records.
+%
+% The format of the GetOpenCLKernelProfileRecords method is:
+%
+% const KernelProfileRecord *GetOpenCLKernelProfileRecords(size *length)
+%
+% A description of each parameter follows:
+%
+% o length: the number of profiles records.
+*/
+
+MagickExport const KernelProfileRecord *GetOpenCLKernelProfileRecords(
+ const MagickCLDevice device,size_t *length)
+{
+ if ((device == (const MagickCLDevice) NULL) || (device->profile_records ==
+ (KernelProfileRecord *) NULL))
+ {
+ if (length != (size_t *) NULL)
+ *length=0;
+ return((const KernelProfileRecord *) NULL);
+ }
+ if (length != (size_t *) NULL)
+ {
+ length=0;
+ while (device->profile_records[*length] != (KernelProfileRecord) NULL)
+ *length=*length+1;
+ }
+ return(device->profile_records);
+}
+
/*
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% %
BIND(clCreateKernel);
BIND(clReleaseKernel);
BIND(clSetKernelArg);
+ BIND(clGetKernelInfo);
BIND(clEnqueueReadBuffer);
BIND(clEnqueueMapBuffer);
%
% o device: the OpenCL device that did the operation.
%
-% o kernel: the kernel that was executed.
-%
% o event: the event that contains the profiling data.
%
*/
MagickPrivate void RecordProfileData(MagickCLDevice device,
- ProfiledKernels kernel,cl_event event)
+ cl_kernel kernel,cl_event event)
{
-#if MAGICKCORE_OPENCL_PROFILE_KERNELS
+ char
+ *name;
+
cl_int
status;
end,
start;
+ KernelProfileRecord
+ profile_record;
+
+ size_t
+ i,
+ length;
+
+ if (device->profile_kernels == MagickFalse)
+ {
+ openCL_library->clReleaseEvent(event);
+ return;
+ }
+ status=openCL_library->clGetKernelInfo(kernel,CL_KERNEL_FUNCTION_NAME,0,NULL,
+ &length);
+ if (status != CL_SUCCESS)
+ {
+ openCL_library->clReleaseEvent(event);
+ return;
+ }
+ name=AcquireQuantumMemory(length,sizeof(*name));
+ (void) openCL_library->clGetKernelInfo(kernel,CL_KERNEL_FUNCTION_NAME,length,
+ name,NULL);
start=end=elapsed=0;
openCL_library->clWaitForEvents(1,&event);
status=openCL_library->clGetEventProfilingInfo(event,
CL_PROFILING_COMMAND_START,sizeof(cl_ulong),&start,NULL);
status&=openCL_library->clGetEventProfilingInfo(event,
CL_PROFILING_COMMAND_END,sizeof(cl_ulong),&end,NULL);
+ openCL_library->clReleaseEvent(event);
if (status != CL_SUCCESS)
- return;
+ {
+ name=DestroyString(name);
+ return;
+ }
start/=1000; // usecs
end/=1000; // usecs
elapsed=end-start;
LockSemaphoreInfo(device->lock);
- if ((elapsed < device->profileRecords[kernel].min) ||
- (device->profileRecords[kernel].count == 0))
- device->profileRecords[kernel].min=elapsed;
- if (elapsed > device->profileRecords[kernel].max)
- device->profileRecords[kernel].max = elapsed;
- device->profileRecords[kernel].total += elapsed;
- device->profileRecords[kernel].count += 1;
+ i=0;
+ profile_record=(KernelProfileRecord) NULL;
+ if (device->profile_records != (KernelProfileRecord *) NULL)
+ {
+ while (device->profile_records[i] != ((KernelProfileRecord) NULL))
+ {
+ if (LocaleCompare(device->profile_records[i]->kernel_name,name))
+ {
+ profile_record=device->profile_records[i];
+ break;
+ }
+ i++;
+ }
+ }
+ if (profile_record == ((KernelProfileRecord) NULL))
+ {
+ profile_record=AcquireMagickMemory(sizeof(*profile_record));
+ (void) ResetMagickMemory(profile_record,0,sizeof(*profile_record));
+ profile_record->kernel_name=AcquireString(name);
+ device->profile_records=ResizeMagickMemory(device->profile_records,i+2);
+ device->profile_records[i]=profile_record;
+ device->profile_records[i+1]=(KernelProfileRecord) NULL;
+ }
+ if ((elapsed < profile_record->min) || (profile_record->count == 0))
+ profile_record->min=elapsed;
+ if (elapsed > profile_record->max)
+ profile_record->max=elapsed;
+ profile_record->total+=elapsed;
+ profile_record->count+=1;
UnlockSemaphoreInfo(device->lock);
-#else
- magick_unreferenced(device);
- magick_unreferenced(kernel);
-#endif
- openCL_library->clReleaseEvent(event);
+ name=DestroyString(name);
}
/*
%
% The format of the SetOpenCLDeviceEnabled method is:
%
-% void SetOpenCLDeviceEnabled(const MagickCLDevice device,
+% void SetOpenCLDeviceEnabled(MagickCLDevice device,
% MagickBooleanType value)
%
% A description of each parameter follows:
% o value: determines if the device should be enabled or disabled.
*/
-MagickExport void SetOpenCLDeviceEnabled(const MagickCLDevice device,
+MagickExport void SetOpenCLDeviceEnabled(MagickCLDevice device,
const MagickBooleanType value)
{
if (device == (MagickCLDevice) NULL)
device->enabled=value;
}
+/*
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% %
+% %
+% %
+% S e t O p e n C L K e r n e l P r o f i l e E n a b l e d %
+% %
+% %
+% %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% SetOpenCLKernelProfileEnabled() can be used to enable or disabled the
+% kernel profiling of a device.
+%
+% The format of the SetOpenCLKernelProfileEnabled method is:
+%
+% void SetOpenCLKernelProfileEnabled(MagickCLDevice device,
+% MagickBooleanType value)
+%
+% A description of each parameter follows:
+%
+% o device: the OpenCL device.
+%
+% o value: determines if kernel profiling for the device should be enabled
+% or disabled.
+*/
+
+MagickExport void SetOpenCLKernelProfileEnabled(MagickCLDevice device,
+ const MagickBooleanType value)
+{
+ if (device == (MagickCLDevice) NULL)
+ return;
+ device->profile_kernels=value;
+}
+
/*
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% %
return((const char *) NULL);
}
-MagickExport const MagickCLDevice *GetOpenCLDevices(size_t *length)
+MagickExport MagickCLDevice *GetOpenCLDevices(size_t *length,
+ ExceptionInfo *magick_unused(exception))
{
+ magick_unreferenced(exception);
if (length != (size_t *) NULL)
*length=0;
return((MagickCLDevice *) NULL);
return(UndefinedCLDeviceType);
}
+MagickExport const KernelProfileRecord *GetOpenCLKernelProfileRecords(
+ size_t *length)
+{
+ if (length != (size_t *) NULL)
+ *length=0;
+ return((MagickCLDevice *) NULL);
+}
+
MagickExport const char *GetOpenCLDeviceVersion(
const MagickCLDevice magick_unused(device))
{
}
MagickExport void SetOpenCLDeviceEnabled(
- const MagickCLDevice magick_unused(device),
+ MagickCLDevice magick_unused(device),
const MagickBooleanType magick_unused(value))
{
magick_unreferenced(device);
return(MagickFalse);
}
+MagickExport SetOpenCLKernelProfileEnabled(
+ MagickCLDevice magick_unused(device),
+ const MagickBooleanType magick_unused(value))
+{
+ magick_unreferenced(device);
+ magick_unreferenced(value);
+}
#endif
\ No newline at end of file
GpuCLDeviceType
} MagickCLDeviceType;
+struct _KernelProfileRecord
+{
+ char
+ *kernel_name;
+
+ unsigned long
+ count,
+ max,
+ min,
+ total;
+};
+
+typedef struct _KernelProfileRecord* KernelProfileRecord;
typedef struct _MagickCLDevice* MagickCLDevice;
typedef struct _MagickCLEnv* MagickCLEnv;
*GetOpenCLDeviceName(const MagickCLDevice),
*GetOpenCLDeviceVersion(const MagickCLDevice);
-extern MagickExport const MagickCLDevice
- *GetOpenCLDevices(size_t *);
+extern MagickExport const KernelProfileRecord
+ *GetOpenCLKernelProfilesRecords(const MagickCLDevice,size_t *);
extern MagickExport double
GetOpenCLDeviceBenchmarkScore(const MagickCLDevice);
+extern MagickExport MagickCLDevice
+ *GetOpenCLDevices(size_t *,ExceptionInfo *);
+
extern MagickExport MagickCLDeviceType
GetOpenCLDeviceType(const MagickCLDevice);
SetOpenCLEnabled(const MagickBooleanType);
extern MagickExport void
- SetOpenCLDeviceEnabled(const MagickCLDevice,
+ SetOpenCLDeviceEnabled(MagickCLDevice,
+ const MagickBooleanType),
+ SetOpenCLKernelProfileEnabled(MagickCLDevice,
const MagickBooleanType);
-
#if defined(__cplusplus) || defined(c_plusplus)
}
#endif