января 18, 2019

darktable 2.4 > Специальные темы > Darktable и OpenCL > Оптимизация производительности OpenCL

ПРЕД.

10.2. Darktable и OpenCL

10.2.7. Оптимизация производительности OpenCL

В $HOME/.config/darktable/darktablerc (%homepath%\AppData\Local\darktable\darktablerc для ОС Windows) есть некоторые параметры конфигурации, которые помогают настроить производительность OpenCL системы. Производительность в этом контексте в основном означает латентность darktable во время интерактивной работы, то есть, сколько времени требуется для обработки пиксельного конвейера. Для комфортного рабочего процесса важно поддерживать низкую латентность.

Чтобы получить информацию для настройки, запустите darktable из терминала с помощью команды:

darktable -d opencl -d perf

После каждой обработки пиксельного конвейера, вызванного изменением параметров модуля, масштабированием, панорамированием и т.д., вы получите общее время и время, затрачиваемое каждым из ядер OpenCL. Наиболее надежным значением является общее время, затраченное на пиксельный конвейер. Обратите внимание, что время для каждого отдельного модуля ненадежно при асинхронном запуске OpenCL пиксельного конвейера (см. ниже opencl_async_pixelpipe).

Чтобы обеспечить быструю обработку пиксельного конвейера с помощью OpenCL, важно максимально занять GPU. Любые прерывания или остановки потока данных будут увеличивать общее время обработки. Это особенно важно для небольших буферов изображений, которые необходимо обрабатывать во время интерактивной работы. Их можно быстро обработать быстрым графическим процессором. Однако даже кратковременные остановки пиксельного конвейера могут легко стать узким местом.

С другой стороны, производительность darktable во время экспорта файлов более или менее зависит от скорости выполнения алгоритмов и мощности вашего GPU. Краткосрочные остановки не окажут заметного влияния на общее время экспорта.

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

opencl_async_pixelpipe
Этот логический флаг определяет, как часто мы блокируем пиксельный конвейер OpenCL и получаем статус успеха/неудачи всех ядер, которые были запущены. Для оптимальной латентности установите значение в TRUE, в этом случае darktable запускает пиксельный конвейер асинхронно и пытается использовать как можно меньше прерываний. Если у вас возникают ошибки в OpenCL, такие как ошибки ядер, задайте значение параметру FALSE. После этого darktable будет прерываться после каждого модуля, таким образом, вам будет легче изолировать проблему. Есть информация о проблемах с некоторыми старыми картами ATI/AMD, такими как HD57xx, которые могут создавать искаженный вывод, если для этого параметра установлено значение TRUE. Если у вас есть сомнения, оставьте его по умолчанию в значении FALSE.

opencl_number_event_handles
Обработчики событий (дескрипторы) используются, чтобы мы могли отслеживать успех/неудачу ядер и информацию для настройки, даже если пиксельный конвейер запускается асинхронно. Количество обработчиков событий - это ограниченный ресурс вашего драйвера OpenCL. Конечно, мы можем их пересоздавать, но есть ограниченное количество обработчиков, которое мы можем использовать одновременно. К сожалению, нет способа узнать, каковы ограничения ресурсов; поэтому мы можем только гадать. Значение по умолчанию 25 является довольно консервативным. Вы можете попробовать и более высокие значения, такие как 100, возможно, они дадут лучшую производительность OpenCL. Если у вашего драйвера закончились свободные дескрипторы, то вы получите сбой ядра OpenCL с кодом ошибки "-5 (CL_OUT_OF_RESOURCES)" или даже сбой, или зависания системы; в этом случае снова уменьшите значение. Значение 0 будет блокировать darktable от использования любых обработчиков событий. Это отключит корректное отслеживание darktable успеха/неудач ядер OpenCL, но сэкономит некоторые ресурсы драйверу. Следствием этого является то, что любые сбои, скорее всего, приведут к искажению вывода без уведомления от darktable; рекомендуется только в том случае, если вы точно знаете, что ваша система работает устойчиво. Вы также можете установить этот параметр равным -1, что означает, что darktable не принимает никаких ограничений в количестве обработчиков событий; не рекомендуется.

opencl_synch_cache
Если этот параметр установлен в значение TRUE, то он заставит darktable получать буферы изображений вашего GPU после выполнения каждого модуля и сохранять их в кэше пиксельного конвейера. Это очень ресурсоемкая операция. Она имеет смысл, только если у вас очень медленный графический процессор. В этом случае darktable может фактически сэкономить некоторое время, когда параметры модуля изменились, так как он может вернуться к некоторому кэшированному промежуточному состоянию и обработать только часть пиксельного конвейера. В большинстве случаев этот параметр должен быть установлен в FALSE (по умолчанию).

opencl_micro_nap
В идеальном случае вы используете GPU на 100% при обработке пиксельного конвейера. Это хорошо. С другой стороны, ваш GPU также необходим для регулярного обновления графического интерфейса. Может случиться так, что для этой задачи не останется достаточно ресурсов. Следствием будет порывистая реакция вашего графического интерфейса на панорамирование, масштабирование и перемещение ползунков. Darktable может добавить небольшие "простои" в обработку пиксельного конвейера, чтобы GPU немного перевёл дух и отработал команды, связанные с графическим интерфейсом. Параметр opencl_micro_nap контролирует длительность этих "простоев" в микросекундах. Вам нужно поэкспериментировать, чтобы найти оптимальное значение для вашей системы. Значения 0, 100, 500 и 1000 являются хорошими отправными точками, чтобы попробовать. По умолчанию 1000.

opencl_use_pinned_memory
Во время тайлинга (разбиения изображения на фрагменты) необходимо передавать огромные объёмы памяти между хостом и устройством. На некоторых устройствах (а именно AMD) прямая передача из/в произвольной(ую) области памяти хоста может дать значительное снижение производительности. Это особенно заметно при экспорте больших изображений. Установка этого параметра конфигурации в TRUE сообщает darktable о необходимости использовать специальный промежуточный буфер для передачи данных между хостом и устройством. На некоторых устройствах это может ускорить экспорт больших файлов в 2-3 раза. У устройств и драйверов NVIDIA, по-видимому, есть более эффективная технология передачи данных даже для произвольных областей памяти. Поскольку они не могут показать прирост производительности и даже могут вызывать искаженный вывод, то opencl_use_pinned_memory в этом случае следует оставить в значении по умолчанию FALSE.

Комментариев нет:

Отправить комментарий