Я пытался сравнить мою программу FFT на графическом процессоре с использованием PyOpenCL. Я вижу совершенно разные результаты, используя «профилирование» модуля OpenCL и «time» python. Для того, чтобы использовать профилирование, я что-то вроде этого,Настольная маркировка программ PyOpenCL
queue = cl.CommandQueue(ctx,properties=cl.command_queue_properties.PROFILING_ENABLE)
<other codes>
for i in range(N):
events.append(prg3.butterfly(queue,(len(twid),),None,twid_dev,<buffers>))
events[i].wait()
for i in range(N):
elapsed = elapsed + 1e-9*(event[i].profile.end - event[i].profile.start)
print elapsed
В то время как модуль времени может быть использован, как это,
k=time.time()
for i in range(N):
event = prg3.butterfly(queue,(len(twid),),None,twid_dev,<buffers>)
print time.time()-k
Поскольку оба они дают совершенно разные результаты при N = 20, (в то время как ответ остается то же и правильно!), у меня есть следующие вопросы.
- Что именно делает профилирование событий и добавляет ли время, проведенное в event.wait()?
- Так как ответ такой же без события.wait() в случае 2, это правильное количество времени, затраченное на простое выполнение ядра?
Просьба рассказать мне о правильном способе тестирования программ OpenCL в python.
спасибо, это имеет смысл. Но без event.wait() или queue.finish(), им удается получить правильные ответы. Итак, ядра должны были быть выполнены в это время, и вывод готов к копированию на хост. Любые комментарии? –
@KarthikHegde Да - когда вы копируете данные обратно на хост (например, с помощью операции чтения с блокировкой), что заставит все ранее отправленные команды завершить работу. – jprice