
- •Оптимизация и доработка цифрового фильтра масштабирования видеоданных
- •Содержание
- •Введение
- •Технологияdirectshow
- •Обзор технологии
- •Фильтр видео масштабирования компании Элекард в контексте технологииDirectShow
- •Методы масштабирования цифровых изображений, применяемые в фильтре компании элекард
- •Метод Ланцоша
- •Способы оптимизации программы на языке си
- •Выбор оптимального алгоритма
- •Вычислительная сложность
- •Выбор команд
- •Зависимость по данным и параллелизм команд
- •Оптимизация имеющейся программной реализации алгоритма
- •Оптимизация циклов
- •Оптимизация проверки условий
- •Оптимизация медленных команд
- •Оптимизация работы с памятью
- •ТехнологияSimd
- •Общее описание
- •Основные особенности применения технологии
- •Использование многопоточности
- •Общие принципы многопоточности
- •Способы программной организации многопоточности
- •Основные аспекты оптимизации многопоточности
- •Постановка задачи
- •Ход выполнения практики
- •Заключение
- •Список использованных источников
Выбор оптимального алгоритма
Выбор подходящего алгоритма является одним из важнейших факторов, определяющих скорость и качество работы будущей программы. Идеальный алгоритм решает задачу быстро и качественно, однако, как правило, разработчики программ вынуждены искать компромисс между качеством и скоростью работы алгоритма.
Выбор наилучшего алгоритма для решения конкретной задачи - непростое дело. Необходимо учесть вычислительную сложность, требования к памяти, типы данных, с которыми работает алгоритм; типы функций, использующихся в алгоритме; зависимости по данным, надежность – эти и другие факторы определяют степень пригодности алгоритма для решения поставленной задачи.
Вычислительная сложность
Производительность алгоритма может быть оценена через О-нотацию. Для примера сравним сложность и быстродействие алгоритмов сортировки.
Пузырьковая сортировка – один из простейших в реализации и в то же время самых медленных алгоритмов сортировки. Его вычислительная сложность равна O(n2) [5]. Это значит, что при удвоении числа сортируемых элементов, то время выполнения сортировки увеличится приблизительно в четыре раза.
Алгоритм быстрой сортировки имеет сложность равную O(n * log n) [5]. Для более наглядного сравнения рассмотрим задачу сортировки 1000 элементов. При использовании пузырьковой сортировки программе понадобится выполнить около 1000000 операций, в то время как применяя быструю сортировку – всего 9965 операций. Таким образом, использование алгоритма с меньшей вычислительной сложностью в данном случае дает стократное уменьшение числа выполняемых операций. Учитывая время выполнения операций в каждом из алгоритмов, можно приблизительно сравнить оценки времени решения поставленной задачи данными алгоритмами. Подробнее это рассмотрим далее.
Выбор команд
Оценка времени работы алгоритма, основанная на предположении о равнозначности времени выполнения команд, может дать ошибку, и порой весьма значительную. К примеру, команда целочисленного умножения имеет латентностьравную 10 тактам, апропускную способностьравную 1 такту [6]. В то же время латентность и пропускная способность команды целочисленного деления для того же процессора равны 66-80 и 30 тактам соответственно [6]. Дадим определения упомянутым временным характеристикам команд процессора.
Латентность – это число тактов, необходимых для завершения одной команды с момента готовности входных данных команды (выборки их из памяти) и начала ее выполнения [5].
Пропускная способность команды – это число тактов ожидания, которое требуется процессору перед запуском на выполнение той же команды. Значение пропускной способности всегда меньше или равно по величине латентности этой команды. Причина разницы между числом тактов пропускной способности и числом тактов латентности является конвейерная обработка команд [5].
Учет латентности и пропускной способности команд может оказать существенное влияние на выбор алгоритма или на программную реализацию выбранного алгоритма, так как иногда одно и то же математическое действие можно выполнить командами с разными временными характеристиками (далее рассмотри это более подробно). К примеру, если в одном алгоритме программе необходимо выполнить 5 целочисленных умножений, а во втором алгоритме – всего лишь 1 деление, то, несмотря на кажущееся преимущество второго алгоритма, программная реализация первого алгоритма будет обладать более высоким быстродействием.