- •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
- •Цель работы
- •Порядок выполнения работы
- •Методические рекомендации
- •Методические рекомендации
- •Особенности текстурной памяти.
- •Особенности линейной текстурной памяти.
- •Защита лабораторной работы
- •Правила оформления отчета
- •Оформление титульного листа
- •Библиографический список
Отладка программ в режиме эмуляции устройства
Для ОС Linux предусмотрен специальный отладчик CUDA-GDB, который является расширением стандартного отладчика GDB (GNU Project Debugger) версии 6.6 для платформы i386/AMD64. Он разработан для предоставления разработчику гетерогенной среды отладки, поддерживающей как хостовый код, так и CUDA-код.
Кроме того, компилятор и интерфейс времени выполнения поддерживают режим эмуляции CUDA-устройства, предназначенный для отладки, который может быть использован даже при отсутствии CUDA-совместимого устройства. При компиляции программы в этом режиме (с опцией “–deviceemu”) код CUDA-функций будет скомпилирован для запуска на хосте, позволяя задействовать стандартные инструменты отладки, как в программе, изначально предназначеной для выполнения на хосте. В коде этот режим можно обнаруживать по наличию макроса __DEVICE_EMULATION__.
Существует ограничение: весь код приложения, включая используемые библиотеки, должен быть скомпилирован только в одном из двух режимов: с выполнением на CUDA-устройствах или с их эмуляцией. В противном случае, линковка двух модулей, скомпилированных в обоих режимах, приведет к возникновению ошибки времени выполнения при инициализации: cudaErrorMixedDeviceExecution.
При запуске программы в режиме эмуляции интерфейс времени выполнения будет эмулировать программную модель CUDA. Для каждого потока из связки потоков будет создан отдельный поток на хосте. При этом программист должен убедиться в наличии необходимых ресурсов:
возможность хоста запускать максимальное число потоков из одной связки плюс еще один для управляющего потока;
достаточный объем свободной памяти (каждый поток получает 256 КБ стека).
В режиме эмуляции предоставляется множество возможностей, что делает его очень эффективным инструментом для отладки. Использование стандартного отладчика дает доступ ко всем его возможностям, таким как установка точек останова (breakpoints) и инспекция данных. В код CUDA-функции можно добавлять участки, не способные выполняться на CUDA-устройстве, такие как операции ввода/вывода для диска и экрана – printf() и т.п. Так как все данные размещаются в памяти хоста, то возможны любые перекрестные вызовы функций и доступ к данным, к примеру, из функций хоста возможен доступ к данным, предназначенным для устройства. В случае некорректного использования встроенной функции барьерной синхронизации среда выполнения регистрирует ситуацию взаимной блокировки (dead lock).
Программисты должны помнить, что режим эмуляции CUDA-устройства не учитывает детали аппаратной реализации. Поэтому его эффективно использовать при нахождении алгоритмических ошибок, но обнаружение ошибок другого типа может быть затруднено. Состояния гонки (race conditions) намного реже проявляются в режиме эмуляции, так как одновременно выполняется меньшее число потоков.
При разыменовании указателя на глобальную память CUDA-устройства, выполняемую на хосте, или указателя на память хоста, выполняемую на CUDA-устройстве, программа в режиме эмуляции приведет к правильному результату, однако выполнение на CUDA-устройстве может вызвать непредсказуемые последствия.
В большинстве случаев одинаковые операции плавающей арифметики дадут отличающиеся результаты на реальном и эмулируемом CUDA-устройстве. Этого следует ожидать и в общем случае, так как результат выполнения этих операций зависит от компилятора, его опций, наборов инструкций и аппаратных архитектур. В частности, некоторые платформы сохраняют промежуточные результаты вычислений с плавающей арифметикой одинарной точности в регистрах с расширенной точностью, что потенциально может привести к значимым различиям точности при использовании режима эмуляции. В этом случае программист может попробовать применить один из следующих приемов:
объявить некоторые переменные плавающей арифметики с ключевым словом volatile для принудительного хранения в формате одинарной точности;
в компиляторе gcc использовать опцию “-ffloat-store”;
в компиляторе Visual C++ использовать опции “/Op” или “/fp”;
CUDA-устройства с вычислительной способностью 1.x не поддерживают денормализованные числа (см. раздел “Appendix G” руководства “CUDA Programming Guide”) для плавающей арифметики одинарной точности, в отличие от типичных хостов. В этом случае на одном CUDA-устройстве операции могут привести к бесконечному результату, а на другом – к конечному. В режиме эмуляции размер варпа равен единице. Следовательно, функции для голосования в варпах дадут отличающиеся результаты. Начиная с версии инструментария CUDA Toolkit 3.0, компания NVIDIA прекратила развитие режима эмуляции в пользу специального инструмента NVIDIA Parallel Nsight.
