InitializeOpenCL(MagickCLEnv,ExceptionInfo *),
OpenCLThrowMagickException(MagickCLDevice,ExceptionInfo *,
const char *,const char *,const size_t,const ExceptionType,const char *,
- const char *,...);
+ const char *,...),
+ RecordProfileData(MagickCLDevice,cl_kernel,cl_event);
extern MagickPrivate MagickCLCacheInfo
AcquireMagickCLCacheInfo(MagickCLDevice,Quantum *,const MagickSizeType),
extern MagickPrivate void
DumpOpenCLProfileData(),
OpenCLTerminus(),
- RecordProfileData(MagickCLDevice,cl_kernel,cl_event),
ReleaseOpenCLCommandQueue(MagickCLDevice,cl_command_queue),
ReleaseOpenCLDevice(MagickCLDevice),
ReleaseOpenCLKernel(cl_kernel),
"clEnqueueNDRangeKernel failed.","'%s'",".");
return(MagickFalse);
}
- RegisterCacheEvent(input_info->opencl,event);
- if (output_info != (CacheInfo *) NULL)
- RegisterCacheEvent(output_info->opencl,event);
- RecordProfileData(input_info->opencl->device,kernel,event);
+ if (RecordProfileData(input_info->opencl->device,kernel,event) == MagickFalse)
+ {
+ RegisterCacheEvent(input_info->opencl,event);
+ if (output_info != (CacheInfo *) NULL)
+ RegisterCacheEvent(output_info->opencl,event);
+ }
openCL_library->clReleaseEvent(event);
return(MagickTrue);
}
%
*/
-MagickPrivate void RecordProfileData(MagickCLDevice device,
+MagickPrivate MagickBooleanType RecordProfileData(MagickCLDevice device,
cl_kernel kernel,cl_event event)
{
char
length;
if (device->profile_kernels == MagickFalse)
- return;
+ return(MagickFalse);
+ status=openCL_library->clWaitForEvents(1,&event);
+ if (status != CL_SUCCESS)
+ return(MagickFalse);
status=openCL_library->clGetKernelInfo(kernel,CL_KERNEL_FUNCTION_NAME,0,NULL,
&length);
if (status != CL_SUCCESS)
- return;
+ return(MagickTrue);
name=AcquireQuantumMemory(length,sizeof(*name));
+ if (name == (char *) NULL)
+ return(MagickTrue);
+ start=end=elapsed=0;
status=openCL_library->clGetKernelInfo(kernel,CL_KERNEL_FUNCTION_NAME,length,
name,(size_t *) NULL);
- start=end=elapsed=0;
- status|=openCL_library->clWaitForEvents(1,&event);
status|=openCL_library->clGetEventProfilingInfo(event,
CL_PROFILING_COMMAND_START,sizeof(cl_ulong),&start,NULL);
status|=openCL_library->clGetEventProfilingInfo(event,
if (status != CL_SUCCESS)
{
name=DestroyString(name);
- return;
+ return(MagickTrue);
}
start/=1000; // usecs
end/=1000; // usecs
profile_record=(KernelProfileRecord) NULL;
if (device->profile_records != (KernelProfileRecord *) NULL)
{
- while (device->profile_records[i] != ((KernelProfileRecord) NULL))
+ while (device->profile_records[i] != (KernelProfileRecord) NULL)
{
if (LocaleCompare(device->profile_records[i]->kernel_name,name) == 0)
{
i++;
}
}
- if (profile_record == (KernelProfileRecord) NULL)
+ if (profile_record != (KernelProfileRecord) NULL)
+ name=DestroyString(name);
+ else
{
profile_record=AcquireMagickMemory(sizeof(*profile_record));
(void) ResetMagickMemory(profile_record,0,sizeof(*profile_record));
- profile_record->kernel_name=AcquireString(name);
+ profile_record->kernel_name=name;
device->profile_records=ResizeMagickMemory(device->profile_records,(i+2)*
sizeof(*device->profile_records));
device->profile_records[i]=profile_record;
profile_record->total+=elapsed;
profile_record->count+=1;
UnlockSemaphoreInfo(device->lock);
- name=DestroyString(name);
+ return(MagickTrue);
}
/*