我最近比较了两种进行内核运行时测量的方法,我看到了一些令人困惑的结果。
我使用带有集成 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 毫秒。
我用 clGetEventProfilingInfo
进行的第二次测量 QUEUED
/SUBMIT
/START
/END
.
有了这 4 个时间值,我可以计算出在不同状态下花费的时间:
- 排队时间:0.06 毫秒,
- 提交时间花费:2733 毫秒,
- 执行时间:2731 毫秒(实际执行时间)。
我看到它加起来是 5466 毫秒,但为什么它有一半时间处于提交状态?
有趣的是:
提交的状态始终是实际执行时间的一半,即使对于不同的内核或不同的工作负载(因此它不可能是一个恒定的设置时间),
对于 CPU 而言,提交状态的时间花费为 0,执行时间等于 gettimeofday 结果,
我在带有 Windows 的 Intel Ivy Bridge 上使用 CPU 和 GPU 测试了我的内核,但我没有看到效果。
有人知道吗?
我怀疑 GPU 运行内核两次(导致 gettimeofday 是实际执行时间的两倍)或者函数 clGetEventProfilingInfo 对于 AMD GPU 无法正常工作。
最佳答案
我在 AMD 论坛上发布了这个问题。他们说这是 AMD 分析器中的错误。
关于c++ - AMD GPU 的 OpenCL 时间测量问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12605546/