OpenCL 分析中的定时器分辨率
Timer resolution in OpenCL profiling
我需要一些关于计时器分辨率的说明。我正在尝试学习 openCL 中的分析。我在 OpenCL 中实现了缩减算法,并希望通过获取下面给出的代码中的总运行时间来测量执行内核时间。我 运行 这段代码在不同的设备上运行,结果如下:
开启 CPU -- AMD FX 770K
总时间 = 352,855,601
CL_DEVICE_PROFILING_TIMER_RESOLUTION = 69 纳秒
在 GPU 上——AMD Radeon R7 240
总时间 = 172,297
CL_DEVICE_PROFILING_TIMER_RESOLUTION = 1 纳秒
在另一个 GPU 上 -- GeForce GT 610
总时间 = 1,725,504
CL_DEVICE_PROFILING_TIMER_RESOLUTION = 1000 纳秒
上面给出的"Total time"是实际的纳秒吗?或者我需要将它们除以时间分辨率以获得实际执行时间?计时器分辨率如何帮助我们?
这是部分代码:
/* Enqueue kernel */
err = clEnqueueNDRangeKernel(queue, kernel[i], 1, NULL, &global_size,
&local_size, 0, NULL, &prof_event);
if (err < 0) {
perror("Couldn't enqueue the kernel");
exit(1);
}
/* Finish processing the queue and get profiling information */
clFinish(queue);
clGetEventProfilingInfo(prof_event, CL_PROFILING_COMMAND_START,
sizeof(time_start), &time_start, NULL);
clGetEventProfilingInfo(prof_event, CL_PROFILING_COMMAND_END,
sizeof(time_end), &time_end, NULL);
total_time = time_end - time_start;
printf("Total time = %lu\n\n", total_time);
规范对此非常清楚:“当前设备时间计数器在
纳秒
时间总是以纳秒为单位。分辨率查询是为了让您了解数据的准确程度。例如,根据您发布的测量值和分辨率,您可以推断出测量值的误差范围:
AMD FX 770K:
- 测量值:352,855,601 ± 69 ns
- 实际:352,855,532 - 352,855,670
AMD Radeon R7 240:
- 测量值:172,297 ± 1 ns
- 实际:172,296 - 172,298
GeForce GT 610:
- 测量值:1,725,504 ± 1000 纳秒
- 实际:1,724,504 - 1,726,504
我需要一些关于计时器分辨率的说明。我正在尝试学习 openCL 中的分析。我在 OpenCL 中实现了缩减算法,并希望通过获取下面给出的代码中的总运行时间来测量执行内核时间。我 运行 这段代码在不同的设备上运行,结果如下:
开启 CPU -- AMD FX 770K 总时间 = 352,855,601 CL_DEVICE_PROFILING_TIMER_RESOLUTION = 69 纳秒
在 GPU 上——AMD Radeon R7 240 总时间 = 172,297 CL_DEVICE_PROFILING_TIMER_RESOLUTION = 1 纳秒
在另一个 GPU 上 -- GeForce GT 610 总时间 = 1,725,504 CL_DEVICE_PROFILING_TIMER_RESOLUTION = 1000 纳秒
上面给出的"Total time"是实际的纳秒吗?或者我需要将它们除以时间分辨率以获得实际执行时间?计时器分辨率如何帮助我们?
这是部分代码:
/* Enqueue kernel */
err = clEnqueueNDRangeKernel(queue, kernel[i], 1, NULL, &global_size,
&local_size, 0, NULL, &prof_event);
if (err < 0) {
perror("Couldn't enqueue the kernel");
exit(1);
}
/* Finish processing the queue and get profiling information */
clFinish(queue);
clGetEventProfilingInfo(prof_event, CL_PROFILING_COMMAND_START,
sizeof(time_start), &time_start, NULL);
clGetEventProfilingInfo(prof_event, CL_PROFILING_COMMAND_END,
sizeof(time_end), &time_end, NULL);
total_time = time_end - time_start;
printf("Total time = %lu\n\n", total_time);
规范对此非常清楚:“当前设备时间计数器在 纳秒
时间总是以纳秒为单位。分辨率查询是为了让您了解数据的准确程度。例如,根据您发布的测量值和分辨率,您可以推断出测量值的误差范围:
AMD FX 770K:
- 测量值:352,855,601 ± 69 ns
- 实际:352,855,532 - 352,855,670
AMD Radeon R7 240:
- 测量值:172,297 ± 1 ns
- 实际:172,296 - 172,298
GeForce GT 610:
- 测量值:1,725,504 ± 1000 纳秒
- 实际:1,724,504 - 1,726,504