Перевести страницу на:  
Please select your language to translate the article


You can just close the window to don't translate
Библиотека
ваш профиль

Вернуться к содержанию

Кибернетика и программирование
Правильная ссылка на статью:

Применение технологии параллельного программирования NVIDIA CUDA в задаче расплавления шарообразной частицы

Сеченов Павел Александрович

кандидат технических наук

доцент, кафедра прикладных информационных технологий и программирования, Федеральное государственное бюджетное образовательное учреждение высшего образования «Сибирский государственный индустриальный университет»

654007, Россия, Кемеровская область, г. Новокузнецк, ул. Кирова, 42

Sechenov Pavel

PhD in Technical Science

Docent, the department of Applied Information Technologies and Programming, Siberian State Industrial University

654007, Russia, Kemerovskaya oblast', g. Novokuznetsk, ul. Kirova, 42

pavesa89@mail.ru
Другие публикации этого автора
 

 
Оленников Алексей Александрович

кандидат технических наук

доцент, кафедра теплогазоводоснабжения, водоотведения и вентиляции, Сибирский государственный индустриальный университет

654007, Россия, Кемеровская область, г. Новокузнецк, ул. Кирова, 42

Olennikov Aleksei Aleksandrovich

PhD in Technical Science

Associate Professor, Department of Heat, Gas and Water Supply, Water Drainage and Ventilation, Siberian State Industrial University

654007, Russia, Kemerovskaya oblast', g. Novokuznetsk, ul. Kirova, 42

tgsv-sibsiu@mail.ru
Другие публикации этого автора
 

 

DOI:

10.25136/2644-5522.2018.5.20345

Дата направления статьи в редакцию:

10-09-2016


Дата публикации:

25-11-2018


