c++ - AMD GPU 的 OpenCL 时间测量问题

标签 c++ opencl gpu amd-processor amd-app

我最近比较了两种进行内核运行时测量的方法,我看到了一些令人困惑的结果。

我使用带有集成 GPU 和 Ubuntu Linux 的 AMD Bobcat CPU (E-350)(CL_PLATFORM_VERSIONOpenCL 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 分析器中的错误。

http://devgurus.amd.com/thread/159809

关于c++ - AMD GPU 的 OpenCL 时间测量问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12605546/

相关文章:

monitoring - 监控显卡使用情况

ios - 按索引访问 GPU 缓冲区

c++ - 创建集合 vector

c++ - 循环时持有对 unique_ptr 的引用

c++ - 在模板函数包装器中处理 void 返回

c++ - 获取任何多边形内的所有 x,y 点

c - 纯 C OpenCL 与 Python OpenCL 性能对比

opencl - 如何在 OpenCL 中自动增加全局计数器

cuda - 为 CUDA 编译器驱动程序禁用二进制缓存

machine-learning - Tensorflow:启动新 session 时出现扭矩和 GPU 问题:CUDA_ERROR_INVALID_DEVICE