我最近比较了两种做内核运行时测量,我看到了一些令人困惑的结果。
我使用带有集成 GPU 和 Ubuntu Linux ( CL_PLATFORM_VERSION
is ) 的 AMD Bobcat CPU (E-350 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
for QUEUED
/ SUBMIT
/ START
/进行的第二次测量END
。
使用 4 个时间值,我可以计算在不同状态下花费的时间:
- 排队时间:0.06 毫秒,
- 提交时间:2733 毫秒,
- 执行时间:2731 ms(实际执行时间)。
我看到它加起来是 5466 毫秒,但是为什么它会在一半的时间内保持提交状态?
有趣的是:
提交状态始终是实际执行时间的一半,即使对于不同的内核或不同的工作负载(因此它不能是恒定的设置时间),
对于 CPU,提交状态的时间为 0,执行时间等于 gettimeofday 结果,
我在 Intel Ivy Bridge 上使用 CPU 和 GPU 在 Windows 上测试了我的内核,但我没有看到那里的效果。
有人有线索吗?
我怀疑 GPU 运行内核两次(导致 gettimeofday 是实际执行时间的两倍)或者函数 clGetEventProfilingInfo 对于 AMD GPU 无法正常工作。