- •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
- •Порядок выполнения работы
- •Методические рекомендации
- •Методические рекомендации
- •Особенности текстурной памяти.
- •Особенности линейной текстурной памяти.
- •Защита лабораторной работы
- •Правила оформления отчета
- •Оформление титульного листа
- •Библиографический список
Вычислительные способности графического процессора.
С каждым новым поколением процессоров NVIDIA в них реализуются дополнительные возможности, доступные программисту через CUDA. Для описания возможностей аппаратной части используется понятие compute capability (вычислительная способность).
Вычислительная способность отражает набор инструкций, поддерживаемый устройством, вместе со спецификациями, такими как максимальное число потоков или число регистров мультипроцессора. В данный момент обеспечивается полная обратная совместимость, так что вычислительная способность большей версии (более новые) включает в себя все возможности вычислительной способности меньшей версии (табл.3.2).
Таблица 3.2.
Вычислительные способности различных процессоров
Сompute Сapability (версия) |
Графические процессоры |
1.0 |
G80 |
1.1 |
G86, G84, G98, G98b, G94, G94b, G92, G92b |
1.2 |
GT218, GT216, GT215 |
1.3 |
GT200, GT200b |
2.0 |
GF100, GF110 |
2.1 |
GF108, GF106, GF104, GF114, GF116 |
Среда разработки cuda.
CUDA включает два API: высокого уровня (CUDA Runtime API) и низкого (CUDA Driver API). В одной программе одновременное использование обоих невозможно, нужно использовать или один, или другой. В API высокого уровня (рис. 3.3) все вызовы runtime транслируются в простые инструкции, обрабатываемые низкоуровневым Driver API. Но даже высокоуровневый API предполагает знание основ об устройстве и работе видеокарт NVIDIA. Практически все функции из обоих API возвращают значение t_cudaError, которое принимает значение cudaSuccess в случае успеха.
В данном лабораторном практикуме изучается API высокого уровня, т.е. Runtime API.
Рис. 3.3. Состав CUDA API
В состав CUDA входят две библиотеки:
CUBLAS — CUDA-вариант BLAS (Basic Linear Algebra Subprograms), предназначенный для вычислений задач линейной алгебры и использующий прямой доступ к ресурсам GPU;
CUFFT — CUDA- вариант библиотеки Fast Fourier Transform для расчёта быстрого преобразования Фурье, широко используемого при обработке сигналов. Поддерживаются следующие типы преобразований: complex-complex (C2C), real-complex (R2C) и complex-real (C2R).
Описание библиотек см. на стр. 52 данного пособия.
Язык cuda с.
Для реализации программы под GPU компания NVIDIA выпустила свои расширения для языка С, компилятор nvcc для сборки таких программ, ввела в обиход новое расширение *.cu для файлов, которые содержат CUDA-функции. К расширениям языка Си относятся:
cпецификаторы функций,
cпецификаторы переменных,
новые типы данных,
cпецификаторы запуска ядра GPU,
встроенные переменные.
Спецификаторы функций показывают, где они будут выполняться. Всего в CUDA три спецификатора:
_host_ – выполняется на CPU, вызывается с CPU.
_global_ – выполняется на GPU, вызывается с CPU.
_device_ – выполняется на GPU, вызывается с GPU.
Существуют дополнительные ограничения на выполняемые на видеокарте функции:
нельзя брать адрес от функции (за исключением _global_);
нет поддержки рекурсии;
внутри функций нельзя применять спецификатор static к переменным;
не поддерживается переменное число аргументов в функциях.
Спецификаторы переменных, которые служат для указания типа используемой памяти GPU, приведены в таблице 3.3.
Таблица 3. 3.
Спецификаторы переменных в CUDA
Спецификатор |
Находится в |
Доступна для |
Вид доступа |
_device_ |
устройстве |
устройства |
только чтение |
_constant_ |
устройстве |
устройства и хоста |
чтение/запись |
_shared_ |
устройстве |
блока потоков |
чтение/запись |
На их использование также накладывается ряд ограничений:
спецификатор _device_ является аналогом const на центральном процессоре.
спецификатор _shared_ применяется для задания разделяемой памяти и не может быть инициализирован при объявлении. Он требует явной синхронизации потоков внутри одного блока после любой операции с такой памятью.
запись в _constant_ память осуществляется только через специальные функции с CPU.
Никакие спецификаторы нельзя применять к полям структур.
В CUDA добавлено несколько векторных типов для удобства копирования и доступа к данным. Типы char, int, short, long, float могут быть 1- ,2- ,3- или 4-мерными векторами, а longlong и double - только 1- или 2-мерными. Для создания переменных таких типов требуется применять функции вида
make_(тип)(размерность);
Также существует специальный тип dim3, основанный на типе uint3, имеющий нормальный конструктор. Этот конструктор позволяет задавать не все компоненты вектора (недостающие компоненты инициализируются единицами).
Каждый вызов _global_ функции должен соответсвовать спецификации вызова. Спецификация определяет размерность сетки и блоков, которые будут использоваться для выполнения этой функции на устройстве. Вызов должен соответсвовать форме
func<<< Dg, Db, Ns, S >>>(arguments);
Здесь func – это имя соотвецтвующей функции. Переменная Dg имеет тип dim3 и определяет размерность сетки; так произведение Dg.x * Dg.y равно числу блоков. Тип dim3 трехмерный, но координата Dg.z обычно не используется.
Переменная Db также имеет тип dim3 и задает размерность и размер каждого блока. Произведение Db.x * Db.y * Db.z равно числу потоков в блоке.
Параметр Ns имеет тип size_t и определяет число байтов в разделяемой памяти, которая должна быть динамически выделена каждому блоку. Ns – необязательный параметр и по умолчанию равен 0.
Переменная S типа cudaStream_t задает поток (streams), в котором должен произойти вызов, по умолчанию используется поток 0.
В CUDA несколько особых переменных существуют внутри каждого вычислительного ядра и позволяют отличать один поток от другого.
dim3 gridDim – содержит в себе информацию о конфигурации сетки.
uint3 blockIdx – координаты текущего блока внутри сетки.
dim3 blockDim – размерность блока при запуске ядра.
uint3 threadIdx – координаты текущего потока внутри блока.
