Лабораторная работа №1 "Освоение программного обеспечения среды программирования nVidia»

advertisement
Московский авиационный институт
(национальный исследовательский университет)
"МАИ"
Лабораторная работа №1
"Освоение программного обеспечения среды
программирования nVidia»
Выполнил студент
группы 08-408
Алексенко Екатерина
Руководитель: Семенов С.А.
1
Москва, 2011
Содержание
Программа cчитает и выводит на экран результаты с использованием CUDA.
Постановка задачи
Программа должна содержать:
1. параллельные вычисления
2. распределение памяти
3. векторные операции
Вариант: сортировка массива 108 элементов.
Описание
Для ускорения процесса обработки данных, производится расчет с использованием GPU.
Данные находятся в оперативной памяти в виде массива. Выделяется область в памяти
графического устройства подходящего размера. Массив данных копируется в нее и
обрабатывается графическим процессором, причем параллельно. Затем данные
переносятся обратно в оперативную память для дальнейших действий – вывода на экран.
После работы память, выделенная на графическом устройстве, освобождается.
Программа сортирует массив чисел с плавающей запятой, заполненный случайными
данными, и замеряет время выполнения операции сортировки. Также программа
выводит 100 последних чисел отсортированного массива, для визуальной проверки
правильности сортировки.
Алгоритм
Для реализации сортировки была выбрана сторонняя библиотека CUDPP. Она входила в
CUDA SDK до версии 3.2. Данная библиотека реализует поразрядную сортировку для
типов данных unsigned int и float (поддерживается также сортировка пар «ключзначение»).
Учитывая особенности архитектуры GPU, можно уверенно утверждать, что стандартные
алгоритмы последовательной сортировки будут в данном случае малоэффективны.
Традиционно на GPU реализуют алгоритмы поразрядной и битонической сортировки, так
как они ориентированы на параллельные вычисления. Существуют также реализации
параллельной быстрой сортировки.
//Инициализация сортировки
config.datatype = CUDPP_FLOAT; //Тип данных — числа с плавающей запятой
2
config.op = CUDPP_ADD; //Оператор — сложение
config.options = CUDPP_OPTION_KEYS_ONLY; // Сортировка массива из одних ключей
config.algorithm = CUDPP_SORT_RADIX; //Алгоритм — поразрядная сортировка
result = cudppPlan(&plan, config, N, 1, 0); //Создание плана
//Сортировка
result = cudppSort(plan, arrDevIn, NULL, sizeof(float)*8, N);
//Параметры: план, указатель на массив в памяти GPU, пустой указатель, т. к. сортируются
3
//только ключи, размер ключа в битах, число элементов массива
Результаты
Для массива 1 000 000
Для массива 100 000 000
3
Сравнение с CPU
Программа написана под CUDA 4.0, не поддерживающей режим эмуляции. Для
сравнения, на CPU была выполнена стандартная быстрая сортировка qsort(). Следует
отметить, что сортировка выполнялась в один поток, хотя CPU обладает четырьмя ядрами.
Для массива 1 000 000
Для массива 100 000 000
4
Выводы
Особенности архитектуры графических процессоров позволяют эффективно использовать
их для решения задач с большим количеством параллельных вычислений. Современные
CPU позволяют на аппаратном уровне запускать параллельно 2-8 потоков, тогда как для
GPU это число достигает 512.
CUDA SDK позволяет реализовывать на языке, напоминающем Си, алгоритмы,
выполнимые на процессорах NVidia, причем организация памяти и параллельных
вычислений остается на откуп программиста.
Задача сортировки массива обычно рассматривается как последовательная, но
существуют различные алгоритмы с возможностью распараллеливания — поразрядная
сортировка, битоническая сортировка, быстрая сортировка Хоара, причем структура
битонической сортировки изначально заточена под систему с многочисленными
потоками. При верном подборе алгоритма, использование GPU дает существенный
прирост производительности.
Для CUDA разрабатывается достаточно большое количество различных сторонних
библиотек, обычно открытых (в отличие от собственно CUDA). Многие алгоритмы
реализованы в них эффективно и удобно для применения (например, поразрядная
сортировка из CUDPP значительно быстрее, чем поразрядная сортировка из примеров
SDK). К недостаткам этих библиотек стоит отнести слабую документированность,
отсутствие обратной совместимости между версиями, полную зависимость дальнейшей
разработки от энтузиазма разработчиков. Следует также заметить, что сообщество
программистов, работающих с CUDA, пока недостаточно велико, что усложняет поиск
необходимой информации.
5
Download