提供OpenCL应用程序(尤其是计算内核)性能的最合适方法是什么? 我已经实现了一些算法,我正在考虑提供加速和效率图表,但根据定义,我需要知道我在计算中使用了多少处理器。如果是OpenCL,则无法完成。
答案 0 :(得分:3)
使用CL_QUEUE_PROFILING_ENABLE标志设置创建命令队列,然后使用clGetEventProfilingInfo提取计时数据。有关详细信息,请参阅“OpenCL编程指南”的第9章。
答案 1 :(得分:1)
我认为vocaro的建议是最适合CL的,因为它利用语言/运行时的功能来做你想要的。但是,如果由于某种原因在您的平台上不适合您,那么如果您只对给定CL操作的挂钟执行时间感兴趣,还有另一种解决方案。
您可以使用clFinish()包装操作,并使用系统的最高分辨率计时器来获取已用时间。像这样的东西,以Mac OS X为例:
uint64_t start, end;
clFinish(command_queue);
start = mach_absolute_time();
clEnqueueNDRangeKernel(command_queue, /* etc. */ );
clFinish(command_queue);
end = mach_absolute_time();
您可以使用Apple QA1398中的信息将此绝对时间转换为纳秒。请注意,此方法不如使用事件分析那样准确,因为它包含clEnqueuNDRangeKernel和clFinish的开销。
完成调用可确保所有挂起的CL命令都已提交给计算设备和已完成。
答案 2 :(得分:1)
nVidia的最佳实践指南有一章专门讨论性能测量。简而言之,它归结为:你可以使用外部计时器(由@James提出),或者使用GPU概要机制(由@vocaro提出)。后者应该提供更好的精度,但为了简单起见,我个人坚持使用CPU计时器。
根据定义我需要知道我在计算中使用了多少个处理器
对于多CPU并行化,当使用的处理器数量由用户直接控制时,情况就是如此。 GPU不是这种情况:您可以使用GPU,但无法控制设备内部的调度。所以通常(实际上,在我见过的所有CPU-vs-GPU图表上)都有“SpeedUp(问题维度)”(用于“营销”演示)或“SpeedUp(内核选项)”(更多“技术人员”)演示;内核选项可能是网格参数或某些代码特性)或“SpeedUp(使用的GPU数量)”(当您的程序支持多GPU时,当然)。
答案 3 :(得分:0)
我认为有些GPU没有硬件设备来精确测量时间;所以这意味着您可能需要返回CPU。但我可能错了。