Сравнительный анализ скорости вычислений на центральном и графическом процессоре
бакалавр Н. С. Мальцев, И. А. Молодкин, к.воен.н. Р. Г. Гильванов Петербургский государственный университет путей сообщения Императора Александра I
Санкт-Петербург, Россия 22nikich98@mail.ru, molodkin@pgups.ru, gilvanov1950@mail.ru
Аннотация. Описывается развитие технологии параллельных вычислений на графическом процессоре (GPU), рассматривается организация вычислений на центральном и графическом процессоре, особенности внутренней архитектуры. Раскрываются фундаментальные принципы работы программ с применением параллельных вычислений на основе передовой технологии CUDA от компании NVIDIA. Проводится исследование скорости выполнения ряда операций (матричное умножение, поиск максимального значения, трансформация вектора, вычисление суммы двух векторов) при разных входных данных с помощью разработанного программного комплекса. Производится анализ полученных результатов. Приводятся рекомендации по использованию технологии CUDA — условия, при соблюдении которых вычисления целесообразно выполнять на GPU (высокая степень распараллеливания; большой объем вычислений; возможность загрузить данные до проведения вычислений).
Ключевые слова: сравнительный анализ, скорость вычислений, CUDA, центральный процессор, графический процессор, параллельные вычисления.
Введение
В настоящее время развитие информационных технологий вызывает стремительный рост требований к вычислительной мощности компьютеров. Архитекторы центральных процессоров придерживаются стратегии увеличения производительности за счет увеличения числа ядер на кристалле и вводе новых инструкций для параллельной обработки данных.
Однако существует и другой подход для ускорения вычислений — применение графических процессоров (GPU), которые превосходят центральные процессоры (CPU) за счет графических ускорителей (рис. 1). Идея использования графических ускорителей для проведения не предназначенных им вычислений интересовала программистов еще с конца 90-х годов. Но только с появлением шейдеров в 2003 году произошел главный толчок к развитию абсо-
лютно новой технологии GPGPU (General Purpose Graphics Processing Units). Важную роль в развитии данной технологии сыграло специальное расширение для языка С под названием «BrookGPU». До появления данного расширения, программисты могли работать с GPU лишь через API Direct3D или OpenGL. Оно позволило программистам работать с привычной им средой, а уже сам компилятор, используя специальные библиотеки, реализовывал взаимодействие с GPU на низком уровне.
Такой подход привлек внимание лидеров данной индустрии — AMD и NVIDIA. Они начали разрабатывать собственные программные платформы для возможности реа-лизовывать неграфические вычисления на своих видеокартах. Зная все особенности своей продукции, разработчики GPU смогли максимально эффективно оптимизировать программный комплекс для интересующих программистов аппаратных решений. В результате компания NVIDIA предложила нам платформу CUDA (Compute Unified Device Architecture), а компания AMD в свою очередь разработала свою технологию под названием CTM (Close To Metal) или, как называют ее разработчики, AMD Stream Computing [1]. Рассмотрим некоторые возможности технологии CUDA и на практике оценим вычислительные возможности видеокарты GTX 1070.
Особенности организации графического процессора
Прежде всего стоит рассмотреть некоторые особенности при выполнении расчетов на графическом процессоре. Основное преимущество GPU заключается в том, что оно изначально проектируется для обработки множества потоков, CPU же выполняет поток последовательных инструкций на каждом своем ядре. Любой графический процессор представляет собой мультипроцессор, состоящий из определенного количества вычислительных кластеров, с множеством арифметико-логических устройств (АЛУ) (англ. Arithmetic and Logic Unit, ALU) в каждом. Например, графический
10000
8000
on
а. 6000
О
ll_ 4000
2000
0
2011 2012 2013 2014 2015 2016 2017 2018 Рис. 1. График производительности GPU в сравнении с CPU
CPU GPU
чип GP104 видеокарты GTX 1070 состоит из 1 920 потоковых вычислительных ядер и 120 блоков TMU (Texture Mapping Unit) при неизменных 64 блоках ROP (Raster Operator Unit). CPU используют SIMD (Single Instruction Multiple Data) блоки SSE для векторных вычислений где одна инструкция выполняется над многочисленными данными, что требует трансформации данных в 4 вектора. GPU же имеет параллельную вычислительную систему с архитектурой SIMT (Single Instruction Multiple Thread) в которой одна команда параллельно выполняется множеством относительно независимых потоков. Множество всех этих потоков, запущенных в рамках одной задачи, носит название grid (сетка). Это избавляет программистов от необходимости преобразовывать данные в векторы, а также позволяет использовать произвольные ветвления в потоках [2].
Другой важной особенностью является организация памяти в CUDA и распределение уровней доступа потоков к различным ее частям. Глобальная память — это наиболее простой вид памяти для понимания. Термин «глобальная» связан с тем фактом, что данный вид памяти доступен как со стороны других устройств, так и со стороны самого графического процессора как на запись, так и на чтение. В принципе, к ней может получить доступ любая составляющая часть устройства. Глобальная память (global memory) дает потокам наивысший уровень общего доступа за счет своей физической реализации в виде интегральных микросхем, расположенных непосредственно на самой плате графического адаптера. Расположение вне процессора делает данную память наиболее медленной по сравнению с другими типами памяти, предоставляемыми для вычислений на видеокарте.
Разделяемая память SM (shared memory) расположена в каждом SM-блоке, а ее размер обычно составляет 16 Кбайт. Данная память доступна исключительно тем потокам, которые выполняются на ядрах текущего SM-блока [3]. Так как для параллельного исполнения на одном SM может быть отведено более одного блока, то весь доступный в SM объем разделяемой памяти распределяется между этими блоками поровну. Физически разделяемая память расположена достаточно близко к ядрам SM, следовательно, она обладает высокой скоростью доступа.
Регистровая память — основной вид памяти, который может служить операндами элементарных машинных команд, а также обладает самым высоким быстродействием. Все регистры одного SM поровну разделяются между всеми потоками, запущенными на этом SM.
Технология CUDA
CUDA — вычислительная архитектура, разработанная компанией NVIDIA для реализации параллельных программ. Она позволяет программисту задействовать все возможные ресурсы графического процессора и направить их на реализацию высокопроизводительных приложений. Для программистов было реализовано специальное расширение для языка C, которое предоставляло возможность включать специальные функции в текст программы, тем самым позволяя разработчику организовывать доступ к набору инструкций GPU и управлять его памятью [4].
Запуск программы на графическом процессоре происходит следующим образом:
1. Центральный процессор выделяет необходимое количество памяти на устройстве.
2. Центральный процессор копирует данные из ОЗУ в память графического процессора.
3. Центральный процессор запускает функцию (задание) на графическом процессоре.
4. Графический процессор выполняет эту функцию (задание).
5. Центральный процессор копирует результаты из памяти графического процессора в ОЗУ.
Если время, потраченное на выполнение функции, окажется меньше времени, потраченного на выделение памяти и запуск этих функций, тогда использование графического процессора в данном случае бессмысленно.
Архитектура GPU отличается от архитектуры CPU. Графический процессор спроектирован таким образом, чтобы выполнять огромное количество потоков (элементарных параллельных процессов) [5]. Подробная архитектура центрального и графического процессора представлена на рисунке 2.
Рис. 2. Архитектура CPU и GPU
На рисунке видно, что в GPU есть много простых арифметико-логических устройств, которые объединены в несколько групп и обладают общей памятью. Это позволяет повысить эффективность в вычислительных функциях, однако усложняет программирование. Архитектура CPU также имеет сверхоперативную память (cache) и управляющее устройство (control), но гораздо меньше арифметико-логических устройств. Учитывая характеристики GPU и грамотно реализуя доступ к памяти, можно добиться наибольшей эффективности в вычислительных процессах.
Графический процессор предназначен для работы с большими объемами данных и расчетов. Он представляет из себя массив потоковых процессоров (Streaming Processor Array), который состоит из так называемых кластеров текстурных процессоров (Texture Processor Clusters, TPC). Каждый кластер текстурных процессоров состоит из мультипроцессоров (Streaming Multi-processor), в которых находятся несколько потоковых процессоров (Streaming Processors) или ядер [6]. GPU фактически является устройством, которое реализует вычислительную модель входящих и исходящих потоков данных. Они представляют из себя одинаковые элементы и имеют возможность обрабатываться независимо друг от друга. Каждый графический адаптер обладает количественной характеристикой скорости выполнения определенных операций. В NVIDIA эта характеристика обозначается как Compute Capability Version.
В CUDA потоки для расчетов группируются в иерархию — grid / block / thread. Их структура представлена на рисунке 3.
Grid
block (d, 0) i block (1, (1) i black (2,0)
Block (0,1>*'| Block (1,1) ['-Block (2,1)
Рис. 3. Структура потоков в CUDA
Как видно из рисунка, верхний уровень (grid) отвечает ядру и объединяет все потоки (thread), которые выполняет данное ядро. Grid — одномерный или двумерный массив блоков (block), которые являются полностью независимыми наборами скоординированных между собой потоков (thread). Потоки из разных блоков не могут взаимодействовать. В CUDA есть такое понятие, как warp — группа из потоков (количество потоков зависит от архитектуры графического процессора). Потоки одного warp имеют возможность выполняться одновременно, а потоки разных warp могут быть на разных стадиях выполнения программ. Данные обрабатываются методом SIMT (Single Instruction — Multiple Threads), а управление работой warp выполняется на аппаратном уровне [7-8].
Разработка программного комплекса
Для проведения сравнительного анализа на языке С++ был разработан программный комплекс, выполняющий различные операции над матрицами разных размеров. Выбор матричных операций обоснован частым применением при проведении научных и других видов расчетов.
Работа программного комплекса делится на ряд определенных этапов.
Первый этап заключается в псевдослучайной генерации значений элементов матриц. Генерация осуществляется вызовом метода generate Стандартной Библиотеки Шаблонов (STL).
На втором этапе происходит определение доступных графических процессоров ЭВМ и задается точка отсчета для замеров времени работы алгоритмов программы. Замер времени производится с помощью библиотеки Chrom, входящей в состав STL.
На третьем этапе поочередно выполняется весь набор следующих операций:
1. Матричное умножение.
2. Поиск максимального значения.
3. Трансформация вектора.
4. Вычисление суммы двух векторов.
5. Сортировка.
6. Подсчет числа элементов, удовлетворяющих условию.
Все названные операции в программном комплексе выполняются как на графическом, так и на центральном процессоре.
Четвертый этап вычисляет время работы всех алгоритмов, фиксирует итоговое время работы для каждого типа процессора и выводит полученные значения на экран.
Вышеперечисленные операции реализованы на основе нескольких библиотек.
Матричное умножение на центральном процессоре происходит с применением библиотеки Armadillo.
Armadillo — это высококачественная библиотека линейной алгебры C++, нацеленная на достижение хорошего баланса между скоростью и простотой использования. Она полезна для разработки алгоритмов непосредственно на языке программирования C++ и быстрого преобразования исследовательского кода в производственные среды. Синтаксис (API) намеренно похож на Matlab [9].
Библиотека предоставляет эффективные классы для векторов, матриц и кубов, а также более 200 связанных функций (например, смежные и несмежные представления подматриц). Различные разложения матриц обеспечиваются за счет интеграции с LAPACK или одной из его высокопроизводительных замен (например, OpenBLAS, Intel MKL, AMD ACML, платформа Apple Accelerate и т. д.).
Сложный анализатор выражений (с помощью шаблонного метапрограммирования C++) автоматически объединяет несколько операций во время компиляции для увеличения скорости и эффективности. Библиотека может использоваться для машинного обучения, распознавания образов, компьютерного зрения, обработки сигналов, статистики и эконометрики.
Для реализации многопоточности при вычислении на центральном процессоре библиотека Armadillo обращается к OpenMP.
Интерфейс OpenMP задуман как стандарт для программирования на масштабируемых SMP-системах (SSMP, ccNUMA, etc.) в модели общей памяти (shared memory model) [10].
В стандарт OpenMP входят спецификации набора директив компилятора, процедур и переменных среды. Разработкой стандарта занимается организация OpenMP ARB (ARchitecture Board), в которую вошли представители крупнейших компаний-разработчиков SMP-архитектур и программного обеспечения. OpenMP можно рассматривать как высокоуровневую надстройку над Pthreads (или аналогичными библиотеками нитей). За счет идеи «инкрементального распараллеливания» OpenMP идеально подходит для разработчиков, желающих быстро распараллелить свои вычислительные программы с большими параллельными циклами.
Разработчик не создает новую параллельную программу, а просто последовательно добавляет в текст последовательной программы OpenMP-директивы. При этом OpenMP — достаточно гибкий механизм, предоставляющий разработчику большие возможности контроля над поведением параллельного приложения. Многопоточное вычисление на графическом процессоре осуществляется благодаря библиотеке Thrust.
Block (1,1)
Thread (Ü, 0) Thread (1,0) i Thread (2, 0) Thread <3, 0) 1
Thread (а, Т) Thread (1,1) Thread (2,1) Thread (3,1) I
Thread (0, 2) Thread (1, 2) Thread (2, 2) Thread (3, 2)
Thrust — это библиотека параллельного программирования C++, которая напоминает стандартную библиотеку. Высокоуровневый интерфейс Thrust значительно повышает производительность труда программистов, обеспечивая переносимость производительности между графическими процессорами и многоядерными процессорами [11]. Взаимодействие с установленными технологиями, такими как CUDA, TBB и OpenMP, облегчает интеграцию с существующим программным обеспечением.
Все классы и функции этой библиотеки — шаблонные. Для работы с этой библиотекой требуется подключить заголовочные файлы. В Thrust нет стандартных библиотечных файлов (.lib, . a, .dll, .so).
Ряд понятий и подходов Thrust заимствовала из STL. Thrust предоставляет набор различных параллельных примитивов, таких как различные преобразования, сортировка, операции reduce и scan. Применяя Thrust, многие действия могут быть записаны просто и понятно с использованием минимального объема кода. Все последние версии CUDA включают в себя Thrust, так что для работы с Thrust никаких дополнительных установок не понадобится.
Результаты моделирования
Моделирование проводилось на ПЭВМ со следующими характеристиками:
• видеокарта GTX 1070 (графический чип GP104);
• центральный процессор Intel Core i5-6600K;
• ОЗУ G.skill 16 Гб;
• операционная система Windows 10.
Рассмотрим полученные в ходе анализа результаты.
1. Матричное умножение.
Проведены замеры времени выполнения умножения для квадратных матриц различного размера от 85х85 до 25 000 х 25 000 элементов. Сравнение результатов времени выполнения матричного умножения для некоторых случаев представлены на рисунке 4.
2 1,5 1
0,5 0
Таблица 1
Матричное умножение
85 x 85 175 x 175
■ CPU, мс ■ GPU, мс
250 x 250
Рис. 4. Затраты времени на матричное умножение
Поскольку матричное умножение обладает высокой степенью распараллеливания, графический чип GP104 за счет большого числа ядер CUDA будет быстрее выполнять расчеты по сравнению с центральным процессором (рис. 4). Высокая степень распараллеливания достигается за счет возможности вычисления любого элемента результирующей матрицы без необходимости вычисления всех предыдущих.
В таблице 1 приведены замеры времени умножения для всех рассмотренных матриц.
Размер матрицы, элементов CPU, мс GPU, мс CPU GPU
85 x 85 0,397 0,102 4
175x175 0,730 0,208 4
250x250 1,875 0,151 12
500 x 500 14,000 0,345 41
1 000 x 1 000 78,000 1,031 76
2 000 x 2 000 915,000 3,810 240
4 000 x 4 000 4 373,000 14,817 295
8 000 x 8 000 34 641,000 59,705 580
16 000 x 16 000 277 249,000 234,000 1185
25 000 x 25 000 1 215 248,000 579,000 2099
На основе таблицы 1 построим гистограмму отношения скорости вычисления на ЦП и ГП (рис. 5).
CPU/GPU
2500 2000 1500 1000 500 0
12
4 5
8 9
10
Рис. 5. Гистограмма отношения скорости вычисления на ЦП и ГП
На основе гистограммы можно сделать вывод о том, что с ростом размерности матрицы разница между требуемым временем на поведение операции на ЦП и ГП будет увеличиваться, причем нелинейно.
2. Поиск максимального значения в векторе.
Операция поиска максимального значения в векторе (массиве) очень распространена во всех областях при работе с данными.
30 20 10 0
||
10л5 10Л6 10л7
■ CPU, мс ■ GPU, мс
Рис. 6. Затраты времени на поиск максимального значения в векторе
Как следует из рисунка 6, при малых размерах вектора центральный процессор производит поиск быстрее. Это связано с тем, что при проведении вычислений на графическим процессоре, необходимо провести ряд «дорогих» по времени подготовительных и заключительных операций. К этим операциям относятся операции выделения
3
6
7
памяти в ГП, переноса данных из ОЗУ в память ГП, переноса результата из памяти ГП обратно в ОЗУ, а также операция освобождения памяти ГП.
Когда в векторе содержится всего несколько десятков значений, мы можем видеть, что требуется около 0,74 мс для проведения накладных операций (см. таблицу 2).
Все эти накладные операции сводят на нет смысл применения графического процессора при поиске максимального или минимального значения в относительно небольшом векторе или в случае поиска в наборе векторов небольшой размерности.
Таблица 2
Поиск максимального значения в векторе
Размер вектора, элементов CPU, мс GPU, мс
10 < 0,001 0,74
100 < 0,001 0,741
1 000 0,002 0,595
10 000 0,022 0,599
100 000 0,228 0,925
1 000 000 2,242 2,866
10 000 000 22,817 17,693
100 000 000 227,98 150,725
Однако, в случае поиска максимального или минимального значения, нужно учитывать еще и низкую приспособленность задачи к распараллеливанию.
3. Трансформация вектора.
Другой важной операцией над матрицами является трансформация. Суть этой операции заключается в применении заданной операции ко всем элементам матрицы.
В качестве заданной операции над вектором была взята следующая функция:
х = х • х + х/2 ,
где х — текущий элемент матрицы.
В таблице 3 представлены замеры времени на проведение трансформации векторов различного размера.
Таблица 3
Трансформация векторов
Размер вектора, элементов Подготовка GPU, мс Вычисление на GPU, мс Перенос результата, мс Всего на GPU, мс CPU, мс
10 0,493 0,048 0,041 0,582 < 0,001
100 0,493 0,069 0,068 0,632 < 0,001
1 000 0,372 0,063 0,069 0,505 0,001
10 000 0,493 0,073 0,077 0,643 0,009
100 000 1,050 0,072 0,186 1,31 0,095
1 000 000 2,156 0,13 1,238 3,526 1,001
10 000 000 17,678 0,862 18,97 37,511 9,662
100 000 000 169,608 8,194 141,852 319,654 95,821
В этом эксперименте помимо общего времени вычисления было измерено время, требуемое на выполнение накладных операций. Можно отметить, что за счет параллелизма сами вычисления на ГП выполняются очень быстро, однако, с учетом работы с памятью, итоговый результат получается гораздо хуже, чем у ЦП (рис. 7). Как и ожидалось, время на подготовительные операции в ГП намного превышает время на передачу результата.
40 30 20 10 0
I
10Л5 10л6
■ CPU, мс ■ GPU, мс
10Л7
Рис. 7. Затраты времени на трансформацию вектора
4. Вычисление суммы двух векторов. При вычислении суммы векторов наблюдается ситуация, аналогичная возникающей при поиске максимального или минимального значения в векторе (рис. 8).
10Л4 10Л5
■ CPU, мс ■ GPU, мс
Ii
10Л6
Рис. 8. Затраты времени на суммирование векторов
Результаты замеров времени суммирования различных векторов размещены в таблице 4. По результатам проведенных тестов можно утверждать, что при работе с векторами размером менее 1 000 000 применение ГП приведет к замедлению работы.
Таблица 4
Суммирование векторов
Размер вектора, элементов CPU, мс GPU, мс
10 < 0,001 0,664
100 < 0,001 0,451
1 000 0,003 0,398
10 000 0,037 0,408
100 000 0,377 0,716
1 000 000 3,953 2,770
10 000 000 38,335 19,316
100 000 000 387,087 152,244
Современные процессоры позволяют добиться высокого быстродействия за счет параллелизма на основе ядер и потоков. В процессорах Intel поддержка инструкций SIMD (single instruction, multiple data), которые обеспечивали параллелизм на уровне данных, впервые заявлена в серии Pentium III.
5. Сортировка вектора.
Еще одной часто встречаемой задачей при работе с данными является сортировка. Она может осуществляться с применением широкого спектра алгоритмов. В библиотеке STL есть метод sort, который сортирует вектор с применением распараллеливания на процессоре. Основанная на STL библиотека Thrust также содержит метод sort, который в свою очередь может производить сортировку уже с применением мощностей ГП.
Сортировка слиянием, применяемая в обеих библиотеках, позволяет раскрыть весь потенциал как центрального, так и графического профессора за счет разбиения на блоки.
Уже при сортировке вектора, содержащего 100 000 элементов, центральному процессору требуется более чем в два раза больше времени. При увеличении количества элементов разница существенно возрастает (рис. 9) даже несмотря на необходимость не только загружать весь вектор в память ГП, но и выгружать обратно уже отсортированный (см. таблицу 5).
12 -
10 -
8 -
6 -
4 -
2 0
10Л3
10л4
10Л5
■ CPU, мс ■ GPU, мс
Рис. 9. Затраты времени на сортировку вектора
Таблица 5
Сортировка вектора
Размер вектора, элементов CPU, мс GPU, мс
10 < 0,001 1,095
100 0,003 1,818
1 000 0,035 1,853
10 000 0,769 2,970
100 000 10,829 4,787
1 000 000 88,604 6,391
10 000 000 879,600 76,652
100 000 000 5639,000 518,995
Как и в рассмотренных ранее тестах, при сортировке существует определенный порог, при котором ГП начинает существенно выигрывать по времени у ЦП.
6. Подсчет числа элементов, удовлетворяющих условию.
Последняя рассматриваемая операция — подсчет числа элементов, удовлетворяющих заданному условию. В этом случае требуется загрузить в память ГП весь вектор, а выгрузить лишь одно число, что позволит сократить время на работу с памятью. Однако, как показало исследование, этот факт не смог дать графическому процессору преимущество в скорости (рис. 10).
3 2,5 2 1,5 1 0,5 0
10Л4
10Л5
CPU, мс GPU, мс
10Л6
Для примера рассмотрим результаты поиска в векторе, состоящем 100 000 000 элементов (табл. 6). Замеры времени на накладные операции показали, что из 154 мс, затраченных на поиск, 149 мс занял процесс передачи вектора из ОЗУ в память ГП. Таким образом, сам поиск занял всего лишь 3% от общего времени.
Таблица 6
Подсчет числа элементов, удовлетворяющих условию
Размер вектора, элементов CPU, мс GPU, мс
10 < 0,001 0,445
100 < 0,001 0,555
1 000 < 0,001 0,457
10 000 0,006 0,486
100 000 0,070 0,627
1 000 000 0,782 2,832
10 000 000 5,93 17,022
100 000 000 61,874 154,38
Рис. 10. Затраты времени на подсчет числа элементов, удовлетворяющих условию
Этот случай показывает, что даже несмотря на то, что задача может быть пригодна для распараллеливания, результат зависит и от других факторов, которые могут сыграть ключевую роль при выборе процессора для проведения расчетов.
Заключение
Применение графических процессоров при обработке больших массивов данных, безусловно, может ускорить получение результата. На сегодняшний день продажи CUDA-процессоров достигли миллионов, а разработчики программного обеспечения, ученые и исследователи широко используют CUDA в различных областях, включая обработку видео и изображений, вычислительную биологию и химию, моделирование динамики жидкостей, восстановление изображений, полученных путем компьютерной томографии, сейсмический анализ, трассировку лучей и многое другое. Технология Nvidia CUDA хорошо подходит для решения широкого круга задач и существенно облегчает разработку ПО за счет развитого набора расширений для языков C и С++, позволяющих выражать как параллелизм данных, так и параллелизм задач на уровне мелких и крупных структурных единиц [12].
Конечно, графические процессоры не заменят центральные из-за особенностей своей архитектуры и работы. Наоборот, производители видеокарт стараются сделать видеочипы как можно более похожими по функционалу на ЦП — добавляют поддержку расчетов с одинарной и двойной точностью и т. п. В свою очередь, центральные процессоры развивают возможности параллелизма за счет увеличения числа ядер и поддержки новых инструкций, что является основным направлением развития этого типа процессоров.
Рассмотренные в ходе исследования варианты применения графического процессора показали, что далеко не каждая задача может быть эффективно решена на нем. Даже в случае хорошего распараллеливания накладные расходы времени, обусловленные особенностями архитектуры ГП, могут оказать существенное влияние на итоговое время работы.
На основе полученных результатов можно сформулировать следующие критерии для задач, которые могут быть решены на ГП:
- высокая степень распараллеливания;
- наличие большого количества вычислений;
- возможность загрузить данные до проведения вычислений.
Однако даже если задача удовлетворяет этим критериям, это не гарантирует ускорение ее решения на ГП, а лишь заставляет задуматься о применении технологии CUDA. Однозначно сделать выбор между ЦП и ГП можно только после тестирования. К счастью, благодаря хорошо продуманному синтаксису, для переноса вычислений на ГП не понадобится много времени.
Литература
1. Cheng J. Professional CUDA C Programming / J. Cheng, M. Grossman, T. McKercher. — John Wiley & Sons, 2014. — 523 p.
2. Sanders J. CUDA by Example: An Introduction to General-Purpose GPU Programming / J. Sanders, E. Kandrot. — Addison-Wesley Professional, 2011. — 309 p.
3. NVIDIA CUDA™ NVIDIA CUDA C Programming Guide. Version 4.1. — Santa Clara, CA, USA, 2011. — 168 p.
4. Параллельные вычисления на GPU. Архитектура и программная модель CUDA: Учебное пособие / А. В. Борес-ков, А. А. Харламов, Н. Д. Марковский [и др.]. — М.: Издательство МГУ, 2012. — 336 с. — (Суперкомпьютерное образование).
5. Боресков А. В. Основы работы с технологией CUDA / А. В. Боресков, А. А. Харламов. — М.: ДМК Пресс, 2010. — 232 с.
6. Storti D. W. CUDA for Engineers: An Introduction to High-Performance Parallel Computing / D. W. Storti, M. Yur-toglu. — Addison-Wesley Professional, 2016. — 347 p.
7. Farber R. CUDA Application Design and Development. — Elsevier, Morgan Kaufmann, 2011. — 332 p.
8. Soyata T. GPU Parallel Program Development Using CUDA — Boka Raton, FL, USA: CRC Press, 2018. — 475 p.
9. Sanderson C. Armadillo: a template-based C++ library for linear algebra / C. Sanderson, R. R. Curtin // Journal of Open Source Software. 2016. Vol. 1. 26 p.
DOI: 10.21105/joss.00026.
10. Van Der Pas R. Using OpenMP — The Next Step: Affinity, Accelerators, Tasking, and SIMD (Scientific and Engineering Computation) / R. Van Der Pas, E. Stotzer, C. Terboven. — Cambridge: The MIT Press, 2017. — 392 p.
11. Kirk D. B. Programming Massively Parallel Processors: A Hands-on Approach / D. B. Kirk, W-m. W. Hwu. — Third Edition. — Elsevier, Morgan Kaufmann, 2016. — 572 p.
12. Параллельные вычисления CUDA // Nvidia.
URL: http://www.nvidia.com.ua/object/cuda-parallel-compu-ting-ru.html (дата обращения 10.06.2020).
Comparative Analysis of Computing Speed on Central and Graphic Processor
Bachelor N. S. Maltsev, I. A. Molodkin, PhD in Military Science R. G. Gilvanov Emperor Alexander I Petersburg State Transport University Saint Petersburg, Russia 22nikich98@mail.ru, molodkin@pgups.ru, gilvanov1950@mail.ru
Abstract. The development of parallel computing technology on a graphics processor (GPU) is described, the organization of computing on a central and graphic processor, and internal architecture features are considered. The fundamental principles of programs using parallel computing based on advanced CUDA technology from NVIDIA are revealed. A study of the speed of a number of operations (matrix multiplication, maximum value search, vector transformation, calculation of the sum of 2 vectors) with different input data using the developed software package is made. The analysis of the results is carried out. Recommendations are given on the use of CUDA technology - the conditions under which it is advisable to perform calculations on a GPU (high degree of parallelization; a large amount of calculations; the ability to download data before calculations).
Keywords: benchmarking, computing speed, CUDA, central processing unit, graphics processor, parallel computing.
References
1. Cheng J., Grossman M., McKercher T. Professional CUDA C Programming. John Wiley & Sons, 2014, 523 p.
2. Sanders J., Kandrot E. CUDA by Example: An Introduction to General-Purpose GPU Programming. Addison-Wesley Professional, 2011, 309 p.
3. NVIDIA CUDA™ NVIDIA CUDA C Programming Guide. Version 4.1. Santa Clara, CA, USA, 2011, 168 p.
4. Boreskov A. V., Kharlomov A. A., Markovsky N. D., et al. Parallel computing on GPU. Architecture and software model of CUDA: Study Guide [Parallel'nye vychisleniya na
GPU. Arkhitektura i programmnaya model' CUDA: Uchebnoe posobie]. Moscow, Lomonosov Moscow State University, 2012, 336 p.
5. Boreskov A. V., Kharlamov A. A. Technology Basics of CUDA [Osnovy raboty s tekhnologiey CUDA]. Moscow, DMK Press Publishers, 2010, 232 p.
6. Storti D. W., Yurtoglu M. CUDA for Engineers: An Introduction to High-Performance Parallel Computing. Addison-Wesley Professional, 2016, 347 p.
7. Farber R. CUDA Application Design and Development. Elsevier, Morgan Kaufmann, 2011, 332 p.
8. Soyata T. GPU Parallel Program Development Using CUDA. Boka Raton, FL, USA, CRC Press, 2018, 475 p.
9. Sanderson C., Curtin R. R. Armadillo: a template-based C++ library for linear algebra, Journal of Open Source Software, 2016, Vol. 1, 26 p. DOI: 10.21105/joss.00026.
10. Van Der Pas R., Stotzer E., Terboven C. Using OpenMP — The Next Step: Affinity, Accelerators, Tasking, and SIMD (Scientific and Engineering Computation). Cambridge, The MIT Press, 2017, 392 p.
11. Kirk D. B., Hwu W-m. W. Programming Massively Parallel Processors: A Hands-on Approach, Third Edition. Elsevier, Morgan Kaufmann, 2016, 572 p.
12. Parallel computing of CUDA [Parallel'nye vychisleniya CUDA], NVidia. Available at: http://www.nvidia.com.ua/ object/cuda-parallel-computing-ru.html (accessed 10 June 2020).
HHmmneKmyanbHbie техноnогии Ha mpaHcnopme. 2020. № 2
58