
- •Аннотация
- •Оглавление
- •Введение
- •1. Графические ускорители – как эффективный путь повышения производительности вычислительных архитектур
- •1.1. Этапы развития графических ускорителей и их устройство
- •1.1.1. Основная терминология и устройство графического адаптера
- •1.1.2. Архитектура современныхGpu
- •1.2. Подход к использованию графических ускорителей для вычислений общего назначения
- •1.2.1.GpgpUподход
- •1.2.2. Гибридные вычислительные системы
- •1.2.3. Программная модельCuda
- •1.3.OpenAcc. Новейший стандарт разработкиGpgpu-приложений
- •1.3.1. Возможности стандарта
- •1.3.2. Модель выполнения
- •1.3.3. Модель памяти
- •1.4. Выводы по разделу 1
- •2. Постановка задачи магистерской диссертации
- •2.1. Цели и задачи исследования
- •2.2. Математическая постановка задачи решения трехдиагональной системы линейных уравнений методом блочной прогонки
- •2.3. Разработка параллельного алгоритма для решения трехдиагональной системы линейных уравнений
- •2.4. Выводы по разделу 2
- •3. Реализация и исследование разработанного алгоритма
- •3.1. Структура параллельной программы и особенности реализации
- •3.2. Результаты тестирования
- •3.3. Анализ результатов
- •3.4. Выводы по разделу 3
- •Заключение
- •Список использованных источников
- •Приложение 1. История развития графических ускорителей и их устройство
- •1.1. Устройство графического адаптера
- •1.2. Рынок графических адаптеров
- •1.3. АрхитектураGpugt200
- •1.4. Современное положение дел
- •Приложение 2. Основная часть программного кода разработанного приложения
2.4. Выводы по разделу 2
В данном разделе были определены цели и задачи исследования магистерской диссертации. Дана математическая постановка задачи, приведены математические выкладки по приведению двухточечной краевой задачи к системе линейных алгебраических уравнений с трехдиагональной матрицей коэффициентов, удовлетворяющей условиям преобладания диагональных элементов. В 2.3. представлен разработанный параллельный алгоритм блочной прогонки, который основан на блочном разделении данных.
3. Реализация и исследование разработанного алгоритма
В данном разделе рассмотрены некоторые вопросы программной реализации на языке C++ решения двухточечной краевой задачи, которая сводится к трехдиагональной системе линейных уравнений, методом параллельной блочной прогонки. В 3.1. описано разработанное программное приложение: структурное деление приложения на модули и этапа работы параллельной программы. В 3.2. приведены результаты тестирования приложения.
3.1. Структура параллельной программы и особенности реализации
Разработанное программное приложение состоит из трёх модулей:
PrepareData – подготовка данных;
Compute – процесс параллельного вычисления;
PrepareResult – получение результата.
Данное разделение программы на модули соответствует этапам выполнения параллельной программы на GPU, описанным в 1.2.3. Согласно этим этапам, первым модуль отвечает за:
выделение памяти на GPU;
копирование данных из памяти CPU в выделенную память GPU.
Второй модуль отвечает за выполнение вычислений на GPUи третий модуль отвечает за:
копирование результатов вычислений обратно в память CPU;
освобождение выделенной памяти GPU.
Передачу управления от модуля к модулю осуществляет главная программа (main), которая, также, выполняет начальную подготовку данных на хосте и вывод результата.
Для решения исходной задачи на графическом ускорителе задача разбивается на набор отдельных подзадач, решаемых независимо друг от друга. Разбиение исходной задачи на набор независимых подзадач согласно рисунку 1.6 в 1.2.3. нашло своё отражение в разработанном параллельном алгоритме в разделе 2.3.
Рисунок 3.1. Этапы работы разработанной параллельной программы
Так, к трехдиагональной системе линейных уравнений, точнее, к её матрице коэффициентов применяется блочный подход к разбиению данных. Данная СЛАУ была получена путём применения ряда преобразований к исходной краевой задачи.
После разбиения матрицы коэффициентов на полосы, начинаются прямой, а затем обратный проходы параллельного алгоритма блочной прогонки. Модифицированный алгоритм прогонки обрабатывает полосы матрицы параллельно и независимо, что соответствует методологии вычислений на графических ускорителях; иначе, эффективное решение поставленной задачи было бы невозможно.
На схеме на рис. 3.1 подробнее отображены этапы работы параллельной программы. Здесь, зелёным цветом выделены этапы, за которые отвечают модули 1 и 3, синим цветом – модуль 2 и серым цветом – функция main.
В работе было предложено и реализовано два варианта решения, со следующими особенностями:
в первом – память выделялась под все элементы матрицы коэффициентов A;
во втором – память не выделялась под нулевые элементы матрицы A, а только под элементы главной и двух побочных (нижней и верхней) диагоналей, что позволило добиться существенной экономии ресурсов и сокращения времени на передачу данных между хостом и ускорителем.
Результаты тестирования этих реализаций приведены в 3.2. При написании использовался стандарт OpenACC, язык –C++, компилятор –pgccв составеPGIWorkstation14.3. Ниже приведены основные директивы, которые были задействованы при написании параллельной программы наOpenACC:
#pragma acc parallel ‑ основная конструкция, начинает параллельное выполнение на ускорителе,
#pragma acc data ‑ определяет данные, для которых требуется выделить память. Параметры:
copy– выделение памяти и копирование данных в память ускорителя перед началом выполнения параллельного участка и копирование обратно в память хоста после выполнения,
copyin– выделение памяти и копирование данных в память ускорителя перед началом выполнения параллельного участка и освобождение памяти после выполнения,
copyout– выделение памяти перед началом выполнения параллельного участка и копирование данных в память хоста после выполнения,
create– выделение памяти перед началом выполнения параллельного участка и освобождение памяти после выполнения,
present– данные уже находятся в памяти ускорителя,
#pragma acc loop ‑ указывает, что итерации цикла должны быть распараллелены.
Параметр independent– означает, что выполнение любой итерации не зависит от результатов выполнения других итераций; синхронизация отсутствует.