Аннотация: В статье рассмотрена технология параллельного программирования NVIDIA CUDA в задаче расплавления шарообразной частицы. Показана тенденция современных компьютеров к увеличению мощности за счет увеличения количества ядер, а не за счет увеличения частоты процессора (что приводит к значительному потреблению энергии и выделению тепла). Представлен закон Амдала, позволяющий оценить ускорение времени программы при распараллеливании на N процессоров. Перечислены условия увеличения производительности алгоритма при распараллеливании задачи. Представлена задача расплавления частицы железной руды. Рассмотрены особенности языка параллельного программирования CUDA C и представлены алгоритмы для выбранной задачи. Произведен сравнительный анализ времени выполнения задачи на CPU (С#) и GPU (CUDA C). Технология параллельного программирования CUDA позволяет увеличить производительность распараллеливаемых алгоритмов сложности N до 60 раз. Для этого требуется наличие графического процессора с поддержкой данной технологии, среда разработки и компилятор языка CUDA, знание языка CUDA C, а также хорошее знание задачи и возможности ее распараллеливания.


Ключевые слова:

параллельное программирование, графический процессор, центральный процессор, расплавление частицы, язык CUDA C, язык С#, закон Амдала, производительность алгоритма, время выполнения, язык высокого уровня

Abstract: The article describes the NVIDIA CUDA parallel programming technology used  in the task of melting a spherical particle. The tendency of modern computers to increase power by increasing the number of cores, and not by increasing the frequency of the processor (which leads to significant energy consumption and heat generation). The Amdal law is presented, allowing to estimate the acceleration of the program time when parallelized on N processors. The conditions for increasing the performance of the algorithm in parallelizing tasks are listed. The task of melting iron ore particles is presented. The features of the parallel programming language CUDA C are considered and the algorithms for the selected task are presented. A comparative analysis of the task execution time on the CPU (C #) and GPU (CUDA C) has been made. The technology of parallel programming CUDA allows you to increase the performance of parallelized algorithms of complexity N up to 60 times. This requires the presence of a graphics processor supporting this technology, the development environment and the CUDA compiler, knowledge of the CUDA C language, as well as a good knowledge of the task and the possibility of its parallelization.


Keywords:

parallel programming, GPU, CPU, melting particles, CUDA C language, C# language, Amdahl's law, algorithm performance, lead time, high-level language

Введение

Целью работы является сравнение производительности программы расплавления шарообразной частицы решаемой на центральном процессоре (CPU) на языке C# и с применением технологии параллельного программирования CUDA на графическом процессоре (GPU) на языке CUDA C.

Впервые программно-аппаратная архитектура CUDA (Compute Unified Device Architecture) появилась в феврале 2007 года, представив программистам использовать технологию GPGPU (General-Purprose computing on Graphics Processing Units – неспециализированные вычисления на графической карте), благодаря которой на привычных языках высокого уровня (прежде всего – Си) можно реализовывать алгоритмы, которые выполняются на графических ускорителях GeForce восьмого поколения и старше [1].

Одной из важнейших характеристик любого вычислительного устройство является производительность. Процессоры архитектуры x86, c момента появления в 1978 году, увеличили свою тактовую частоту с 4,77 МГц до 3 ГГц, т.е. более чем в 600 раз, однако в последние несколько лет рост частоты более не наблюдается [1]. Это связанно как с ограничениями технологии производства микросхем, так и с тем, что энергопотребление (а значит и выделение тепла) пропорционально четвертой степени частоты. Таким образом, увеличение тактовой частоты всего в 2 раза приводит к увеличению тепловыделения в 16 раз [2]. В настоящее время рост производительности идёт в основном за счет увеличения числа параллельно работающих ядер, т.е. за счет параллелизма (даже в современных смартфонах число ядер 4-8, а тактовая частота ниже чем у персонального компьютера, что ограничивается возможностями отвода тепла в смартфонах).

Максимальное ускорение, которое можно получить от распараллеливания программы на N процессоров (ядер), дает закон Амдала (Amdahl Law)[2]:

`S=1/((1+P)+P/N)` (1)

где P – это часть времени выполнения программы, которая может быть распараллелена на N процессоров.

За последние 10 лет появилось множество обучающей литературы по технологии CUDA отечественного [1-3] и зарубежного производства [4-5]. В связи с тем, что расчеты на графическом процессора выполняются быстрее, чем на центральном процессоре, возрастает интерес к моделированию систем с большим количеством частиц [6, 7].

На сайте производителя графических процессоров NVIDIA обучающий онлайн курс [8] позволяет освоить основы параллельного программирования. Автор данного курса производит измерение скорости программ на CPU и GPU как с использованием низкоуровневого программирования на языке CUDA C, так и с использованием программного стандарта параллельного программирования OPENACC, который позволяет программисту абстрагироваться от особенностей инициализации графического процессора, вопросов передачи данных на сопроцессор и обратно. При этом наибольшую производительность для параллельных алгоритмов дает программирование на низкоуровневом языке CUDA C в сравнении с использованием OPENACC.

Для увеличения производительности алгоритма требуется выполнение следующих условий:

- алгоритм программы должен распараллеливаться (при этом рост производительности можно рассчитать по закону Амдала);

- наличие графического процессора с технологией CUDA;

- наличие среды разработки (в данном случае это Visual Studio 2013);

- наличие компилятора языка CUDA C (nvcc, который входит в состав CUDA SDK);

- знание языков С#, CUDA C.

Постановка и решение задачи расплавления железной руды на языке параллельного программирования

Задача расплавления частицы железной руды [9], которая является одной из задач моделирования процессов в колонном струйно-эмульсионном реакторе [10-12], хорошо распараллеливается и состоит в расчете скорости расплавления одного слоя. В основу растворения кусков принята следующая гипотеза: считается, что куски представляются в виде шара, а в шаре рассматриваются достаточно тонкие последовательно смываемые слои. В слоях рассматривается баланс энтальпии, необходимый для прогрева и усвоения (смыва) слоя, и поток тепла из окружающий среды, необходимый для обеспечения величины этой энтальпии. Для слоя шара объёмом dV за время поступает количество теплоты [13]:

`dQ=pc_(p)T_(pl)dV` (2)

где: `p` – плотность; `c_(p)` – теплоёмкость; `T_(pl)` – температура плавления.

С другой стороны, за время через площадь поверхности S данного слоя шара поступает из окружающей среды с температурой количество теплоты [13], в соответствии с соотношением (3):

`dQ=alpha(T_(sr)-T_(sl))Sd tau` (3)

где: `alpha` – коэффициент теплоотдачи, `T_(sr)` – температура среды; `T_(sl)` – температура слоя.

Из (2) и (3) уравнений получаем:

`pc_(p)T_(pl)dV= alpha(T_(sr)-T_(sl))Sd tau` (4)

Данные по теплофизическим константам `alpha,` `p` , `c_(p)` , `T_(pl)` взяты из источников [14],[15].

Отсюда находится время растворения слоя по формуле (5):

`tau=(pc_(p)T_(pl)dV_(sl))/(alpha(T_(sr)-T_(sl))S)` (5)

Передача тепла в шаре, происходит по следующей схеме: пока внешний слой расплавляется, следующий за ним слой нагревается, как показано на рисунке 1.

cuda_0

Рисунок 1 – Передача тепла на i и i+1 шаге

Перейдем к рассмотрению особенности программной реализации на языке CUDA C. При программировании на GPU используются два понятия: хост, который связан с центральным процессором (host – CPU) и девайс, который связан с графическим процессором (device – GPU). Вызов параллельных частей происходит в функции ядра:

Kernel <<<nBlk, nTid>>> (args),

где: Kernel – название функции ядра;

nBlk – количество блоков функции;

nTid – количество нитей функции;

args – аргументы функции.

В ходе программы на GPU каждая нить имеет свой идентификационный номер:

thredID = threadIdx.x + blockIdx.x * blcockDim.x

где: threadIdx – номер нити в блоке;

blockIdx – номер блока, в котором находится нить;

blockDim – размер блока.

Программа состоит из двух функции: основной – Main() выполняем на CPU и функции расчета MyFunc() выполняемой на GPU.

На рисунке 2 показан алгоритм реализации функции на GPU, который состоит из следующих блоков:

1) вызов функции на GPU с параметрами (массив расчетов, количество расчетов, начальный радиус, шаг, плотность, температура плавления, коэффициент теплоотдачи, температура среды);

2) определение идентификатора нити;

