【发布时间】:2017-06-20 10:24:31
【问题描述】:
最近我正在编写处理一些图像的 OpenCL 代码。 完成代码后,我需要对执行相同工作的 OpenCL 代码和本机 C(或 C++)代码进行基准测试。
我的问题是从上面引起的。具体来说,我应该包含哪些步骤来测量时间?
StackOverflow 上的大部分书籍和问题仅测量使用 clGetEventProfilingInfo() 和 clWaitForEvents() 执行 clEnqueueNDRangeKernel() 的时间。
我的学长说我需要包含缓冲区复制作业(C 内存到 cl_mem),因为本机 C 代码没有这样的步骤。 那么我应该包含程序创建和内核构建步骤、参数设置步骤、*.cl 源代码文件读取步骤和(最奇怪的东西)clCreateContext() 步骤吗?
根据 [this paper],与下面的其他步骤相比,clCreateContext() 消耗的时间最多。 IMAGE
来自 SONY 的 Android OpenCL 代码示例也仅获取 clEnqueueNDRangeKernel() 的经过时间。在这里查看 -> developer.sonymobile.com/downloads/code-example-module/opencl-code-example/
如果以上是正确的,我应该只测量在 OpenCL 内核代码中执行相同工作的非常原生的 C 代码是否正确?
或者是否有不同的视角来分析和比较 OpenCL 和原生 C 代码?
另外:我的程序将处理连续图像(如视频),因此在 GPU 和其他内存之间会有频繁的内存复制。那么我也应该有时间在 OpenCL 代码和本机 C 代码中复制内存,对吧?
【问题讨论】:
标签: c parallel-processing opencl gpgpu