Проблемы измерения времени в OpenCL с AMD GPU

Недавно я сравнил 2 вида измерения времени выполнения ядра и вижу некоторые запутанные результаты.

Я использую процессор AMD Bobcat (E-350) со встроенным графическим процессором и Ubuntu Linux (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 мс, но почему он остается в представленном состоянии в течение половины времени?

И забавные вещи:

  • представленное состояние всегда составляет половину фактического времени выполнения, даже для разных ядер или различной рабочей нагрузки (поэтому оно не может быть постоянным временем установки),

  • для процессора время, проведенное в представленном состоянии, равно 0, а время выполнения равно результату gettimeofday,

  • Я протестировал свои ядра на Intel Ivy Bridge с окнами, используя CPU и GPU, и я не увидел там эффектов.

У кого-нибудь есть ключ?

Я подозреваю, что либо графический процессор запускает ядро ​​дважды (в результате чего gettimeofday удваивается от фактического времени выполнения), либо функция clGetEventProfilingInfo не работает правильно для AMD GPU.

1

Решение

Я разместил проблему на форуме AMD. Говорят, это ошибка в профилировщике AMD.

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

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]