- •1. Программная система Параллельная Лаборатория
- •2. Демонстрационный пример.
- •3. Выбор топологии сети.
- •4. Характеристики топологии сети.
- •1. Методы передачи данных
- •2. Анализ трудоемкости основных операций передачи данных
- •2.1. Передача данных между двумя процессорами сети
- •2.2. Передача данных от одного процессора всем остальным процессорам сети
- •1. Принципы работы mpich
- •2. Установка mpich в Windows
- •3. Запуск с помощью mpiRun. Exe.
- •4. Процедура mpiConfig. Exe.
- •5. Процедура mpiRegister. Exe.
- •6. Задание:
- •1. Основные функции системы программирования mpi.
- •2. Создание mpi-программы в Visual Studio
- •3. Пример параллельной программы с использованием функций mpi.
- •4. Практическое задание:
- •1.Постановка задачи
- •2. Умножение матриц при ленточной схеме разделения данных.
- •2. Программа умножения матрицы на вектор
- •3. Задания и упражнения:
- •1. Постановка задачи.
- •2. Умножение матриц при ленточной схеме разделения данных.
- •3. Алгоритмы Фокса.
- •5. Алгоритм умножения матрицы на матрицу.
- •6. Задания и упражнения:
2. Создание mpi-программы в Visual Studio
Прежде всего, нужно настроить Visual Studio, чтобы он находил заголовочные файлы и .lib-библиотеки MPICH. Для этого запустите Visual Studio и нажмите Tools → Options, в дереве слева выберите Projects and Solutions → VC++ Directories. Справа-вверху выберите Show directories for: Include files. Нажмите кнопочку с жёлтой папочкой и добавьте путь к .h-файлам:
Рисунок 4.1. Настройка пути к заголовочным файлам MPICH.
После этого проделайте ту же процедуру для библиотек (Show directories for: Library files):
Рисунок 4.2. Настройка пути к библиотечным файлам MPICH
Теперь создайте консольный проект:
Прежде всего, нужно запустить Visual Studio, и выбрать File → New → Project... Появится окно создания проекта. Выберите тип проекта «Win32», шаблон — «Win32 Console Application». Введите осмысленное имя проекта, выберите папку для хранения проекта, уберите галочку «Create directory for solution»:
Рисунок 4.3. Окно создания проекта
Нажмите кнопку «OK», появится окно настройки будущего проекта. Выберите вкладку «Application Settings», и включите галку «Empty project»:
Рисунок 4.4. Окно настройки будущего проекта
По нажатию кнопки «Finish» проект будет создан. Никаких видимых изменений в главном окне Visual Studio не произойдёт. Только имя проекта в заголовке окна как бы говорит нам о том, что мы работаем с проектом.
Рисунок 4.5. Окно добавления элементов в проект
После этого вам будет предоставлено окно для ввода исходного кода программы.
Теперь нажмите Project → Add New Item, появится окно добавления элементов в проект. Добавьте .cpp-файл в проект:
Откройте окно настроек проекта (Project → Properties), выберите Configuration: All Configurations, в дереве слева выберите Configuration Properties → Linker → Input. Добавьте mpi.lib в поле Additional Dependencies справа:
Рисунок 4.6. Добавление mpi.lib к програмне
3. Пример параллельной программы с использованием функций mpi.
В качестве примера параллельной программы, написанной в стандарте MPI для языка С, рассмотрим программу вычисления числа π. Число π можно определить следующим образом:
. (6.1)
Вычисление интеграла затем заменяют вычислением суммы:
, (6.2)
где: xi = i/n.
Далее приведен код программы на языке С:
#include "mpi.h"
#include <math.h>
int main ( int argc, char *argv[ ] )
{ int n, myid, numprocs, i;
double mypi, pi, h, sum, x, t1, t2, PI25DT = 3.141592653589793238462643;
MPI_Init(&argc, &argv);
MPI_Comm_size(MPI_COMM_WORLD, &numprocs);
MPI_Comm_rank(MPI_COMM_WORLD,&myid);
while (1)
{if (myid == 0)
{ printf ("Enter the number of intervals: (0 quits) ");
scanf ("%d", &n);
t1 = MPI_Wtime();
}
MPI_Bcast(&n, 1, MPI_INT, 0, MPI_COMM_WORLD);
if (n == 0) break;
else
{ h = 1.0/ (double) n;
sum = 0.0;
for (i = myid +1; i <= n; i+= numprocs)
{ x = h * ( (double)i - 0.5);
sum += (4.0 / (1.0 + x*x));
}
mypi = h * sum;
MPI_Reduce(&mypi, &pi, 1, MPI_DOUBLE, MPI_SUM, 0,
MPI_COMM_WORLD);
if (myid == 0)
{ t2 = MPI_Wtime();
printf ("pi is approximately %.16f. Error is %.16f\n",pi, fabs(pi - PI25DT));
printf ("'time is %f seconds \n", t2-t1);
}
}
}
MPI_Finalize();
return 0;
}