我最近比较了两种做内核运行时测量,我看到了一些令人困惑的结果。
我使用集成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
的{{1}}进行了第二次测量。
使用4个时间值,我可以计算不同状态下的时间花费:
我看到它累计达到了5466毫秒,但为什么它在一半的时间内保持提交状态?
有趣的是:
提交状态总是实际执行时间的一半,即使对于不同的内核或不同的工作负载(因此它不能是一个恒定的设置时间),
对于CPU,提交状态下的时间为0,执行时间等于gettimeofday结果,
我在Intel Ivy Bridge上使用CPU和GPU测试了我的内核,我没有看到那里的效果。
有没有人有线索?
我怀疑GPU运行内核两次(导致gettimeofday是实际执行时间的两倍),或者函数clGetEventProfilingInfo无法正常运行AMD GPU。