Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

8654

.pdf
Скачиваний:
0
Добавлен:
25.11.2023
Размер:
1.77 Mб
Скачать

ЛАБОРАТОРНАЯ РАБОТА № 5

Тема: Создание консольного многопоточного Windows-приложения, выполняющего перемножение двух матриц для систем с распределённой памятью.

Цель работы: Изучение обобщенной передачи данных от одного процесса всем процессам (функция MPI_Scatter()) и обобщенной передачи данных от всех процессов одному процессу (функция MPI_Gather()).

Лабораторная работа состоит из трёх последовательно выполняемых заданий.

1.Написать последовательную программу перемножения квадратных матриц A(N,N) и B(N,N).

2.Написать параллельную программу на основе технологии MPI.

3.Построить графики зависимости времени выполнения последовательного и параллельного алгоритмов от размера матриц А и В и числа процессов. Проанализировать эффективность параллельного алгоритма.

Пояснения к выполнению работы

1. Написание последовательной программы перемножения квадратных матриц A(N,N) и B(N,N).

1.1.Создать пустой проект консольного Windows – приложения в среде Visual С++ (см. Лабораторная работа №1).

1.2.Написать код, включающий в себя:

- инициализацию

например,

A

 

 

aij

элементов

, a i j, B ij

матриц

 

,

bij

 

bij

 

 

А и В произвольными значениями,

i * j .

-вывод на экран значений элементов массивов А и В.

-вычисление результирующей матрицы С.

-вывод на экран результатов вычислений в виде таблицы.

Алгоритм перемножения матриц A(N,N) и B(N,N) представлен на блок-схеме (рис. 18). В связи с тем, что нумерация элементов массива на языке Си начинается с нуля, циклы для массива размером N в приведённой блок-схеме организованы от нуля до N-1.

1.3. Запустить программу.

Начало

Ввод размера N матриц

Организация двойного цикла по номеру строки i и по номеру столбца j

от 0 до N-1

Инициализация матриц A[i][j]=B[i][j]=i*j

Вывод эл-тов матриц A и B на экран

Организация двойного цикла по номеру строки i и по номеру столбца j

от 0 до N-1

С[i][j]=0

Организация цикла по k от 0 до N-1

Вычисление результирующей матрицы С

С[i][j]=С[i][j]+А[i][k]*В[k][j]

Организация двойного цикла по номеру строки i и по номеру столбца j

от 0 до N-1

Вывод эл-тов матрицы С на экран

Конец

Рис. 18. Блок-схема алгоритма перемножения матриц A и B.

2. Написание параллельной программы перемножения квадратных матриц A(N,N) и B(N,N) на основе технологии MPI.

Распараллеливание программы можно выполнить по алгоритму, основанному на разделении матриц на строки (рис. 19). Элементы матриц A и B инициализируются некоторыми значениями на нулевом процессе, а затем элементы матрицы B рассылаются на все процессы. Матрица A разбивается построчно на (N/numprocs) блоков – подматриц AA, где numprocs – число процессов. Подматрицы AA распределяются по процессам. Таким образом, что на каждом процессе размещается подматрица AA (блок со строками матрицы A) и матрица B. Каждый процесс последовательно выполняет перемножение строк «своей» подматрицы AA на столбцы матрицы B. В результате перемножения каждый процесс имеет результирующую подматрицу CC (блок строк результирующей матрицы C).После чего каждый процесс отсылает элементы «своей» подматрицы CC на нулевой процесс, где из подматриц CC формируется результирующая матрица C.

Рис. 19. Общая схема передачи данных для параллельного алгоритма матричного умножения при ленточной схеме разделения данных

Программа должна предусматривать

следующую последовательность

операций.

 

2.1. На нулевом процессе вводится размер матриц (N) и определяется количество строк матрицы A для каждого процесса (p = N/numprocs).

2.2.Рассылаются величины N и p с нулевого процесса всем процессам, используя функцию MPI_Bcast().

2.3.На всех процессах создаются массивы A, B, C. Матрицы A, B, C следует представить в виде одномерных массивов A(N*N), B(N*N), C(N*N).

2.4.На нулевом процессе инициализируются матрицы A и B значениями (аналогично последовательному алгоритму) с выводом результатов на экран.

2.5.Матрица B рассылается всем процессам.

2.6.Элементы матрицы А рассылаются блоками по (N*p) элементов всем процессам, используя функцию MPI_Scatter(). Так чтобы каждый процесс получил «свою» подматрицу АА с размерностью N*p.

2.7.На всех процессах выполняется перемножение подматрицы АА на матрицу В получая тем самым подматрицу СС(N*p).

2.8.Собираются результаты со всех процессов из подматриц СС на нулевом процессе в матрицу С, используя функцию MPI_Gather().

