Halide — Новый Язык Для Обработки Изображений


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

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

Halide-это новый функциональный язык программирования от Массачусетского технологического института (с помощью Стэнфорда и Adobe), который позволяет более легко и без необходимости беспокоиться о том, как реализуется алгоритм, определять алгоритмы обработки изображений, в основном методы свертки блоков. Затем во втором разделе программы дается общее описание того, как алгоритм должен быть распараллелен. Он не только описывает, как алгоритм должен быть разделен между вычислительными элементами, но и как организовать данные, чтобы конвейеры обработки работали с максимальной эффективностью, избегая перезапусков.

Самый простой способ понять общую идею-увидеть простой пример (взятый из статьи):

Func halide_blur(Func in) f Func tmp, размыто;  Var x, y, xi, yi; // Алгоритм tmp(x, y) = (in(x-1, y) + in(x, y) + in(x+1, y))/3; размытый(x, y) = (tmp(x, y-1) + tmp(x, y) + tmp(x, y+1))/3; // Расписание размыто.плитка(x, y, xi, yi, 256, 32) .векторизация(xi, 8).параллельный(y); tmp.chunk(x).векторизация(x, 8); возврат размытым;}

Первая часть программы определяет простой фильтр размытия 3×3, разделенный на горизонтальное размытие, за которым следует вертикальный шаг размытия. В последней части программы расписание определяет, как алгоритм может быть обработан в параллельной реализации. Шайлер зависит от конкретной машины и должна быть изменена, чтобы получить максимальную производительность от конкретного конвейера процессора. 

Локальный фильтр Лапласа 69 линий 158 мс в 2 раза быстрее

По сравнению с простой непараллельной реализацией в C++ галоидная версия выполняется за 0,9 мс, где C++ занимает 9,94 мс. Оптимизированная параллельная версия C++ работает с той же скоростью, но, конечно, для ее создания требуется гораздо больше времени.

Компилятор Halide выводит код для x86, ARM и PTX с помощью компилятора LLVM. При использовании он, как правило, работает так же или лучше, чем оптимизированный код, но использует гораздо меньше строк для реализации. Например, фильтр Лапласа занимает 335 мс и 262 строки C++/OpenMP, но галогенид выполняет эту работу за 158 мс и 79 строк. Обычно галоидные программы имеют примерно треть длины C++ и что-то от 2x до 10x.

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

Двусторонняя сетка 40 линий 80 мс в 6 раз быстрее


Добавить комментарий