【问题标题】:OpenCL performance measurementOpenCL 性能测量
【发布时间】:2011-12-20 06:34:27
【问题描述】:

展示 OpenCL 应用程序(尤其是计算内核)性能的最合适方法是什么? 我已经实现了一些算法,我正在考虑展示加速和效率图表,但根据定义,我需要知道我在计算中使用了多少个处理器。如果是 OpenCL,则无法完成。

【问题讨论】:

    标签: performance opencl


    【解决方案1】:

    nVidia 的最佳实践指南有一整章专门介绍性能测量。很快就归结为:您可以使用外部计时器(@James 提出),也可以使用 GPU 分析机制(@vocaro 提出)。后者应该提供更好的精度,但为了简单起见,我个人坚持使用 CPU 计时器。

    根据定义我需要知道我在计算中使用了多少个处理器

    当使用的处理器数量由用户直接控制时,多 CPU 并行化也是如此。 GPU 并非如此:您可以使用 GPU,但您无法控制设备内部的调度。所以通常(实际上,在我见过的所有 CPU-vs-GPU 图表上)要么有“SpeedUp(问题维度)”(用于“营销”演示)或“SpeedUp(内核选项)”(用于更多“技术人员”演示;内核选项可能是网格参数或某些代码特性)或“SpeedUp(使用的 GPU 数量)”(当然,当您的程序支持多 GPU 时)。

    【讨论】:

      【解决方案2】:

      我想说 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 命令都已提交到计算设备并且已完成。

      【讨论】:

        【解决方案3】:

        使用设置的 CL_QUEUE_PROFILING_ENABLE 标志创建您的命令队列,然后使用 clGetEventProfilingInfo 提取计时数据。详情请参阅《OpenCL 编程指南》第 9 章。

        【讨论】:

        • Nvidia 的 OpenCL 编程指南?有这样的书吗?多一点的精度会很棒。谢谢。
        • 是的,Aaftab Munshi 有一本书叫《OpenCL 编程指南》。这是 Google 搜索的第一个链接。
        【解决方案4】:

        我相信有些 GPU 没有硬件设备来精确测量时间;所以这意味着你可能需要回到 CPU。但我可能错了。

        【讨论】:

        • 那么,您认为我应该将计算时间图表作为任务维度的函数来呈现吗?
        • 可能是的,我想是的(但我不完全确定)。
        猜你喜欢
        • 1970-01-01
        • 2014-06-15
        • 1970-01-01
        • 2018-07-08
        • 1970-01-01
        • 2011-01-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多