Обработка изображений также становится мобильной, поскольку все больше людей отправляют фотографии с мобильных телефонов непосредственно в интернет, не перенося их предварительно на компьютер.
В то же время, цифровые фотофайлы становятся настолько большими, что без серьёзных разработок программного обеспечения их обработка займёт невероятно много времени на персональном компьютере, не говоря уже о мобильном телефоне. К сожалению, уловки, которые инженеры используют для ускорения своих алгоритмов обработки изображений, делают их код практически нечитаемым и редко пригодным для повторного использования. Добавление новой функции в программу обработки изображений или её модификация для работы на другом устройстве часто требует повторного изучения и полной переработки кода.
Исследователи из Лаборатории компьютерных наук и искусственного интеллекта (CSAIL) Массачусетского технологического института помогают изменить эту ситуацию с помощью нового языка программирования под названием Halide. Программы на Halide не только проще читать, писать и проверять, чем программы обработки изображений, написанные на традиционном языке, но и автоматизируют процедуры оптимизации кода, которые обычно занимают часы при ручном выполнении, и работают значительно быстрее.
В ходе тестирования исследователи из Массачусетского технологического института использовали Halide для переработки нескольких распространенных алгоритмов обработки изображений, производительность которых уже была оптимизирована опытными программистами. Версии, созданные с помощью Halide, как правило, были более чем на треть длиннее, но обеспечивали значительное повышение производительности — в два, три или даже шесть раз быстрее. В одном случае программа, созданная с помощью Halide, оказалась даже длиннее оригинала, но прирост скорости составил 70 раз.
Джонатан Раган-Келли, аспирант кафедры электротехники и информатики (EECS), и Эндрю Адамс, научный сотрудник CSAIL, руководили разработкой Halide и опубликовали код в интернете. На Siggraph, первой конференции по графике, он представил доклад о Halide, соавторами которого выступили профессора информатики Массачусетского технологического института Саман Амарасингхе и Фредо Дюран, а также коллеги из Adobe и Стэнфордского университета.
Параллельная конвейерная обработка:
Одна из причин высокой вычислительной сложности обработки изображений заключается в том, что она обычно требует выполнения ряда дискретных операций. После попадания света на датчик камеры мобильного телефона, телефон «прочесывает» данные изображения, чтобы найти значения, указывающие на неисправные пиксели датчика, и исправляет их. Затем он сопоставляет показания пикселей, чувствительных к разным цветам, чтобы определить фактические цвета областей изображения. После этого выполняется небольшая цветокоррекция и дополнительная регулировка контраста, чтобы цвета более точно соответствовали тому, что видит человеческий глаз. На этом этапе телефон выполнил настолько обширную обработку, что требуется еще один шаг для очистки данных.
И это только для отображения изображения на экране телефона. Программное обеспечение, выполняющее более сложные операции, такие как удаление эффекта красных глаз, сглаживание теней, повышение насыщенности цвета или придание изображению вида старой фотографии Polaroid, вводит еще больше уровней обработки. Кроме того, для модификаций более высокого уровня требуется, чтобы программное обеспечение вернулось к предыдущим этапам и пересчитало канал обработки.
В современных многоядерных процессорах распределение различных сегментов изображения между параллельно работающими ядрами может повысить эффективность обработки изображений. Однако в типичном сценарии параллельной обработки после каждого шага в конвейере обработки изображений ядра могут отправлять результаты своих вычислений обратно в основную память. Поскольку передача данных намного медленнее, чем вычисления, это может свести на нет все преимущества распараллеливания.
Поэтому инженеры-программисты стараются как можно дольше задействовать все отдельные ядра, прежде чем отправлять результаты в память. Это означает, что ядрам приходится выполнять несколько этапов обработки данных на своих отдельных участках, не объединяя результаты. Отслеживание всех зависимостей между пикселями, обрабатываемыми на отдельных ядрах, делает код для эффективной обработки изображений таким сложным. Кроме того, компромиссы между количеством ядер, вычислительной мощностью ядер, объемом локальной памяти, доступной каждому ядру, и временем, необходимым для перемещения данных из ядра, различаются от машины к машине, поэтому программа, оптимизированная для одного устройства, может не обеспечивать преимуществ в скорости на другом.
Разделяй и властвуй:
Halide не избавляет программиста от необходимости думать об эффективной распараллеливании на определенных машинах; вместо этого он разделяет проблему за пределами описания алгоритмов обработки изображений. Программа Halide состоит из двух разделов: один для алгоритмов, а другой для «плана» обработки. План может определять размер и форму фрагментов изображения, которые каждое ядро должно обрабатывать на каждом этапе конвейера обработки, а также задавать зависимости данных — например, что шаги, выполняемые на определенных ядрах, должны иметь доступ к результатам предыдущих шагов на разных ядрах. Однако после составления плана Halide автоматически обрабатывает все «учетные данные».
Программист, желающий экспортировать программу на другой компьютер, изменяет только расписание, а не описание алгоритма. Программисту, желающему добавить новый этап преобразования в конвейер обработки, достаточно указать описание новой процедуры, не изменяя существующие. (Для добавления нового шага в конвейер потребуется соответствующая спецификация в расписании.).
«Когда у вас возникает идея, что вы хотите каким-то образом параллельно реализовать что-то или этапы использования, при написании кода вручную очень сложно правильно выразить эту идею», — говорит Раган-Келли. «Если у вас появляется новая идея оптимизации, которую вы хотите реализовать, скорее всего, вы потратите три дня на отладку, потому что в процессе вы все испортите. С этим же вы просто меняете одну строку, которая выражает эту идею, и создаете правильную версию»
Хотя программы на Halide проще писать и читать, чем стандартные программы обработки изображений, поскольку программирование осуществляется автоматически, они часто обеспечивают повышение производительности даже по сравнению с самым тщательно разработанным кодом, написанным вручную. Кроме того, код Halide настолько легко модифицировать, что программисты могут просто экспериментировать с непродуманными идеями, чтобы проверить, улучшат ли они производительность.
«Можно просто экспериментировать и пробовать разные вещи наугад, и часто находишь что-то действительно хорошее», — говорит Адамс. «Только гораздо позже, когда вы хорошенько подумаете, вы поймете, почему это хорошо».
# # #
Автор: Ларри Хардести, пресс-служба Массачусетского технологического института
