Lopatin Aleksandr Gennadievich, candidate of technical sciences, docent, a_lopatin@mail. ru, Russia, Novomoskovsk, Novomoskovsk affiliate branch of D.I. Mendeleyev University of Chemical Technology of Russia,
Brykov Bogdan Aleksandrovich, assistant, brybogdan@yandex. ru, Russia, Novomoskovsk, Novomoskovsk affiliate branch of D.I. Mendeleyev University of Chemical Technology of Russia,
Stekolnikov Aleksandr Urievich, candidate of technical sciences, docent, AStekolnikov@nirhtu. ru, Russia, Novomoskovsk, Novomoskovsk affiliate branch of D.I. Mendeleyev University of Chemical Technology of Russia
УДК 004.42
ПРИМЕНЕНИЕ GPU ДЛЯ РЕШЕНИЯ ЗАДАЧИ ПОИСКА ВЫПУКЛОЙ ОБОЛОЧКИ
НА ПЛОСКОСТИ
Ю.С. Белов, Д.Е. Петухов, С.С. Гришунов
В данной статье рассматривается платформа для параллельных вычислений на GPU CUDA от компании NVIDIA. Проводится обзор алгоритмов поиска выпуклой оболочки на плоскости и обосновывается выбор алгоритма быстрой оболочки для реализации параллельной версии. Приводятся основные инструкции реализованного средствами CUDA модифицированного для распараллеливания на GPU алгоритма быстрой оболочки. Описывается эксперимент по определению эффективности разработанного алгоритма и приводятся его результаты. Проводится анализ полученных результатов.
Ключевые слова: параллельные вычисления, GPU, CUDA, выпуклая оболочка, алгоритм быстрой оболочки.
Введение. В век цифровых технологий потребность в вычислительных мощностях растет с большой скоростью. В тоже время из-за технологических причин рост тактовой частоты центральных процессоров (CPU) стал уже практически невозможен. Именно поэтому в настоящее время производители увеличивают число процессоров и ядер, а не частоту одного процессора. Это требует значительной переработки архитектур CPU общего назначения. Альтернативным решение является организация математических расчетов на графических процессорах (GPU), архитектуры которых изначально разрабатывались для параллельных вычислений (над массивом точек или векторов) [1].
Развитие программирования общего назначения на GPU (General Programming on GPU, GPGPU) привело к возникновению технологий, нацеленных на более широкий круг задач, чем растеризация. В результате компанией Nvidia была создана технология Compute Unified Device Architecture (или сокращенно CUDA).
CUDA. Это платформа параллельных вычислений и модель программирования, разработанная Nvidia для общих вычислений на графических процессорах, разработанных компанией.
Платформа CUDA предназначена для работы с такими языками программирования, как C, C ++ и Fortran. Такая доступность облегчает специалистам по параллельному программированию использование ресурсов графического процессора в отличие от предыдущих API, таких как Direct3D и OpenGL, которые требовали дополнительных навыков в графическом программировании. Кроме того, CUDA поддерживает фреймворки программирования, такие как OpenACC и OpenCL. Данная платформа широко применяется для проведения вычислений при решении физических и экономических задач, а также в машинном обучении и моделировании процессов [2].
CUDA поддерживает гетерогенную среду программирования, в которой части кода приложения написаны для процессора, а другие части приложения написаны для выполнения на GPU. Приложение компилируется в один исполняемый файл, который может работать на обоих устройствах одновременно.
В настоящее время графические процессоры NVIDIA содержат до 4500 ядер CUDA, которые могут работать параллельно для обработки больших наборов данных (принцип SIMD - Single Instruction Multiple Data). Однако, не всегда вычисление на GPU оказывается эффективнее чем на CPU - при относительно небольших объемах входных данных, прирост производительности параллельных вычислений может быть ниже расходов, обусловленных передачей данных между CPU и периферийным устройством. Кроме того, не каждый алгоритм удается эффективно распараллелить [3].
Рассмотрим целесообразность применения GPU в задаче нахождения выпуклой оболочки на плоскости, возникающей при триангуляции [4].
Существует множество алгоритмов поиска выпуклой оболочки, однако не все они подходят для реализации на GPU:
1. Алгоритм Грэхема. Его суть заключается в нахождении начальной точки, которая точно является вершиной выпуклой оболочки. Дальше относительной этой точки по возрастанию полярного круга сортируются остальные точки. Отсортированные точки помещают в двусвязный список, и по нему осуществляется обход Грэхема - на каждом шаге проверяется взаимное расположение трех текущих точек. Проверка состоит в том, чтобы определить, образуют ли данные точки левый поворот, и если да, то средняя из них удаляется и происходит сдвиг влево [5]. Эта процедура повторяется до тех пор, пока алгоритм не вернется к начальной точке. Данный алгоритм является итеративным и сложен для распараллеливания.
2. Алгоритм Джарвиса заключается в поиске на каждом этапе точки, имеющей минимальный положительный полярный угол относительно предыдущей точки оболочки [5]. Данный алгоритм также трудно распараллелить, так как на каждом этапе необходимо знать предыдущую точку построенной оболочки.
3. Алгоритм Чана заключается в разбиении множества точек на группы и поиске в каждой из них своей выпуклой оболочки с помощью алгоритма Грэхема, а затем объединении полученных оболочек с помощью алгоритма Джарвиса [5]. Первый этап данного алгоритма может быть распараллелен, однако объединение оболочек необходимо выполнять итеративно.
4. Алгоритм быстрой оболочки (QuickHull), начинается с нахождения минимальной и максимальной точек вдоль измерения х и добавление их к выпуклой оболочке. Входной набор точек делится на два подмножества: те, которые находятся ниже линии, соединяющей точки х и y и те, что выше. Для каждого подмножества вычисляется расстояние от каждой точки до разделительной линии. Самая дальняя точка, найденная таким образом, добавляется к выпуклой оболочке. Затем строится треугольник с самой дальней точкой и разделительной линией. Все точки в подмножестве, которые находятся внутри этого треугольника отбрасываются. Этот шаг деления выполняется рекурсивно с каждым подмножеством, пока в каком-либо подмножестве не останется точек [5]. Каждое из подмножеств может обрабатываться независимо от остальных, что делает алгоритм удобным для распараллеливания. Авторами была разработана параллельная версия данного алгоритма для GPU.
Реализация алгоритма быстрой оболочки средствами CUDA.
Основные функции:
_device_void delete_up(int *left, int *pt, int *num, int p1, int p2, int *х, int *y) - метод, на вход
которого поступают координаты точек, а так же координаты точек разделительной линии. Данный метод удаляет все точки, которые находятся выше отрезка, который создают минимальная и максимальная точка.
_device_int fulcrum(int *pt, int *n, int *х, int *y) - метод, на вход которого поступают координаты точек, а так же координаты точек разделительной линии. Данный метод возвращает позицию самой дальней точки от разделительной линии.
_device_void QuickHull(int *pt, int *n, int *х, int *y, int* belongs_to_hull) - метод, на вход которого поступают координаты точек, а так же координаты точек разделительной линии. Данный метод реализует сам алгоритм QuickHull, с помощью метода fulcrum находится самая дальняя точка от разделительной линии и вызывается метод delete_up для удаления точек которые лежат внутри оболочки. Метод выполняется рекурсивно пока не останется не рассмотренных точек.
_global_ void Algorithm(int *pt, int* belongs_to_hull, int* upper, int* lower, int *minxpt, int
*maxxpt, int *uppercnt, int *lowercnt, int *х, int *y) - метод, на вход которого поступают координаты всех точек, а так же координаты точек, имеющие минимальное и максимальное значение вдоль измерения х. Данный метод вызывает метод delete_up для разделения точек на части, те, что находятся выше и ниже разделительной линии, и для каждой части вызывает метод void QuickHull.
Основная функция имеет вид:
int main() {
//объявление необходимых переменных
//выделение памяти на хосте
hx = (int *)malloc(N * sizeof(int));
//выделение памяти на устройстве cudaMalloc((void**)&dx, sizeof(int)*N);
//копирование необходимых значений с хоста на устройство cudaMemcpy(dx, hx, N * sizeof(float),
//вызов метода Algorithm, Algorithm << <1, 1024 >> > (dpt, dbelongs_to_hull, dupper, dlower, dmin, dmax, duppercnt, dlowercnt, dx, dy);
//копирование необходимых значений с устройства на хост cudaMemcpy(hx, dx, N * sizeof(int), cudaMemcpyDeviceToHost);
//освобождение памяти cudaFree(dx);
free(hupper);
}
Была произведена серия экспериментов для сравнения производительности данного алгоритма как на CPU, так и на GPU. Каждый алгоритм был запущен с одинаковым количеством данных, и был произведен замер времени выполнения алгоритма.
Тесты проводились на компьютере с графическим профессором Nvidia Geforce GTX 1050 Ti с выделенной видеопамятью 4Гб и CUDA 10, и с CPU Intel® Core™ i5-7300HQ CPU @ 2.50GHz. Результаты тестирования представлены на рисунке.
t, С
10" -.---
103
101 -----
104 105 106 107
N
График сравнения зависимостей времени выполнения алгоритмов от количества точек
Выводы. Исходя из полученных результатов, можно сделать вывод, что разработанный алгоритм, использующий GPU работает значительно быстрее чем обычный алгоритм, использующий CPU, при объеме входных данных более 100 тыс. точек. При меньшем количестве точек CPU не уступает в производительности GPU, и даже может превосходить его по времени выполнения, что обусловлено временными затратами на передачу данных между устройствами.
Список литературы
1. Боресков А.В., Харламова А.А. Основы работы с технологией CUDA. М.: ДМК-Пресс. 2010.
232 с.
2. Толстова И. С. Применение технологии параллельного программирования CUDA в задаче моделирования процесса синтеза УНС // Энергия - XXI век. 2018. № 2(102). С. 105-114.
3. Гришина А.И., Гришунов С.С., Козина А.В., Крысин И.А. Сравнение эффективностей многопоточных реализаций алгоритма шифрования RSA на GPU и CPU // Электронный журнал: наука, техника и образование. 2018. № СВ1 (18). С. 124-132.
4. Скворцов А.В. Обзор алгоритмов построения триангуляции ДЕЛОНЕ // Вычислительные методы и программирование: новые вычислительные технологии. 2002. № 1. С. 14-39.
5. Чаднов Р.В., Скворцов А.В., Мирза Н.С. Обзор алгоритмов построения выпуклой оболочки на плоскости // Вестник томского государственного университета. 2004. № S9-2. С. 116-121.
Белов Юрий Сергеевич, канд. физ.-мат. наук, доцент, fn1-kf@,mail ru, Россия, Калуга, Калужский Филиал Московского Государственного Технического Университета им. Н.Э. Баумана,
Петухов Дмитрий Евгеньевич, студент, petuhoff.dmitrij@yandex. ru, Россия, Калуга, Калужский Филиал Московского Государственного Технического Университета им. Н.Э. Баумана,
Гришунов Степан Сергеевич, ассистент, stepangrishunov@yandex. com, Россия, Калуга, Калужский Филиал Московского Государственного Технического Университета им. Н.Э. Баумана
TO THE QUESTION OF APPLICATION OF THE GPU TO SEARCH A CONVEX HULL ON THE PLANE
Y.S. Belov, D.E. Petuhov, S.S. Grishunov 438
This article discusses the NVIDIA CUDA GPU parallel computing platform. The review of algorithms for searching a convex hull on a plane is carried out and the choice of a quick hull algorithm for the implementation of a parallel version is justified. The basic instructions of the algorithm implemented using CUDA are given. An experiment to determine the effectiveness of the developed algorithm is described and its results are given. An analysis of the results.
Key words: parallel computing, GPU, CUDA, convex hull, QuickHull.
Belov Yuri Sergeevich, candidate of physical and mathematical sciences, docent, fn1-kf@mail. ru, Russia, Kaluga, Kaluga Branch of Bauman Moscow State Technical University,
Petuhov Dmitrij Evgen 'evich, student, petuhoff.dmitrij@yandex. ru, Russia, Kaluga, Kaluga Branch of Bauman Moscow State Technical University,
Grishunov Stepan Sergeevich, assistant, stepangrishunov@yandex. com, Russia, Kaluga, Kaluga Branch of Bauman Moscow State Technical University
УДК 655.05
КЛАССИФИКАЦИЯ БУМАГИ В ПОЛИГРАФИИ
Д.Г. Маркова
Рассматриваются основные виды и типы бумаги, применяемые в полиграфическом производстве, а также основные вопросы экологичности.
Ключевые слова: бумага, полиграфия, экологичность.
Полиграфическая отрасль имеет широкий профиль деятельности, от упаковочного производства, до книжной и журнальной печати. Для разного вида работ существует не только разное оборудование, но и его наполнение: краски, бумага и т.д. Существует множество различных типов бумаг и отличия есть как в составе, так и в размере. Каждый из видов имеет свои преимущества. Однако в современном мире не стоит забывать об остром и как никогда актуальном вопросе экологичности [1]. Из чего должна быть сделана бумага, чтобы можно было не волноваться о будущем лесов? Для того чтобы ответить на данный вопрос для начала необходимо рассмотреть основные существующие виды бумаги.
Вот некоторые из самых популярных разновидностей бумаги для печати:
- Bond
Этот тип бумаги прочен и долговечен в своём использовании. Благодаря высокому содержанию хлопка, бумага имеет высокую степень поглощения и поэтому часто встречается в офисах и используется в основном для бизнес-переписки.
- Глянцевая мелованная бумага
Различия по формату, белизне и плотности. Обычно используется для листовок и брошюр, поскольку имеет высокий блеск. А так как чернила хорошо высыхают, нет необходимости в герметизирующем лаке, поскольку чернила не стираются. Также традиционно используется при печати изображений или фотографий, а не текста. Глянцевая поверхность лучше подходит для печати изображений, чем матовая шероховатая.
- Матовая (штейновая)
Эта бумага является одной из наиболее часто используемых, так как она подходит для всех повседневных задач печати. Благодаря своему составу, матовая бумага хорошо впитывает чернила, позволяя им сохнуть быстрее, чем на бумаге других типов.
- Bright White
Данный тип бумаги гораздо более гладкий и не текстурированный, что делает его идеальным для высококачественной двусторонней печати. Яркость бумаги обеспечивает возможность печати на обеих сторонах без просвечивания чернил на другой стороне.
- Card Stock (кардсток)
Термин «кардсток» (cardstock) произошел от английского выражения stock of card- партия бумаги, определенного вида и плотности. В скрапбукинге это лист плотной бумаги, используемый при изготовлении открыток, страничек, альбомов и прочих скрапобъектов. Этот прочный тип бумаги чаще всего используется для скрапбукинга или для печати визиток и открыток. Так как данная бумага значительно толще, чем другие типы бумаги для принтера, она намного долговечнее.