1.性能事件分析
1.1配置性能分析命令
为了获得一条命令的时序信息,需要分别做以下三步:
在用clCreateCommandQueue函数创建命令队列时,设置CL_QUEUE_PROFILING_ENABLE标志;
将cl_event所要进行性能分析的命令关联起来。如前所述,这可以将事件的指向设为入列命令的函数的最后一个参数。
在执行完后,调用clGetEventProfilingInfo函数来访问cl_event,获取命令的时序信息。
第一步是使能对命令队列的性能分析,让OpenCL记录队列中命令改变状态的时间。第二部是指定cl_event对象,保存特定命令的时序信息,最后一步是从cl_event对象中获取数据。clGetEventProfilingInfo函数的签名:
cl_int clGetEventProfilingInfo(cl_event event,cl_profiling_info param,size_t param_value_size,void*param_value,size_t *param_value_size_ret)
每一种情况下,clGetEventProfilingInfo函数所返回的都是64位数,表示命令状态改变的时间,单位为ns。为了确定命令在队列中的时间,先后设置CL_PROFILING_COMMAND_SUBMIT标识和CL_PROFILING_COMMAND_QUEUED标识,两次调用clGetEventProfilingInfo函数,然后计算时间差即可。类似的,如果想知道命令执行所用的时间,先后设置CL_PROFILING_COMMAND_START和CL_PROFILING_COMMAND_END,两次调用clGetEventProfilingInfo函数,计算时间差即可。
性能分析的时间单位为ns。但并不是所有设备的时间分辨率都可以达到几个ns。所以为了获取设备关于时间分辨率的信息,可以将CL_DEVICE_PROFILING_TIMER_RESOLUTION设为第二个参数,调用clGetDevice函数即可。下面的代码所示的就是整个操作过程:
size_t time_res;
clGetDeviceInfo(device,CL_DEVICE_PROFILING_TIMER_RESOLUTION,
sizeof(time_res),&time_res,NULL);
代码行返回size_t型数