- •230100 – Информатика и вычислительная техника
- •Часть 2. Алгоритмы цифровой обработки изображений 58
- •Часть 3. Методические указания для практических и лабораторных работ 109
- •Введение
- •Часть 1. Программирование графического адаптера nvidia с использованием технологии cuda
- •Краткая история развития графических адаптеров
- •Архитектура nvidia cuda
- •Архитектура gpu-приложения
- •Основные различия между cpu и cuda-устройством
- •Различие возможностей между поколениями cuda-устройств
- •Инструментарий cuda Toolkit
- •Установка
- •Проверка правильности установки
- •Компиляция примеров
- •Прикладные программные интерфейсы cuda
- •Особенности компиляции
- •Опции компилятора nvcc
- •Профайлер
- •Отладка программ в режиме эмуляции устройства
- •Среда разработки nvidia Parallel Nsight
- •Подключаемые библиотеки
- •Библиотека cublas
- •Библиотека cufft
- •Часть 2. Алгоритмы цифровой обработки изображений
- •Видоизменение гистограммы изображения
- •Основы пространственной фильтрации
- •Сглаживающие пространственные фильтры
- •Сглаживание изображений локальным усреднением
- •Сглаживание по обратному градиенту
- •Сглаживающий сигма-фильтр
- •Сглаживание по наиболее однородным областям
- •Медианный фильтр
- •Описание метода медианной фильтрации
- •Одномерный медианный фильтр
- •Зависимость качества работы медианного фильтра от размера апертуры
- •Двумерный медианный фильтр
- •Пространственные фильтры выделения границ областей
- •Линейные методы выделения границ областей. Лапласиан
- •Нелинейные методы выделения границ областей
- •Оператор Превита
- •Частотные фильтры
- •Сглаживающий частотный фильтр
- •Частотный фильтр повышения резкости
- •Гомоморфная фильтрация
- •Морфологическая фильтрация
- •Операции математической морфологии
- •Дилатация
- •Алгебраические свойства дилатации и эрозии
- •Применение морфологической дилатации
- •Применение морфологической эрозии
- •Размыкание и замыкание
- •Применение морфологических операций размыкания и замыкания
- •Основные морфологические алгоритмы
- •Выделение границ.
- •Заполнение областей.
- •Выпуклая оболочка.
- •Утончение.
- •Утолщение.
- •Построение остова.
- •Часть 3. Методические указания для практических и лабораторных работ
- •Практическая работа №1. Введение в технологию cuda
- •Цель работы
- •Порядок выполнения работы
- •Теоретическая часть
- •Архитектура графических адаптеров nvidia.
- •Архитектура чипа g80.
- •Архитектура чипа Fermi.
- •Вычислительные способности графического процессора.
- •Среда разработки cuda.
- •Язык cuda с.
- •Модель программирования cuda.
- •Теоретическая часть Модель памяти cuda
- •Особенности глобальной памяти.
- •Особенности разделяемой памяти.
- •Теоретическая часть Программный пакет «Sarcis».
- •Команды меню.
- •Панель инструментов.
- •Механизм подключения динамических библиотек.
- •Создание внешней библиотеки
- •Пример листинга программы динамической библиотеки.
- •Медианная фильтрация
- •Варианты индивидуальных заданий
- •Выбор по дискретному критерию.
- •Выбор по среднему контрасту.
- •Выбор по среднему градиенту.
- •Выбор на основе простых статистик.
- •Параметрическая аппроксимация.
- •Моментный подход.
- •Варианты индивидуальных заданий
- •Теоретическая часть
- •Инициализация устройства.
- •Выделение памяти на gpu
- •Пересылка данных между cpu и gpu.
- •Вызов функции ядра.
- •Методические рекомендации
- •Варианты индивидуальных заданий
- •Методические рекомендации
- •Защита лабораторной работы
- •Лабораторная работа № 3. Работа с разделяемой памятью в технологии cuda
- •Цель работы
- •Порядок выполнения работы
- •Методические рекомендации
- •Методические рекомендации
- •Особенности текстурной памяти.
- •Особенности линейной текстурной памяти.
- •Защита лабораторной работы
- •Правила оформления отчета
- •Оформление титульного листа
- •Библиографический список
Модель программирования cuda.
Вычислительная архитектура CUDA основана на концепции «одна команда на множество данных» (Single Instruction Multiple Data, SIMD). Концепция SIMD подразумевает, что одна инструкция позволяет одновременно обработать множество данных. Мультипроцессор – это многоядерный SIMD-процессор, позволяющий в каждый определенный момент времени выполнять на всех своих ядрах только одну инструкцию.
Важно понимать, что использовать мощности графического процессора уместно далеко не всегда. Графический процессор предназначен для вычислений с большим параллелизмом и интенсивной арифметикой. Это объясняется тем, что у него гораздо большее число транзисторов отведено на обработку данных, а не на управление исполнением. Поэтому GPU демонстрируют хорошие результаты в параллельной обработке данных, когда с помощью одной и той же последовательности действий обрабатывается большой объем данных. Именно по этой причине всю мощь от использования CUDA можно ощутить, когда требуется выполнять одни и те же действия над огромными массивами данных.
Перечислим основные термины, используемые в технологии CUDA:
хост (host) – центральный процессор (CPU), управляющий выполнением программы;
устройство (device) – видеоадаптер (GPU), выступающий в роли сопроцессора центрального процессора;
ядро (kernel) – последовательность операций, выполняемых множество раз над разными данными. Ядро выполняется на графическом процессоре, и в любой момент может исполняться только одно ядро;
поток (нить, thread) – экземпляр ядра. Каждая нить имеет свой уникальный идентификатор. Количество одновременно исполняемых потоков может достигать несколько тысяч;
блок (block) – совокупность потоков. Внутри одного блока потоков возможна синхронизация потоков. Также все потоки внутри одного блока имеют доступ к общей разделяемой памяти, используемой в качестве кэша или для коммуникаций между потоками;
cетка (grid) – каждый блок потоков принадлежит некоторой сетке. Все блоки потоков внутри сетки представляют полную модель исполнения ядра;
варп (warp) – исполняемая единица CUDA-программы. Это количество потоков, исполняемых параллельно на одном мультипроцессоре. Размер warp составляет 32 потока.
На центральном процессоре выполняются только последовательные части алгоритма программы: подготовка и копирование данных на устройство, задание параметров для ядра и его запуск. Параллельные части алгоритма оформляются в ядра, которые выполняются на большом количестве потоков на устройстве.
Для выполнения на устройстве задача разбивается на множество потоков, которые объединяются в блоки, а блоки объединяются в сетку. Каждый поток выполняет одну и ту же последовательность процедур (ядро) для разного набора данных.
На рис. 3.4 изображен пример организации потоков. В примере потоки и блоки потоков объединены в двумерные массивы, в общем же случае потоки внутри блока могут быть объединены в одно-, двух- или трехмерный массив, а блоки потоков внутри сетки в одно- или двухмерный массив. Каждый поток имеет идентификатор внутри блока. Идентификаторы различны для разных потоков, а их значения соответствуют координатам потока внутри блока потоков и координатам блока потоков внутри сетки.
Рис. 3.4. Потоковая модель
Порядок выполнения блоков не определён, блоки должны быть не зависимыми друг от друга. При запуске ядра блоки сетки нумеруются и распределяются по мультипроцессорам, имеющим определенное количество регистров и определенный размер разделяемой памяти. Планировщик команд последовательно разбивает потоки активного блока на группы (warps). Для исполнения одной команды варпа мультипроцессор должен загрузить операнды, выполнить команду и записать результат для всех потоков группы. Если доступ к памяти вызывает задержку (до 600 циклов), то планировщик может перейти к следующему варпу. По завершении всех потоков блока ресурсы SM освобождаются, и на выполнение поступает следующий блок.
Следует отметить, что в архитектурах, поддерживающих технологию CUDA, число потоковых процессоров внутри одного мультипроцессора варьируется от 8 до 48 штук. Также в состав мультипроцессора архитектуры Fermi входит 2 планировщика задач, что позволяет выполнять одновременно два варпа. Из всего этого следует, что не весь warp исполняется одновременно, он разбивается на части, которые выполняются последовательно. Количество частей зависит от числа потоковых процессоров в составе мультипроцессора. Также стоит отметить, что для доступа к памяти используется half-warp (половина варпа), т.е. вначале к памяти обращаются первые 16 нитей, а затем вторая половина из 16 нитей.
Планировщик мультипроцессора имеет ограничения по максимальному числу одновременно запущенных блоков, максимальному числу потоков в блоке и максимальному числу варпов. Данные ограничения зависят от вычислительных возможностей (compute capability) конкретного GPU.
Для всех версий аппаратуры мультипроцессор может одновременно исполнять не более 8 блоков потоков. Это связано с тем, что регистры мультипроцессора делятся между всеми потоками всех блоков, одновременно исполняемых этим мультипроцессором. Количество регистров, необходимых одному потоку, определяется на этапе компиляции, а количество регистров мультипроцессора зависит от архитектуры графического процессора. Таким же образом разделяемая память распределяется между одновременно исполняемыми блоками. Объем разделяемой памяти, необходимый одному блоку потоков, определяется на этапе компиляции или при вызове ядра.
Отчет по практической работе
Отчет по практической работе должен соответствовать порядку выполнения работы и содержать конспект изученного материала, данные о вычислительных возможностях видеокарты учебного компьютера:
Количество CUDA-ядер.
Максимальное количество потоков в блоке.
Количество активных потоков на мультипроцессоре.
Максимальную размерность блока.
Максимальную размерность сетки.
Практическая работа №2. Работа с памятью в технологии CUDA
Цель работы
Целью работы является ознакомление с моделью памяти в технологии CUDA и изучение механизма оптимизации приложений с использованием глобальной и разделяемой памяти.
Порядок выполнения работы
Изучить сравнительные характеристики разных типов памяти, выделяемых в CUDA.
Выяснить вычислительные возможности установленной в системе видеокарты:
объем глобальной памяти;
объем разделяемой памяти;
максимальную размерность текстуры (x,y,z);
КЭШ текстурной памяти на мультипроцессор.
Изучить особенности глобальной памяти. Обратить внимание на два способа оптимизации в работе с глобальной памятью.
Разобраться с особенностями разделяемой памяти.