2.9.Выводятся на нулевом процессе элементы матрицы С на экран.

3. Построение графиков зависимости времени выполнения последовательного и параллельного алгоритмов от размера матриц А и В и числа процессов.

3.1.Добавьте в проект реализацию параллельного и последовательного алгоритмов.

3.2.Выполните замеры времени выполнения всех алгоритмов только для параллельного фрагмента кода, где выполняется непосредсвенно перемножение, а также соответсвующего фрагмента кода в последоветельном алгоритме.

3.3.Проведите 15 экспериментов изменяя число процессов (p) и размер (N) массивов А и В (N должно быть кратно p) так, чтобы для каждой конфигурации вычислительной системы (количества процессов) было выполнено по пять вычислений с разным размером масссивов. Каждый процесс должен выполняться на одном процессоре (ядре). Размер массивов выбирайте таким образом, чтобы время выполнения алгоритмов составляло не менее 20 секунд. Результаты экспериментов занесите в Таблицу 4.

 

 

 

 

 

Таблица 4

 

 

 

 

 

 

 

Кол-во

Размер

Время

Время

Ускор

Эффек

 

процессов /

массив

выполнения

выполнения

ение

тивнос

 

вычислител

ов (N)

последователь

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

(Sp)

ть (Ep)

 

ьных узлов

 

ного

алгоритма

 

 

 

кластера

 

алгоритма

(Tp), сек

 

 

 

 

 

(T1), сек

 

 

 

 

2/1

 

 

 

 

 

 

2/1

 

 

 

 

 

 

2/1

 

 

 

 

 

 

2/1

 

 

 

 

 

 

2/1

 

 

 

 

 

 

4/2

 

 

 

 

 

 

4/2

 

 

 

 

 

 

4/2

 

 

 

 

 

 

4/2

 

 

 

 

 

 

4/2

 

 

 

 

 

 

6/3

 

 

 

 

 

 

6/3

 

 

 

 

 

 

6/3

 

 

 

 

 

 

6/3

 

 

 

 

 

 

6/3

 

 

 

 

 

 

3.4.Вычислите ускорение (Sp = T1 / Tp) и эффективность (Ep = Sp / p) параллельной программы. По данным таблицы 4 постройте графики зависимостей ускорения и эффективности от числа процессов, разместив их как показано в Лабораторной работе №2 на рис. 13.

3.5.На основе полученных данных сформулируйте заключение об эффективности параллельного алгоритма.

ПРИЛОЖЕНИЕ 1. Установка среды MPICH2 на вычислительные узлы кластера (распределённой сети)

1. Запустите пакет установки mpich2-1.2.1-win-ia32.msi от Аргонской национальной лаборатории (для установки требуются права группы Администраторов). Изучите системные требования (рис. П1.1) и лицензионное соглашение (рис. П1.2).

Рис. П1.1. Информация об MPICH2

Рис. П1.2. Лицензионное соглашение

2. В окне запроса парольной фразы (Passphrase) задайте кодовое слово, например, «mpi» (рис. П1.3). Внимание: парольная фраза должна быть одинаковая для всех вычислительных узлов кластера (распределённой сети).

Рис. П1.3. Ввод парольной фразы

3. В соответствующем окне (рис. П1.4) укажите путь для установки MPICH2, а также пользователей, для которых выполняется установка (выберите

«Everyone»).

Рис. П1.4. Выбор инсталляционной папки

4.По окончании установки появится окно, показанное на рис. П1.5.

5.Установка MPICH2 должна быть выполнена на всех вычислительных узлах.

Рис. П1.5. Завершение установки

ПРИЛОЖЕНИЕ 2. Подключение библиотеки MPI в С-проект MS VS2010

1. В свойствах проекта Проект – Свойства (Project – Properties) выбрать пункт C/C++ - Общие – Дополнительные каталоги включаемых файлов (C/C++ - General – Additional Include Directories) и указать путь к папке \MPICH2\include

(рис. П2.1).

Рис. П2.1. Подключение mpi-библиотеки

2.В свойствах проекта Проект – Свойства (Project – Properties) выбрать пункт Компоновщик – Общие – Дополнительные каталоги библиотек (Linker - General – Additional Library Directories) и указать путь к папке \MPICH2\lib (рис.

П2.2).

3.В свойствах проекта Проект – Свойства (Project – Properties) выбрать пункт Компоновщик – Ввод – Дополнительные зависимости (Linker - Input – Additional Dependencies) и указать библиотеку mpi.lib (рис. П2.3).

Рис. П2.2. Подключение mpi-библиотеки

Рис. П2.3. Подключение mpi-библиотеки

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]