Слайд 1Вычисления на GPU
с использованием NVIDIA CUDA
Автор: студент 2-ПМИ МАГУ
Леутин
Александр
Слайд 2Немного истории
С самого появления GPU у разработчиков появилась идея перекладывать
часть расчетов с CPU на GPU, но архитектура не позволяла
это делать. Почти. Разработчикам удавалось выкрутиться и заставить GPU выполнять нужные инструкции, но зачастую это того не стоило.
Слайд 3Краткое введение в технологию
Технология CUDA — это программно-аппаратная вычислительная архитектура
Nvidia, основанная на расширении языка Си, которая даёт возможность организации
доступа к набору инструкций графического ускорителя и управления его памятью при организации параллельных вычислений.
Слайд 4Основные возможности технологии
Унифицированное программно-аппаратное решение для параллельных вычислений на видеочипах
Nvidia;
Стандартный язык программирования Си;
Стандартные библиотеки численного анализа FFT (быстрое преобразование
Фурье) и BLAS (линейная алгебра);
Оптимизированный обмен данными между CPU и GPU;
Взаимодействие с графическими API OpenGL и DirectX;
Возможность разработки на низком уровне.
Слайд 5Основные сферы применения
Симуляция поведения различных тел
Обработка графики
Расчет геометрии
Вычисление различных
хэшей
Компьютерное зрение
Искусственный интеллект
Слайд 6Техническая реализация
Для вызова функции на стороне GPU нужно:
Выделить память под
аргументы
Скопировать данные с хоста в блок памяти GPU.
Произвести вызов функции
(будет рассмотрено далее)
Освободить память после выполнения
Слайд 7Работа с памятью
Работа с памятью организована при помощи функций
cudaMalloc –
выделение блока памяти
cudaMalloc3D – выделение блока под трехмерный массив (width*height*depth)
cudaMalloc3DArray
– аналогично cudaMalloc3D, но для массива таких объектов
cudaMallocArray – выделение массива блоков
cudaMallocPitch – выделение памяти под массивы*
cudaFree – освободить блок памяти
Слайд 8Чуть подробнее про cudaMallocPitch
Данная функция не только выделяет память под
данные, но и гарантирует сохранение следующего соотношения
Что в итоге позволяет
нам спокойно ориентироваться в памяти, зная базовый адрес, строку и значение pitch (которое получаем после cudaMallocPitch)
Слайд 9Исполнение инструкций
Вызов функции, на стороне GPU идет немного необычно
Так же
функция должна иметь модификатор __global__
Слайд 10Плюсы технологии
Быстрые вычисления
Хорошая архитектура для многопоточности
Удобный инструментарий и отсутствие лишних
телодвижений при передаче инструкций (за исключением чутка странного вызова __global__
функций)
Удобная работа с памятью
Поддержка основных платформ
Слайд 11Минусы технологии
Передача данных от CPU к GPU достаточно дорогая операция.
Иногда это заставляет передавать лишние данные.
Проприетарная архитектура CUDA.
Устаревшая поддержка
Visual Studio 2012, но кому это нужно, когда есть он
Слайд 12Примеры
Построение множества Мондельброта