3) определение начального и конечного радиуса;

4) определение времени плавления для каждого слоя, которое рассчитывается параллельно.

1_cuda_01

Рисунок 2 – Алгоритм реализации функции на GPU

На рисунке 3 показан алгоритм реализации функции на CPU, который состоит из следующих стадий:

1) вызов главной функции;

2) выделение памяти для хоста и девайса;

3) определение количества блоков в потоке;

4) копирование данных с хоста (CPU) на девайс (GPU);

5) вызов функции ядра myFunc с требуемыми параметрами;

6) копирование данных с девайса (GPU) на хост (CPU);

7) суммирование времен расплавления слоев;

8) освобождение памяти хоста и девайса.

2_cuda

Рисунок 3 – Алгоритм реализации функции на CPU

В таблице 1 представленно время выполнения задачи на CPU и GPU в зависимости от количества слоев выделяемых в частице.

Таблица 1 – Сравнение времени выполнения задачи на CPU и GPU.

Количество слоев

Время выполнения на CPU (1 ядро 3.6 ГГц), c

Время выполнения на GPU (GeForce 560 Ti, 384 ядра), c

Выигрыш в производительности CPU/GPU

10 000

0.00528

0.000462

11.4

100 000

0.0545

0.00129

42.2

1 000 000

0.557

0.00962

57.9

10 000 000

5.778

0.0972

59.4

100 000 000

-

0.782

