Федотов Н.Г. , Романов С.В., Кольчугин А.С.
ПРИМЕНЕНИЕ ПАРАЛЛЕЛЬНЫХ ВЫЧИСЛЕНИЙ ПРИ РЕШЕНИИ ЗАДАЧ РАСПОЗНАВАНИЯ МЕТОДОМ СТОХАСТИЧЕСКОЙ ГЕОМЕТРИИ
Работа выполняется при поддержке гранта РФФИ № 05-01-00991.
На современном этапе производители процессоров столкнулись с технологическими сложностями дальнейшего наращивания тактовой частоты. В качестве альтернативного способа увеличения производительности в сегменте персональных компьютеров появились многоядерные процессоры. На сегодняшний день уже существуют двух- и четырех ядерные модели, аналитики прогнозируют дальнейшее увеличение количества
ядер.
Появление многоядерных процессоров в первую очередь отразилось на производителях программного обеспечения. Теперь производительность программы определяется не только эффективностью алгоритма, но и эффективным использованием параллельных вычислений, применение которых позволяет полностью использовать вычислительные ресурсы системы.
Далеко не все алгоритмы допускают эффективное распараллеливание. Разработчикам программ с большой вычислительной сложностью необходимо либо искать новые алгоритмы решения задач, либо распараллеливать существующие вычислительные схемы.
Рассмотрим возможность применение параллельных вычислений в задачах распознавания образов методом стохастической геометрии. Ориентируясь на современные аппаратные средства, необходимо построить нераспределенную систему распознавания образов, порождающую не менее 4 эффективных потоков (что соответствует наибольшему числу ядер на сегодняшний день).
Переход от однопоточной системы к параллельной, обычно, сводится к применению многопоточных вычислений в наиболее ресурсоемких операциях. Такой подход вытекает из требований, предъявляемых к многопоточным вычислениям:
Минимальные расходы вычислительных ресурсов на управление потоками (другими словами, затраты машинных ресурсов на порождение, удаление и переключение между потоками должны быть минимальны);
Минимизация времени ожидания потока (синхронизация потоков приостанавливает их выполнение);
Простота контроля завершенности работы.
Повсеместное распараллеливание является задачей трудоемкой и зачастую малоэффективной.
Общая функциональная схема системы представлена на рисунке 1. Из неё исключена решающая процедура, которая является специфичной для каждой решаемой задачи и не используется при генерации признаков.
Рисунок 1. Общая функциональная схема
Для определения наиболее ресурсоемких операций используем профилирование программы. Время выполнения различных операций зависит от исходного изображения, поэтому в качестве оценки ресурсоемкости будем использовать время на выполнение операции в процентах от общего времени выполнения блока кода. Формирование сканирующих прямых осуществляется один раз независимо от количества вычисляемых функционалов, поэтому данная операция также исключена из рассмотрения.
По результатам профилирования, построенного для изображений размером 7 00х7 00 с деревом функционалов 1:60:60 (для каждого Т функционала вычисляется 60 Р функционала, для каждого Р функционала вычисляется 60 0 функционалов):
Вычисление Т функционала * 92 %;
Вычисление Р функционала * 8 %;
Вычисление 0 функционала < 1 %;
Из данных хорошо видно, что в первую очередь необходимо «ускорить» вычисление Т функционала.
Существует три схемы параллельных вычислений:
Симметричные потоки (все потоки выполняют одну и туже функцию);
Конвейерное вычисление (результат работы одного потока является исходными данными для другого потока);
Смешенная схема (применяется только при очень большом количестве потоков);
Для нашей задачи больше всего подходит первая схема, так как она обычно проще в реализации и не приводит к длительной приостановке выполнения потоков при синхронизации.
Необходимо отметить, что возможно организовать параллельное вычисление всего дерева функционалов, но данный подход будет неэффективен при наличии всего одного Т функционала и приведет к увеличению необходимого количества оперативной памяти приблизительно на 4 0%, что неприемлемо для больших изображений. Поэтому в дальнейшем рассматривается только возможность применения параллельных вычислений в рамках одной операции, не приводящее к значительному увеличению необходимого количества памяти.
Для реализации вычислений в параллельных потоках необходимо разделить исходные данные на равные части, количество частей определит количество эффективных потоков. В задачах распознавания образов методом стохастической геометрии сканирующие прямые формируются для множества углов (определяется настройками системы и обычно составляет 0° - 360° с шагом 10°). Множество сканирующих прямых,
найденных для определенного угла являются исходными данными для потока, вычисляющего значение Т функционала.
Далее необходимо осуществить управление потоками. Количество порождаемых потоков не должно быть жестко детерминированным, так как это приведет к ухудшению производительности в случае несовпадения количества процессоров с количеством порожденных потоков. Все сканирующие прямые хранятся в одном объекте и их количество известно. Легко добавить в данный класс метод, возвращающий множество необработанных санирующих прямых или null, если все сканирующие прямые переданы на обработку. Получение потоком вместо исходных данных null приведет к его удалению. Результаты вычисления передаются объекту класса t_result. Все результаты вычислений хранят угол, для которого было сформировано данное множество сканирующих прямых, поэтому в классе хранения результата не составляет сложности отсортировать полученные данные, определить прогресс выполнения вычислений и сформировать событие окончания вычислений.
Простейшая оболочка для многопоточных вычислений представлена на рисунке 2.
scan_lines
settings
get__lines(int angle)
t_function
th_start(int angle)
t_resu It
settings
add_res(t_res res)
Рисунок 2. Диаграмма оболочки для многопоточного вычисления
В результате профилирования новой системы (использовалось два потока, на двух ядерном процессоре) были получены следующие результаты:
Вычисление T функционала * 85 %;
Вычисление P функционала * 15 %;
Вычисление Q функционала < 1 %;
Как видно из представленных результатов производительность блока вычисления Т функционала возросла практически в два раза, а общая производительность представленной части системы в 1.85 раза. Данный показатель говорит об эффективности работы данного подхода.
Следующим шагом является оптимизация операции вычисления Р функционала. Здесь можно применить различные схемы параллельных вычислений. Учитывая, что результат вычисления Т функционала для определенного угла является исходным значением для вычисление Р функционала, можно использовать схему предложенную выше. Её применение приводит к увеличению производительности данной операции на 32 %. Данный метод является универсальным и может быть применен практически в любой системе распознавания образов на основе стохастической геометрии. Что вместе с предыдущей оптимизацией вычисления Т функционала приводит к увеличению производительности данного блока системы в 1.92 раза (два потока на двух ядерном процессоре).
Формирование сканирующих прямых является ресурсоемкой операцией, так как использует алгоритм поворота координатной системы. Для применения параллельных вычислений будем опираться на необходимость получить множество сканирующих прямых для определенного угла. Для организации многопоточной работы используется схема, представленная выше. Исходными данными являются изображение и настройки системы. Результаты сохраняются в объекте класса scan_lines, в котором реализуется сортировка полученных данных, контроль завершенности работы и формирования события окончания вычислений.
По результатам тестирования производительность данного блока возрастает в 1.7 раза (два потока, изображение размером 700х600 точек).
На основе полученных результатов можно сделать вывод, что метод распознавания образов на основе стохастической геометрии допускает эффективное выполнение на многоядерных и многопроцессорных системах.
Для самой общей задачи распознавания образов допускается использование до 32 эффективных потоков. Для двух потоков прирост производительности составляет около 92 %, для четырех потоков (в случае
достаточной скорости работы оперативной памяти) ожидаемый прирост производительности составит 272 % (или время выполнения программы сократиться в 3.6 раза).
Для частных случаев задачи распознавания образов можно применить иные схемы параллельных вычислений, которые дадут еще больший прирост производительности.