- •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
- •Порядок выполнения работы
- •Методические рекомендации
- •Методические рекомендации
- •Особенности текстурной памяти.
- •Особенности линейной текстурной памяти.
- •Защита лабораторной работы
- •Правила оформления отчета
- •Оформление титульного листа
- •Библиографический список
Особенности глобальной памяти.
Как уже было отмечено, глобальная память – это основная память на GPU. Она является основным местом для размещения и хранения большого объема данных для обработки ядрами. Глобальная является самой медленной из всех типов памяти (она плохо работает с обращениями по случайному адресу, не имеет кэша, т.е. каждый раз данные надо считывать заново).
Переменные, объявленные спецификатором _global_, размещаются в глобальной памяти. Память также можно выделить динамически, вызвав функцию cudaMalloc на хосте. Из устройства эту функцию вызывать нельзя, так как распределением памяти должна заниматься программа, работающая на CPU. Данные с хоста можно отправлять в устройство вызовом функции cudaMemcpy.
Можно выделить два способа оптимизации в работе с глобальной памятью: выравнивание размеров используемых типов и использование объединенных запросов.
Выравнивание типа данных позволяет скомпилировать запрос в глобальную память в одну команду GPU, в противном случае компилятор сгенерирует дополнительный код, что может значительно понизить производительность. Для оптимальной производительности тип данных должен иметь размерность 4, 8 или 16 байт.
Если размер типа не соответствует 4, 8 или 16 байтам, то лучше использовать тип большей размерности или произвести выравнивание с помощью ключевого слова _align_(размер выравнивания).
Пример оптимизации при использовании встроенных CUDA-типов.
Размер типа int3 – 12 байт, доступ к памяти будет неоптимальным:
__device__ int3 data[512];
__global__ void initData()
{
int idx = threadIdx.x
data[idx] = make_int3(idx, idx, idx);
};
Лучше использовать тип int4 (16 байт), даже если четвертый компонент вам не нужен:
__device__ int4 data[512];
__global__ void initData()
{
int idx = threadIdx.x
data[idx] = make_int4(idx, idx, idx, 0);
};
В случае работы со структурами необходимо использовать ключевое слово __align__, которое позволяет выравнивать тип по заданному размеру.
Пример выравнивания размера структуры.
До выравнивания размер структуры vector3 составит 12 байт:
struct vector3
{
float x;
float y;
float z;
};
int main()
{
printf("%i\n", sizeof(vector3));
return 0;
};
На консоль выведется число 12.
После выравнивания размер vector3 составит 16 байт:
struct __align__(16) vector3
{
float x;
float y;
float z;
};
int main()
{
printf("%i\n", sizeof(vector3));
return 0;
};
На консоль выведется число 16.
Обращение к глобальной памяти осуществляется одновременно из половины варпа (16 потоков). Также существуют особые принципы доступа, позволяющие значительно ускорить работу с глобальной памятью. Графический процессор имеет возможность объединять запросы в блоки по 32, 64 и 128 байт (coalescing global memory accesses). Максимальное объединение – это когда все запросы одной полвины варпа удается объединить в один большой запрос (транзакцию) на чтение непрерывного блока памяти. Возможности объединения запросов различаются в зависимости от вычислительных возможностей конкретного GPU. Условия возникновения объединенного запроса к глобальной памяти в зависимости от версии аппаратной архитектуры графического адаптера приведены в табл. 3.5.
Таблица 3. 5.
Условия возникновения объединенного запроса
Сompute Сapability 1.0, 1.1 |
Сompute Сapability 1.2 и выше |
Нити обращаются:
Все 16 слов лежат в пределах блока, k-ая нить обращается к k-му слову блока |
Нити обращаются:
Получающийся сегмент выровнен по своему размеру |
