Двусмысленность событий OpenCL

Ссылаясь на документацию clGetEventProfilingInfo, cl_event Результатом clEnqueueNDRangeKernel может быть:

  1. CL_PROFILING_COMMAND_QUEUED

когда команда, указанная в событии, ставится в очередь в очередь команд хостом.

  1. CL_PROFILING_COMMAND_SUBMIT

когда команда, идентифицированная событием, которое было поставлено в очередь , передается хостом на устройство, связанное с очередью команд.

  1. CL_PROFILING_COMMAND_START

когда команда, идентифицированная событием, начинает выполнение на устройстве.

  1. CL_PROFILING_COMMAND_END

когда команда, идентифицированная событием , завершила выполнение на устройстве.


Предположим, визуализация всего профилирования ядра:

COMMAND_QUEUED -> COMMAND_SUBMIT -> COMMAND_START -> COMMAND_END

& соответствующий график:

Queueing -> Submitting -> Executing

Куда:

  • Очередь = COMMAND_SUBMIT - COMMAND_QUEUED
  • Отправка = COMMAND_START - COMMAND_SUBMIT
  • Выполнение = COMMAND_END - COMMAND_START

Вопросы:
Верны ли мои предыдущие уравнения? Если да, в чем реальная разница между очередью и отправкой? Другими словами, если я хочу разделить весь процесс на время СВЯЗИ (разгрузки) и время ВЫЧИСЛЕНИЯ (выполнения), какими будут их уравнения?

2 ответа

Ваша интерпретация кажется довольно верной. QUEUED - это когда вы вызывали OpenCL API (например, clEnqueueNDRangeKernel). SUBMIT - это когда среда выполнения дала работу устройству. START - когда начинается выполнение, END - когда выполнение заканчивается. Есть три состояния между этими четырьмя разами. Первое состояние простаивает на хосте. Второе состояние простаивает на устройстве. Третье состояние выполняется на устройстве. Если вы хотите объединить первые два в "общение", добавьте их вместе (или используйте COMMAND_START - COMMAND_QUEUED).

Верны ли мои предыдущие уравнения?

Да.

Если да, то в чем реальная разница между очередью и отправкой? Другими словами, если я хочу разделить весь процесс на время СВЯЗИ (разгрузки) и время ВЫЧИСЛЕНИЯ (выполнения), какими будут их уравнения?

Очередь:

  • Потратьте время на ожидание завершения других задач, чтобы запустить текущее. Другими словами, ожидание состояния CL_COMPLETE всех зависимых событий или наличие свободных ресурсов в текущей очереди.
  • Примечание. Процессоры будут иметь 0 в очереди при очереди на незанятое устройство, потому что они синхронны. В то время как графические процессоры ВСЕГДА будут в любом случае иметь небольшое время в очереди (из-за асинхронного поведения). Это причина для максимально возможной передачи данных на устройства с графическим процессором.

Посылаем:

  • Время, затрачиваемое на подготовку текущей задачи (компиляция LLVM, перемещение буферов, подготовка ядер устройства и т. Д.), Должно быть небольшим, но не равным 0.

Если вы ищете формулу, только "Отправка" и "Выполнение" действительны для расчета накладных расходов текущей задачи. Игнорируйте очереди, так как это не зависит от вашей задачи:

Active% = Executing/(Executing+Submitting)
Overhead% = Submitting/(Executing+Submitting)
Другие вопросы по тегам