Поздравляем с Днем народного единства!
   
Телефон: 8-800-350-22-65
WhatsApp: 8-800-350-22-65
Telegram: sibac
Прием заявок круглосуточно
График работы офиса: с 9.00 до 18.00 Нск (5.00 - 14.00 Мск)

Статья опубликована в рамках: Научного журнала «Студенческий» № 12(32)

Рубрика журнала: Информационные технологии

Скачать книгу(-и): скачать журнал часть 1, скачать журнал часть 2, скачать журнал часть 3, скачать журнал часть 4, скачать журнал часть 5

Библиографическое описание:
Захаров В.Г. ПРИМЕНЕНИЕ ТЕХНОЛОГИИ CUDA ДЛЯ УСКОРЕНИЯ ВЫЧИСЛЕНИЯ СУММ ДВУМЕРНЫХ МАССИВОВ // Студенческий: электрон. научн. журн. 2018. № 12(32). URL: https://sibac.info/journal/student/32/112920 (дата обращения: 04.11.2024).

ПРИМЕНЕНИЕ ТЕХНОЛОГИИ CUDA ДЛЯ УСКОРЕНИЯ ВЫЧИСЛЕНИЯ СУММ ДВУМЕРНЫХ МАССИВОВ

Захаров Владислав Геннадьевич

магистрант, кафедра Автоматизированных систем управления Московского Технического Университета – МТУ,

РФ, г. Москва

ВВЕДЕНИЕ

Огромное количество процессорных элементов на одном чипе – общая особенность современных микроархитектур. Большинство из них представлены высоко параллельными процессорами, одним из которых является графический процессор (GPU). В графических процессорах NVIDIA, начиная с восьмой серии, реализована архитектура параллельных вычислений CUDA, которая предоставляет возможность использовать специальный программный интерфейс для не графических вычислений. CUDA (Compute Unified Device Architecture) – это программно-аппаратная архитектура параллельных вычислений, которая позволяет существенно увеличить вычислительную производительность за счёт использования графических процессоров компании NVIDIA [1, с. 21].

Большинство вычислительно ёмких научных и инженерных приложений тратят значительную часть времени на множественное выполнение одинаковых последовательностей операций – циклов. Использование CUDA в подобных программах, может увеличить скорость работы приложения. В данной статье будет рассматриваться использование CUDA для ускорения одного из базовых, но тем не менее часто встречающегося алгоритма сложения двух двумерных массивов.

Постановка задачи.

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

Пусть A[N][N] и B[N][N] – две матрицы, размерности N x N, C[N][N] – матрица, получающаяся в результате сложения матриц A и B. Требуется написать программу, код которой будет разделён на две части. Первая часть будет вычислять матрицу C используя центральный процессор. Вторая часть будет вычислять матрицу C используя архитектуру CUDA и графический процессор. На выходе программа предоставит время, затраченное графическим и центральным процессорами на расчёт матрицы. Далее, требуется оценить ускорение, полученное за счёт использования графического процессора. Оценим ускорение с помощью коэффициента ускорения S, который определим, как:

                                                                     (1)

 – время, потраченное графическим процессором на вычисление матрицы C;

 – время, потраченное центральным процессором на вычисление матрицы C.

Идея распараллеливания заключается в том, чтобы получить ускорение за счёт одновременного выполнения некоторых, определённых операций. Рассмотрим механизм распараллеливания более детально. На рисунке 1 показан код исполняемый центральным процессором для вычисления матрицы C.

 

Рисунок 1. Вычисление матрицы на CPU

 

Данный код поочерёдно выбирает (i;j)-й элементы матриц A и B, вычисляет их индексы в соответствии с принципом линеаризации по строкам. Далее идёт поочерёдное сложение элементов. Важно заметить, что все вычисления выполняются одним ядром.

Теперь рассмотрим код выполняющийся на графическом процессоре. Для этого нам необходимо рассмотреть саму модель вычислений с использованием NVIDIA CUDA. Основными понятиями являются ядро (kernel) и нить (thread). Ядро – это вычислительная процедура, предназначенная для исполнения на графическом процессоре. Вызванное ядро исполняется указанное количество раз с параллелизмом на уровне экземпляров. Нить – это один из параллельно исполняющихся на графическом процессоре экземпляров ядра. Нити исполняют одинаковый набор команд, однако, путь его исполнения и обрабатываемые данные могут отличаться для отдельных нитей. Нити организуются в блоки (block) – геометрически идентичные структуры размерностью от 1 до 3. Так - же CUDA предоставляет расширения для языка C, добавляя новые спецификаторы функций и переменных и специальные переменные [2, с. 20]. Программа должна начинаться с определения ядра. На рисунке 2 можно увидеть код ядра.

 

Рисунок 2. Описание ядра.

 

 

После этого, мы должны выделить необходимую память со стороны графического процессора и передать ему данные. В нашем случае – это матрицы A и B. Матрицы заполнены случайными числами от 1 до 10000. Далее, мы определяем количество блоков и количество нитей в одном блоке. Это можно увидеть на рисунке 3.

 

Рисунок 3. Определение количества необходимых блоков и нитей, запуск ядра

 

Закончив подготовительный этап, мы выполняем вызов функции ядра, для вычисления нашей матрицы. Важно заметить, что в отличие от центрального процессора, который задействует одно ядро и вычисляет элементы матрицы поочерёдно, графический процессор распределяет все вычисления между блоками и с помощью нитей, производит их одновременно. Таким образом, мы получаем не вычисление одного элемента матрицы поочерёдно, а одновременное вычисление большого количества элементов.

Время работы CPU измерялось с помощью gettimeoftheday(). Время работы GPU определялось с помощью CUDA Events [3, с. 58].

Вычисления проводились на ЭВМ со следующими характеристиками: Процессор Intel(R) Xeon(R) CPU E5-2690 v2 @ 3.00GHz, 4 ядра;

Видеокарта NVIDIA Tesla K20Xm.

Результаты вычислений представлены на рисунке 4.

 

Рисунок 4. Таблица с результатом вычислений

 

В таблице под N следует понимать не общее число элементов матрицы, а число элементов в одной строке/столбце. Данная замена была сделана лишь в таблице для удобства представления данных. Исходя из полученных данных, можно сделать вывод о том, что с ростом числа элементов матрицы наблюдается заметный рост коэффициента ускорения. Исходя из этого можно заключить, что при большом количестве данных для вычислений, выгоднее использовать графический процессор. Для наглядности результатов, по данным таблицы из рисунка 4 был построен график зависимости коэффициента ускорения S, от числа элементов матрицы N.

 

Рисунок 5. График зависимости коэффициента ускорения от числа элементов матрицы

 

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

 

Список литературы:

  1. А.В. Боресков и др. Предисл.: В. А. Садовничий, “Параллельные вычисления на GPU.Архитектура и программная модель CUDA” – М.: учебное пособие: Издательство Московского университета, 2012 – 336 с.
  2. А. В. Боресков, А. А. Харламов, “Основы работы с технологией CUDA”, ДМК Пресс, Москва, 2010 г. 234 с.
  3. CUDA Runtime API, 2017 г. [Электронный ресурс]. – URL: https://docs.nvidia.com/cuda/pdf/CUDA_Runtime_API.pdf (дата обращения (10.06.2018))

Оставить комментарий

Форма обратной связи о взаимодействии с сайтом
CAPTCHA
Этот вопрос задается для того, чтобы выяснить, являетесь ли Вы человеком или представляете из себя автоматическую спам-рассылку.