2013-07-01 10 views
1

У меня есть программа pyopencl, которая делает длинный расчет (~ 3-5 часов за запуск). У меня несколько ядер запускаются один за другим в цикле. Так что у меня есть что-то вроде этого:Измерение и минимизация служебных данных OpenCL

prepare_kernels_and_data() 

for i in range(big_number): # in my case big_number is 400000 
    load_data_to_device(i) # ~0.0002s 
    run_kernel1(i)   # ~0.0086s 
    run_kernel2(i)   # ~0.00028s 
    store_data_from_device(i) # ~0.0002s 

я измерил время, и я получил следующее:

  1. времени Системы 4:30 часов (измеряются Linux time команды)
  2. Pure OpenCL на основе событий выбор времени 3:30 часов (нагрузка + высчитывает + магазин)

Я хотел бы знать:

  1. Насколько велики минимальные накладные расходы для программы OpenCL? В моем случае это похоже на 35%
  2. Должен ли я доверять событиям на основе таймингов?
  3. Включает ли профилирование значительное время на выполнение всей программы?

Я знаю, что накладные расходы зависят от программы, и я знаю, что python не так быстро, как чистый C или CPP. Но я считаю, что, когда я переношу все свои тяжелые вычисления в ядра OpenCL, я могу потерять не более 5-7%. Пожалуйста, поправьте меня, если я ошибаюсь.

P.S. AMD OpenCL, AMD GPU

ответ

1

Как вы измеряете время OCL? Используя только что-то вроде:

my_event.profile.end - my_event.profile.start 

Если это так, вы также можете использовать другой показатель, как что:

my_event.profile.start - my_event.profile.queued 

Эта метрика измерения времени, затрачиваемого в пользовательское приложение, а также во время выполнения перед выполнением следовательно, накладные расходы. Эта метрика предлагается в AMD programing guide в разделе 4.4.1.
Они также дают предупреждение о профилировании объясняя, что команды могут быть отправлены по партии и, следовательно,

Команда, представленная в партии сообщает подобные времена начала и в то же время конца.

Если я хорошо помню, передает потоки NVIDIA. Но в любом случае вы можете использовать это, чтобы уменьшить накладные расходы. Например, вместо того:

Cl_prog.kernel1(…).wait() 
Cl_prog.kernel2(…).wait() 

Вы могли бы сделать что-то вроде:

Event1 = Cl_prog.kernel1(…) 
Event2 = Cl_prog.kernel2(…) 
Event1.wait() 
Event2.wait() 

И так далее.
Но я отвлекся; Теперь, чтобы ответить конкретно на ваши вопросы здесь некоторые входные взяты из той же секции я уже упоминал выше (Это от AMD, но я предполагаю, что это должно быть довольно много же для NVIDIA):

  1. «Для устройств центрального процессора, время запуска ядра быстро (десятки микросекунд), но для дискретных устройств GPU может быть несколько сот мкс «

  2. См котировки выше

  3. » Включение профилирования на очереди команд добавляет примерно 10 мкс до 40 мкс накладные расходы для всех вызовов clEnqueue ".

 Смежные вопросы

  • Нет связанных вопросов^_^