Недавно я сравнил 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 значений времени я могу рассчитать время, проведенное в разных состояниях:
Я вижу, что это составляет 5466 мс, но почему он остается в представленном состоянии в течение половины времени?
И забавные вещи:
представленное состояние всегда составляет половину фактического времени выполнения, даже для разных ядер или различной рабочей нагрузки (поэтому оно не может быть постоянным временем установки),
для процессора время, проведенное в представленном состоянии, равно 0, а время выполнения равно результату gettimeofday,
Я протестировал свои ядра на Intel Ivy Bridge с окнами, используя CPU и GPU, и я не увидел там эффектов.
У кого-нибудь есть ключ?
Я подозреваю, что либо графический процессор запускает ядро дважды (в результате чего gettimeofday удваивается от фактического времени выполнения), либо функция clGetEventProfilingInfo не работает правильно для AMD GPU.
Я разместил проблему на форуме AMD. Говорят, это ошибка в профилировщике AMD.
Других решений пока нет …