Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Исследование параллелизма при решении двухточечной краевой задачи на графических ускорителях NVIDIA (магистерская диссертация).docx
Скачиваний:
72
Добавлен:
28.06.2014
Размер:
1.59 Mб
Скачать

2.4. Выводы по разделу 2

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

3. Реализация и исследование разработанного алгоритма

В данном разделе рассмотрены некоторые вопросы программной реализации на языке C++ решения двухточечной краевой задачи, которая сводится к трехдиагональной системе линейных уравнений, методом параллельной блочной прогонки. В 3.1. описано разработанное программное приложение: структурное деление приложения на модули и этапа работы параллельной программы. В 3.2. приведены результаты тестирования приложения.

3.1. Структура параллельной программы и особенности реализации

Разработанное программное приложение состоит из трёх модулей:

  1. PrepareData – подготовка данных;

  2. Compute – процесс параллельного вычисления;

  3. 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– означает, что выполнение любой итерации не зависит от результатов выполнения других итераций; синхронизация отсутствует.