【发布时间】:2011-12-20 06:34:27
【问题描述】:
展示 OpenCL 应用程序(尤其是计算内核)性能的最合适方法是什么? 我已经实现了一些算法,我正在考虑展示加速和效率图表,但根据定义,我需要知道我在计算中使用了多少个处理器。如果是 OpenCL,则无法完成。
【问题讨论】:
标签: performance opencl
展示 OpenCL 应用程序(尤其是计算内核)性能的最合适方法是什么? 我已经实现了一些算法,我正在考虑展示加速和效率图表,但根据定义,我需要知道我在计算中使用了多少个处理器。如果是 OpenCL,则无法完成。
【问题讨论】:
标签: performance opencl
nVidia 的最佳实践指南有一整章专门介绍性能测量。很快就归结为:您可以使用外部计时器(@James 提出),也可以使用 GPU 分析机制(@vocaro 提出)。后者应该提供更好的精度,但为了简单起见,我个人坚持使用 CPU 计时器。
根据定义我需要知道我在计算中使用了多少个处理器
当使用的处理器数量由用户直接控制时,多 CPU 并行化也是如此。 GPU 并非如此:您可以使用 GPU,但您无法控制设备内部的调度。所以通常(实际上,在我见过的所有 CPU-vs-GPU 图表上)要么有“SpeedUp(问题维度)”(用于“营销”演示)或“SpeedUp(内核选项)”(用于更多“技术人员”演示;内核选项可能是网格参数或某些代码特性)或“SpeedUp(使用的 GPU 数量)”(当然,当您的程序支持多 GPU 时)。
【讨论】:
我想说 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 命令都已提交到计算设备并且已完成。
【讨论】:
使用设置的 CL_QUEUE_PROFILING_ENABLE 标志创建您的命令队列,然后使用 clGetEventProfilingInfo 提取计时数据。详情请参阅《OpenCL 编程指南》第 9 章。
【讨论】:
我相信有些 GPU 没有硬件设备来精确测量时间;所以这意味着你可能需要回到 CPU。但我可能错了。
【讨论】: