【发布时间】:2015-12-17 01:51:24
【问题描述】:
我最近比较了两种进行内核运行时测量的方法,我看到了一些令人困惑的结果。
我使用带有集成 GPU 和 Ubuntu Linux 的 AMD Bobcat CPU (E-350)(CL_PLATFORM_VERSION 是 OpenCL 1.2 AMD-APP (923.1))。
gettimeofday 的基本概念如下所示:
clFinish(...) // that all tasks are finished on the command queue
gettimeofday(&starttime,0x0)
clEnqueueNDRangeKernel(...)
clFlush(...)
clWaitForEvents(...)
gettimeofday(&endtime,0x0)
这表示内核需要大约 5466 毫秒。
我对@987654324@ 进行了第二次测量,用于QUEUED / SUBMIT / START / END。
通过 4 个时间值,我可以计算出在不同状态下花费的时间:
- 排队时间:0.06 毫秒,
- 提交的时间花费:2733 毫秒,
- 执行时间:2731 毫秒(实际执行时间)。
我看到它加起来是 5466 毫秒,但是为什么它在提交状态停留了一半的时间?
有趣的是:
提交状态始终是实际执行时间的一半,即使对于不同的内核或不同的工作负载(因此它不能是恒定的设置时间),
对于CPU来说,提交状态的时间为0,执行时间等于gettimeofday的结果,
我在 Intel Ivy Bridge 上使用 CPU 和 GPU 测试了我的内核,但我没有看到效果。
有人知道吗?
我怀疑 GPU 运行内核两次(导致 gettimeofday 是实际执行时间的两倍)或者函数 clGetEventProfilingInfo 对 AMD GPU 无法正常工作。
【问题讨论】:
-
您是否向设备发送任何数据?您可能也测量了一些 I/O 时间。尝试减少传输的数据量,或者只是禁用 clEnqueueWriteBuffer 以查看它如何改变您的测量结果。
-
我向设备发送了一些数据,但我在运行内核之前执行此操作,并且测量之前的 clFinish(...) 应该完成队列中的所有任务。我也使用 CL_TRUE 进行数据复制,它会阻塞直到数据被传输。
-
编辑说明:您需要阅读,我们如何在此处格式化帖子。你的格式太可怕了!您将 HTML 与 Markdown 混合在一起。我们在这里使用 Markdown。我刚刚解决了你的问题,但这肯定是一项艰巨的任务。很多乱七八糟的......
标签: c++ opencl gpu amd-processor amd-app