- •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
- •Порядок выполнения работы
- •Методические рекомендации
- •Методические рекомендации
- •Особенности текстурной памяти.
- •Особенности линейной текстурной памяти.
- •Защита лабораторной работы
- •Правила оформления отчета
- •Оформление титульного листа
- •Библиографический список
Опции компилятора nvcc
Nvcc – инструмент для управления всеми этапами компиляции, называемый также драйвером компиляции (CUDA compiler driver). Компиляция при помощи nvcc происходит в несколько этапов. Выбор фаз компиляции производится на основе опций, передаваемых через командную строку и расширений входных файлов, причем на выполнение этих фаз можно влиять при помощи других опций командной строки.
В процессе своей работы nvcc вызывает следующие инструменты:
CUDAFE (CUDA Language Front End);
NVOPENCC (CUDA Open64 Compiler);
PTXAS (PTX Optimizing Assembler);
Хостовые компилятор и линковщик (Microsoft Visual C++ для ОС Windows или gcc для ОС Linux).
Компилятор поддерживает следующие расширения файлов:
.cu – исходные файлы CUDA, содержащие код для хоста и для устройств;
.cup – исходные файлы CUDA после предварительной обработки (preprocessed);
.cc, .cxx, .cpp – исходные файлы C++;
.gpu – промежуточный файл для GPU;
.ptx – файл с промежуточным ассемблерным PTX-кодом;
.o, .obj – объектный файл;
.a, .lib – библиотечный файл;
.res – файл с ресурсами;
.so – разделяемый объектный файл.
Nvcc не различает объектные, библиотечные и ресурсные файлы, а сразу пропускает их к линковщику на соответствующей фазе. В отличие от gcc, nvcc при получении на входе файла с незнакомым расширением (т.е. не перечисленном выше) генерирует ошибку.
Nvcc различает 3 варианта опций командной строки: булевы (флаги) – без аргументов, опции с одним аргументом и опции с несколькими аргументами (списки). Аргументы отделяются от названия опции символом равенства либо одним или более пробелами. В некоторых случаях совместимости с компилятором gcc (опции –I, -l, -L) аргумент может не отделяться от названия опции. Несколько аргументов одной опции могут разделяться запятыми, допускается повтор таких опций, возможна также комбинация этих двух вариантов.
Каждая опция имеет длинное и сокращенное имена (см.таб. 1.1 – таб.1.8), которые отличаются количеством дефисов: два для длинного имени и один для короткого. Длинные имена, как правило, используются в сценариях автоматической компиляции, где длина менее важна, чем ценность описания.
Таблица 1.1.
Опции, определяющие фазу компиляции
Длинное имя |
Короткое имя |
Описание |
1 |
2 |
3 |
--cuda |
-cuda |
Компиляция .cu → .cu.c/.cu.cpp
|
--cubin |
-cubin |
Компиляция .cu/.gpu/.ptx → .cubin. Хостовый код отбрасывается. |
--ptc |
-ptx |
Компиляция .cu/.gpu → .ptx. Хостовый код отбрасывается. |
--gpu |
-gpu |
Компиляция .cu → .gpu Хостовый код отбрасывается. |
--preprocess |
-E |
Предварительная обработка .c/.cc/.cpp/.cxx/.cu.
|
1 |
2 |
3 |
||
--generate-dependencies |
-M |
Генерация для одного .c/.cc/.cpp/.cxx/.cu файла зависимостей, который может быть включен в make-файл. |
||
--compile |
-c |
Компиляция .c/.cc/.cpp/.cxx/.cu → .obj
|
||
--link |
-link |
Поведение по умолчанию: компиляция и линковка всех файлов. |
||
--lib |
-lib |
Компиляция всех входных файлов в объектные и объединение результатов в один библиотечный файл. |
||
--run |
-run |
Компиляция, линковка и запуск. Путь к необходимым динамическим библиотекам CUDA берется из файла nvcc.profile. |
||
Таблица 1.2.
Опции, указывающие файлы и пути к файлам
Длинное имя |
Короткое имя |
Описание |
--output-file <file> |
-o |
Выходной файл. Более одного аргумента допускается только в режиме линковки/архивации. |
--pre-incude <file>, … |
-include |
Заголовочные файлы. |
--library <file>, … |
-l |
Библиотечные файлы. Путь для их поиска указывается опцией '-L'. |
--define-macro <def>, … |
-D |
Определение макросов. |
--undefine-macro <def>, … |
-U |
Отмена уже определенных макросов. |
--include-path <path>, … |
-I |
Пути поиска заголовочных файлов. |
--system-include <path>, … |
-isystem |
Пути поиска системных заголовочных файлов. |
--library-path <path>, … |
-L |
Пути поиска библиотечных файлов. |
--output-directory <dir> |
-odir |
Путь для сохранения выходного файла. Полезна для генерации зависимостей через ‘--generate-dependencies’. |
--compiler-bindir <dir> |
-ccbin |
Путь к хостовому компилятору: Microsoft Visual Studio cl или gcc. |
Таблица 1.3.
Опции для изменения поведения компилятора/линковщика
Длинное имя |
Короткое имя |
Описание |
|
||
--profile |
-pg |
Инструментирование кода для профилировщика gprof (только в ОС Linux). |
|
||
--debug <level> |
-g |
Генерация отлаживаемого кода. |
|
||
--device-debug |
-G |
Генерация отлаживаемого кода устройства. |
|||
--optimize <level> |
-O |
Генерация оптимизированного кода. |
|||
--shared |
-shared |
Генерация разделяемой библиотеки во время линковки. Если требуются другие опции линковщика, используйте опцию ‘-Xlinker’. |
|||
--machine |
-m |
Выбор 32-битной или 64-битной архитектуры. |
|||
Таблица 1.4.
Опции, управляющие вызываемыми nvcc инструментами
Длинное имя |
Короткое имя |
Описание |
--compiler-options <opts>,… |
-Xcompiler |
Передача опций компилятору/препроцессору. |
--linker-options <opts>, … |
-Xlinker |
Передача опций линковщику. |
--cudafe-options <opts>, … |
-Xcudafe |
Передача опций cudafe. |
--opencc-options <opts>, … |
-Xopencc |
Передача опций nvopencc, обычно для управления оптимизацией. К примеру, ‘‑LIST:source=on’ приводит к включению в ptx-код комментариев с исходным кодом. |
--ptxas-options <opts>, … |
-Xptxas |
Передача опций оптимизирующему PTX-ассемблеру. К примеру, ‘-v’ приводит к выводу статистики генерации кода. |
Таблица 1.5.
Опции, управляющие поведением nvcc
Длинное имя |
Короткое имя |
Описание |
--dryrun |
-dryrun |
Перечислить команды компиляции, генерируемые nvcc, вместо их выполнения. |
--verbose |
-v |
Перечислить команды компиляции, генерируемые nvcc, вместе с выполнением. |
--keep |
-keep |
Сохранить все промежуточные файлы. |
--save-temps |
-save-temps |
То же, что и '—keep'. |
--dont-use-profile |
-noprof |
Не использовать файл настроек nvcc.profile. |
--clean-targets |
-clean |
Вместо каждой фазы компиляции удалить файлы, которые бы остались после нее. |
--run-args <arg>, … |
-run-args |
Используется вместе с опцией '-R’ для передачи аргументов исполняемому файлу. |
--input-drive-prefix <prefix> |
-idp |
В ОС Windows: сконвертировать все аргументы, включающие имена файлов, в родной формат Windows. Это относится к представлению абсолютных путей к файлам в ‘текущей’ среде разработки. |
--dependency-drive-prefix <prefix> |
-ddp |
В ОС Windows: при генерации файлов с зависимостями (опция '-M') все имена файлов конвертируются в такие, которые поддерживаются используемой утилитой make. К примеру, некоторые варианты make не поддерживают символ двоеточия. |
--drive-prefix <prefix> |
-dp |
Задает префикс логического диска для обеих опций: input-drive-prefix и dependency-drive-prefix. |
Таблица 1.6.
Опции, управляющие компиляцией CUDA
Длинное имя |
Короткое имя |
Описание |
1 |
2 |
3 |
--device-emulation |
-deviceemu |
Сгенерировать код для библиотеки эмуляции GPGPU. В релизе CUDA 3.0 режим эмуляции стал считаться устаревшим. |
--use_fast_math |
-use_fast_math |
Использование библиотеки быстрой арифметики. |
1 |
2 |
3 |
--ftz <boolean> |
-ftz |
Управление денормализацией чисел с одинарной точностью (false – поддержка денормализованных чисел, true –обнуление). |
--prec-div <boolean> |
-prec-div |
Управление точностью 32-битного деления (true – для соответствия стандарту IEEE, false – использование аппроксимации). |
--prec-sqrt <boolean> |
-prec-sqrt |
Управление точностью 32-битного квадрат-ного корня (true – для соответствия стандарту IEEE, false – использование аппроксимации). |
--entries <entry>, … |
-e |
В случае компиляции .ptx/.gpu → .cubin: определить функции, являющиеся глобальными точками входа, для которых будет сгенерирован код. По умолчанию код генерируется для всех. |
Таблица 1.7.
Опции, управляющие генерацией GPU-кода
Длинное имя |
Короткое имя |
Описание |
1 |
2 |
3 |
--gpu-architecture <gpuarch> |
-arch |
Задает архитектуру GPU – реальную или виртуальную (PTX) – для всех этапов компиляции вплоть до генерации PTX-кода. Поддерживаются виртуальные архитектуры: compute_10, compute_11, compute_12, compute_13; и реальные: sm_10, sm_11, sm_12, sm_13, которые их реализуют. |
--gpu-code <gpuarch>, … |
-code |
Влияет на генерацию бинарного кода, который задействуется только в случае его совместимости с используемым GPU иначе происходит компиляция встроенного PTX-кода. Указанная архитектура должна быть совместима с указанной в опции ‘-arch’. Если опция ‘-arch’ указана, то здесь должна быть выбрана виртуальная PTX архитектура. Если опция ‘-code’ не указана, то берется значение из опции '-arch'. |
1 |
2 |
3 |
|
--generate-code ’‑arch=<arch> ‑code=<code>, …’ |
-gencode |
Позволяет многократно вызывать компилятор nvopencc, генерируя код для нескольких виртуальных архитектур. Аргументы 'arch' и 'code' соответствуют двум предыдущим опциям. |
|
--extern-mode <all|none|real|virtual> |
-ext |
Определяет, какие образы кода будут скопированы в директорию, указанную в опции 'export-dir'. Если эта опция и 'intern-mode' не указаны, то все образы кода будут считаться внутренними. |
|
--export-dir <file> |
-dir |
Указывает директорию или zip-файл, в которые будут скопированы все сгенерированные образы кода. Этот файл будет играть роль репозитория кода, инспектируемого драйвером CUDA во время выполнения программы. В обоих случаях nvcc сохранит структуру директорий для помощи драйверу CUDA при поиске. Если эта опция не указана, то все внешние образы будут отброшены. Если указано имя несуществующего файла, то будет создана директория с таким именем. |
|
--intern-mode <all|none|real|virtual> |
-int |
Определяет, какие образы кода будут встроены в выходной (например, исполняемый) файл. Если эта опция и 'extern-mode' не указаны, то все образы кода будут считаться внутренними. |
|
--maxrregcount <amount> |
-maxrregcount |
Определяет максимальное число регистров, которые может использовать один поток GPU. Из-за ограниченных ресурсов мультипроцессора GPU слишком большое значение приведет к ограничению на колличество потоков в связке. Однако при недостаточно большом для какого-то вычислительного ядра значении его производительность будет ниже, в том числе за счет использования вместо регистров медленной локальной памяти GPU. Указанное значение округляется в верхнюю сторону до кратного четырем, вплоть до максимума в 128 регистров. Если опция не указана, то ограничение не применяется (только физические ограничения). |
|
Таблица 1.8.
Список общих опций
Длинное имя |
Короткое имя |
Описание |
--help |
-h |
Вывод справочной информации. |
--version |
-v |
Вывод версии nvcc. |
--options-file <file>, … |
-optf |
Использовать опции, сохраненные в указанном файле. |
В среде разработки Microsoft Visual Studio опции компилятора nvcc доступны для каждого файла с расширением .cu.(рис. 1.4).
Рис. 1.4. Настройка файла в проекте для компиляции платформой CUDA
Проверить список опций можно в подразделе “Command Line” раздела “CUDA Build Rule”.
