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

Применение технологии параллельного программирования Nvidia CUDA в задаче расплавления шарообразной частицы Текст научной статьи по специальности «Компьютерные и информационные науки»

CC BY-NC
183
39
i Надоели баннеры? Вы всегда можете отключить рекламу.
Ключевые слова
ЗАКОН АМДАЛА / ЯЗЫК С# / ЯЗЫК CUDA C / РАСПЛАВЛЕНИЕ ЧАСТИЦЫ / ЦЕНТРАЛЬНЫЙ ПРОЦЕССОР / ГРАФИЧЕСКИЙ ПРОЦЕССОР / ПАРАЛЛЕЛЬНОЕ ПРОГРАММИРОВАНИЕ / ПРОИЗВОДИТЕЛЬНОСТЬ АЛГОРИТМА / ВРЕМЯ ВЫПОЛНЕНИЯ / ЯЗЫК ВЫСОКОГО УРОВНЯ

Аннотация научной статьи по компьютерным и информационным наукам, автор научной работы — Сеченов Павел Александрович, Оленников Алексей Александрович

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

i Надоели баннеры? Вы всегда можете отключить рекламу.

Похожие темы научных работ по компьютерным и информационным наукам , автор научной работы — Сеченов Павел Александрович, Оленников Алексей Александрович

iНе можете найти то, что вам нужно? Попробуйте сервис подбора литературы.
i Надоели баннеры? Вы всегда можете отключить рекламу.

Текст научной работы на тему «Применение технологии параллельного программирования Nvidia CUDA в задаче расплавления шарообразной частицы»

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

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

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

старший преподаватель, кафедра прикладных информационных технологий и программирования,

Сибирский государственный индустриальный университет

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

И pavesa89@mail.ru

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

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

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

индустриальный университет

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

И tgsv-sibsiu@mail.ru

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

Аннотация.

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

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

DOI:

10.25136/2306-4196.2018.5.20345 Дата направления в редакцию:

10-09-2016

Дата рецензирования:

17-09-2016

Введение

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

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

Одной из важнейших характеристик любого вычислительного устройство является производительность. Процессоры архитектуры x86, c момента появления в 1978 году, увеличили свою тактовую частоту с 4,77 МГц до 3 ГГц, т.е. более чем в 600 раз, однако в

последние несколько лет рост частоты более не наблюдается -Ш. Это связанно как с ограничениями технологии производства микросхем, так и с тем, что энергопотребление (а значит и выделение тепла) пропорционально четвертой степени частоты. Таким образом, увеличение тактовой частоты всего в 2 раза приводит к увеличению

тепловыделения в 16 раз В настоящее время рост производительности идёт в основном за счет увеличения числа параллельно работающих ядер, т.е. за счет параллелизма (даже в современных смартфонах число ядер 4-8, а тактовая частота ниже чем у персонального компьютера, что ограничивается возможностями отвода тепла в смартфонах).

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

I I (1)

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

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

На сайте производителя графических процессоров NVIDIA обучающий онлайн курс позволяет освоить основы параллельного программирования. Автор данного курса производит измерение скорости программ на CPU и GPU как с использованием

низкоуровневого программирования на языке CUDA C, так и с использованием программного стандарта параллельного программирования OPENACC, который позволяет программисту абстрагироваться от особенностей инициализации графического процессора, вопросов передачи данных на сопроцессор и обратно. При этом наибольшую производительность для параллельных алгоритмов дает программирование на низкоуровневом языке CUDA C в сравнении с использованием OPENACC.

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

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

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

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

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

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

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

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

| | (2)

где: [J - плотность; | - теплоёмкость; | | - температура плавления.

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

| | (3)

где: | - коэффициент теплоотдачи, | | - температура среды; | - температура

слоя.

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

| ~ (4)

Данные по теплофизическим константам , | | , | взяты из источников

1141,1151.

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

(5)

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

Т среды - 1823 К расплавляемый слой

Слой, расплавленный на I предыдущем шаге

нагребаемый слой Те центре

Состояние тиара и млмен. нречени I ¡; Сведшие ширя в иимснг ярсмснн T=i+1;

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

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

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

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

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

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

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

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

thredID = threadldx.x + blockldx.x * blcockDim.x

где: threadldx - номер нити в блоке;

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

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

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

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

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

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

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

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

параллельно.

1 _global_ void myFunc<double *dT, int size, float dfirst, float dnext, float p, float cp, float Tpl, float alfT, float tsr ){

V

2 int i = bloekldx.x * bloekDim.x + threadldx.x;

3 firstR - dfirst - i * dnext; nextR = firstR - dnext;

4 if (i < size) {dT[i] = (4 / 3 + Pi * (_powf(firstR, 3) - _powf(nextR, 3)) * p * cp * Tpl) / (alfT * (tsr - tsl) * 4 * Pi * _powf(firstR, 2));}}

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

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

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

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

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

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

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

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

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

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

1 int main(int argc, char* argv[])

+

2 cudaHostAlloc((void**) BhT, mem_size, cjdaHostAllocDefault); cudaMalloc^veid**) SdT, mem_size);

+

3 if ((size К N_thread} == B) N_blocks = size / N_thread; else Nblocks = (int)(size / Nthread) + 1;

T

л cudaMemcpy(dT, hT, nem_sizeJ cudaMemcpyHostToDevice);

+

iНе можете найти то, что вам нужно? Попробуйте сервис подбора литературы.

5 myFunc <«: <N_blocks, N_threac( » > (dT, size, 0.95, 0.05 / size, 360O, B70, 1799, 56B, 1S23>;

T

6 cudaMemcpy(hT, dT, iriem_size., cudaMemcpyDeviceToHost);

+

7 for (i = 0; i < size; i++) sum += hT[l];

T

8 cudaFreeHostt hT); cudaFree( dT);

Рисунок 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 С, но по данным автора дает меньший прирост производительности в 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 с.

i Надоели баннеры? Вы всегда можете отключить рекламу.