Статья 'Применение технологии параллельного программирования NVIDIA CUDA в задаче расплавления шарообразной частицы' - журнал 'Кибернетика и программирование' - NotaBene.ru
по
Journal Menu
> Issues > Rubrics > About journal > Authors > About the Journal > Requirements for publication > Council of Editors > Peer-review process > Policy of publication. Aims & Scope. > Article retraction > Ethics > Online First Pre-Publication > Copyright & Licensing Policy > Digital archiving policy > Open Access Policy > Article Processing Charge > Article Identification Policy > Plagiarism check policy
Journals in science databases
About the Journal

MAIN PAGE > Back to contents
Cybernetics and programming
Reference:

Application of NVIDIA CUDA parallel programming technology in the task of melting a spherical particle

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
Other publications by this author
 

 
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
Other publications by this author
 

 

DOI:

10.25136/2644-5522.2018.5.20345

Received:

10-09-2016


Published:

25-11-2018


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

This article written in Russian. You can find original text of the article here .
Введение

Целью работы является сравнение производительности программы расплавления шарообразной частицы решаемой на центральном процессоре (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 раз.

References
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
Link to this article

You can simply select and copy link from below text field.


Other our sites:
Official Website of NOTA BENE / Aurora Group s.r.o.