Как видно из таблицы 1 выигрыш в производительности GPU составляет от 11.4 до 59.4 раз. Наибольший выигрыш по производительности виден при увеличении количества слоев, так на GPU за одну секунду можно обработать на два порядка больше слоев, чем за тоже время на CPU.

Выводы

Технология параллельного программирования NVIDIA CUDA позволила увеличить производительность распараллеливаемого алгоритма расплавления частицы сложности N от 11 (при 10 000 слоев) до 60 раз (при 100 000 000). Для использования технологии CUDA требуется наличие графического процессора с поддержкой данной технологии, среда разработки и компилятор языка CUDA, знание языка CUDA C, а также хорошее знание задачи и возможности ее распараллеливания. В данной статье не рассматривается директива OPENACC, которая не требует знания языка CUDA С, но по данным автора [8] дает меньший прирост производительности в 5-10 раз.

Библиография
1. Боресков А.В., Харламов А.А. Основы работы с технологией CUDA. – М.: ДМК Прес, 2010. – 232 с.
2. Боресков А.В., Харламов А.А., Марковский Н.Д. и др. Параллельные вычисления на GPU. Архитектура и программная модель CUDA: Учеб. пособие. – М.: Издательство Московского университета, 2012. – 336 с.
3. Сандерс Дж., Кэндрот Э. Технология CUDA в примерах: введение в программирование графических процессоров: Пер. с англ. Слинкина А.А., научный редактор Боресков А.В. – М.: ДМК Пресс, 2011. – 232 с.
4. Cook S. CUDA programming. A Developer’s Guide to Parallel Computing with GPUs. – Morgan Kaufmann, 2013. – 576 p.
5. Cheng J., Grossman M., McKercher T. Professional CUDA C programming. – Wiley, 2014. – 497 p.
6. Астахова И.Ф., Коробкин Е.А. Применение технологии CUDA для симуляции частиц при параллельном программировании. - Программные продукты и системы. - 2013. № 1. - С. 146-150.
7. Крупянский Д.С., Лобов Д.В., Осауленко Р.Н. Реализация метода молекулярной динамики посредством технологии NVIDIA CUDA. - Ученые записки Петрозаводского государственного университета. Серия: Естественные и технические науки. - 2013. № 2 (131). - С. 84-86.
8. Перепёлкин Е. Nvidia CUDA и OPENACC. Бесплатный онлайн курс [Электронный ресурс]. Режим доступа: http://www.ispras.ru/conf/2014/nvidia/Lecture_1_v_23_08_2014.webm (Дата обращения 19.04.2016).
9. Сеченов П.А., Оленников А.А. Цымбал В.П. Исследование динамики изменения состава шлака в зонной модели колонного струйно-эмульсионного реактора // В сборнике: Творческое наследие В. Е. Грум-Гржимайло: история, современное состояние, будущее. – 2014. – С. 105-110.
10. Цымбал В.П., Павлов В.В., Сеченов П.А., Оленников А.А. Имитационное моделирование взаимодействия дисперсных частиц в агрегате СЭР и гравитационная сепарация. - Черные металлы. - 2016. № 6 (1014). - С. 54-60.
11. Сеченов П.А., Цымбал В.П. Имитационное моделирование гравитационного сепаратора в колонном струйно-эмульсионном реакторе. - Известия высших учебных заведений. Черная металлургия. - 2016. Т. 59. № 4. - С. 278-283.
12. Сеченов П.А. Алгоритм и программная реализация имитационной модели гравитационного сепаратора колонного струйно-эмульсионного реактора. - Программные продукты и системы. - 2015. № 3 (111). - С. 214-219.
13. Телегин А.С., Швыдкий В.С., Ярошенко Ю.Г. Тепло-массоперенос: Учебник для вузов. – М.: Металлургия, 1995. – 400 с.
14. Процесс Ромелт / Под ред. В.А. Роменца – М.: МИСИС, Издательский дом «Руда и металл», 2005. – 400с.
15. Шелудяк Ю.Е., Кашпоров Л.Я. и др. Теплофизические свойства компонентов горючих систем. М. 1992. – 184 с.
References
1. Boreskov A.V., Kharlamov A.A. Osnovy raboty s tekhnologiei CUDA. – M.: DMK Pres, 2010. – 232 s.
2. Boreskov A.V., Kharlamov A.A., Markovskii N.D. i dr. Parallel'nye vychisleniya na GPU. Arkhitektura i programmnaya model' CUDA: Ucheb. posobie. – M.: Izdatel'stvo Moskovskogo universiteta, 2012. – 336 s.
3. Sanders Dzh., Kendrot E. Tekhnologiya CUDA v primerakh: vvedenie v programmirovanie graficheskikh protsessorov: Per. s angl. Slinkina A.A., nauchnyi redaktor Boreskov A.V. – M.: DMK Press, 2011. – 232 s.
4. Cook S. CUDA programming. A Developer’s Guide to Parallel Computing with GPUs. – Morgan Kaufmann, 2013. – 576 p.
5. Cheng J., Grossman M., McKercher T. Professional CUDA C programming. – Wiley, 2014. – 497 p.
6. Astakhova I.F., Korobkin E.A. Primenenie tekhnologii CUDA dlya simulyatsii chastits pri parallel'nom programmirovanii. - Programmnye produkty i sistemy. - 2013. № 1. - S. 146-150.
7. Krupyanskii D.S., Lobov D.V., Osaulenko R.N. Realizatsiya metoda molekulyarnoi dinamiki posredstvom tekhnologii NVIDIA CUDA. - Uchenye zapiski Petrozavodskogo gosudarstvennogo universiteta. Seriya: Estestvennye i tekhnicheskie nauki. - 2013. № 2 (131). - S. 84-86.
8. Perepelkin E. Nvidia CUDA i OPENACC. Besplatnyi onlain kurs [Elektronnyi resurs]. Rezhim dostupa: http://www.ispras.ru/conf/2014/nvidia/Lecture_1_v_23_08_2014.webm (Data obrashcheniya 19.04.2016).
9. Sechenov P.A., Olennikov A.A. Tsymbal V.P. Issledovanie dinamiki izmeneniya sostava shlaka v zonnoi modeli kolonnogo struino-emul'sionnogo reaktora // V sbornike: Tvorcheskoe nasledie V. E. Grum-Grzhimailo: istoriya, sovremennoe sostoyanie, budushchee. – 2014. – S. 105-110.
10. Tsymbal V.P., Pavlov V.V., Sechenov P.A., Olennikov A.A. Imitatsionnoe modelirovanie vzaimodeistviya dispersnykh chastits v agregate SER i gravitatsionnaya separatsiya. - Chernye metally. - 2016. № 6 (1014). - S. 54-60.
11. Sechenov P.A., Tsymbal V.P. Imitatsionnoe modelirovanie gravitatsionnogo separatora v kolonnom struino-emul'sionnom reaktore. - Izvestiya vysshikh uchebnykh zavedenii. Chernaya metallurgiya. - 2016. T. 59. № 4. - S. 278-283.
12. Sechenov P.A. Algoritm i programmnaya realizatsiya imitatsionnoi modeli gravitatsionnogo separatora kolonnogo struino-emul'sionnogo reaktora. - Programmnye produkty i sistemy. - 2015. № 3 (111). - S. 214-219.
13. Telegin A.S., Shvydkii V.S., Yaroshenko Yu.G. Teplo-massoperenos: Uchebnik dlya vuzov. – M.: Metallurgiya, 1995. – 400 s.
14. Protsess Romelt / Pod red. V.A. Romentsa – M.: MISIS, Izdatel'skii dom «Ruda i metall», 2005. – 400s.
15. Sheludyak Yu.E., Kashporov L.Ya. i dr. Teplofizicheskie svoistva komponentov goryuchikh sistem. M. 1992. – 184 s.