- •Содержание курса
- •Общие сведения.
- •Топологии Виды топологий
- •Программирование «Трубы»
- •Программирование «Звезды»
- •Программирование «Клика»
- •Синхронный обмен данными
- •Функции синхронного обмена данными
- •Примеры:
- •Задание 1:
- •Задание 2:
- •Задание 3:
- •Асинхронный обмен данными
- •Функции необходимые для асинхронного обмена данными
- •Пример:
- •Определение времени вычисления на Parsytec.
- •Определение времени в программе
- •Структура компьютера
- •Константы, типы данных, структуры mpi
- •Тип данных mpi_Datatype
- •Предопределённые константы
- •Сообщения
- •Функции mpi
- •Функция передачи данных с блокировкой
- •Дополнительные функции
- •Виды параллелизма Геометрический (распараллеливание по пространству)
- •Функциональный (распараллеливание по процессам)
- •Конвейерный
- •Параллелизм типа принятия коллективного решения
- •Ускорение и эффективность вычислений на мвс
- •Метод Рунге-Кутта 4
- •2. Расчётные формулы:
- •3. Алгоритм распараллеливания.
- •Метод прогноза коррекции
- •2. Расчётные формулы
- •3. Алгоритм распараллеливания.
- •4. Ускорение вычислений.
- •4. Ускорение и точность вычислений.
- •Решение уравнений в частных производных
- •Колебания мембраны
- •2. Расчетные формулы
- •Решение стационарных уравнений на мвс
- •2. Расчётные формулы
- •Алгоритм распараллеливания.
- •Ускорение вычислений
- •Оптимизация на мвс
- •Расчётные формулы
- •Алгоритм распараллеливания
- •Ускорение вычислений.
Константы, типы данных, структуры mpi
Тип данных mpi_Datatype
-
Тип С++
Тип Datatype
char
MPI_CHAR
unsigned char
MPI_INSIGNED_CHAR
int
MPI_INT
unsigned int
MPI_UNSIGNED
float
MPI_FLOAT
double
MPI_DOUBLE
long double
MPI_LONG_DOUBLE
Аналогично для всех остальных типов данных
Предопределённые константы
MPI_SUCCESS – код удачного завершения функции;
MPI_ANY_SOURCE – идентификатор любого процесса отправителя;
MPI_ANY_TAG – идентификатор любого сообщения;
MPI_Comm – системный тип
typedef int MPI_Comm
MPI_COMM_WORLD – идентификатор всеобъемлющего коммуникатора принадлежащего всеобъемлющей группе.
Сообщения
Процессы взаимодействуют друг с другом с помощью передачи сообщений. Сообщение - набор данных некоторого типа. Сообщение имеет атрибуты. Одним из важных является идентификатор сообщений или TAG. Атрибуты сообщения записываются в поля структуры:
MPI_status
typedef struct {
int count; //количество передаваемой информации
int MPI_SOURCE; //идентификатор процесса отправителя
int MPI_TAG; //идентификатор сообщения
int MPI_ERROR;
} MPI_Status
Функции mpi
MPI_Init();
прототип функции
int MPI_Init (int #argc,char***argv);
Функция инициализирует параллельную часть программы. Может быть запущена только один раз. Использование всех параллельных функций возможно только после запуска этой функции MPI_Unit
Пример
Void main (int argc, char**argv){
MPI_Init (& argc, &argv);
}
Сложный вид аргументов функции MPI_Init связан с необходимостью передачи всем процессам аргументов командной строки.
MPI_Finalize ();
int MPI_Finalize ();
Завершает параллельную часть программы. После неё вызов параллельных функций недопустим. К моменту вызова функции MPI_Finalize на некотором процессе все параллельные функции на этом процессе должны быть завершены.
MPI_Comm_size ()
int MPI_Comm_size (MPI_Comm_comm, int * size)
MPI_Comm_comm – идентификатор коммутатора
int * size - количество процессоров в группе с идентификатором Comm.
Функция определяет число процессоров в группе с коммутатором Comm,
Например: int size
MPI_Comm_size (MPI_COMM_WORLD,& size)
MPI_Comm_rank();
int MPI_Comm_rank (MPI_Comm comm, int*rank);
MPI_Comm comm. – идентификатор коммуникатора
Int * rank – идентификатор процесса, вызывающего функцию. Принимает значения 0,…,size-1
Пример: пусть процессоры отзовутся и назовут себя.
#include <io Stream.h>
#include “mpi.h”
void main (int argc, char**argv) {
MPI_Init (& argc,&argv);
int size
MPI_Comm_Size (MPI_COMM_WORLD,& size)
int rank
MPI_Comm_rank (MPI_COMM_WORLD,& rank);
Cout <<”rank=”<<rank<<
“size=” <<size<<ende;
MPI_Finalize ();
Rank = 0 size = 5
Rank = 1 size = 5
Rank = 2 size = 5
Rank = 3 size = 5
Rank = 4 size = 5
Функция передачи и приёма данных с блокировкой
Функция приёма данных MPI_Recv ();
int MPI_Recv (void*buf; int count, MPI_Datatype Datatype; int source; int msgtag; MPI_Comm comm; MPI_Status *Status)
void*buf – адрес переменной куда будет записана полученная информация;
count – количество полученной информации;
MPI_Datatype Datatype – тип получаемой информации в терминологии MPI;
int source – идентификатор процесса отправителя;
int msgtag – идентификаотр сообщения;
MPI_Comm comm – идентификатор коммуникатора группы, которой принадлежат процессы;
MPI_Status *Status - указатель на структуру MPI_Status, куда записываются атрибуты полученного значения.
Функция MPI_Recv принимает сообщение с идентификатором msgtag от процессора с номером source с блокировкой. Количество принимаемой информации не должно превышать count. Если информации будет меньше count, гарантируется, что в buf будут изменены те элементы, которые соответствуют элементам принятого сообщения. Блокировка гарантирует, что после выхода из функции MPI_Recv сообщение будет принято и записано в buf.
Функции MPI_Recv можно указать вместо параметра source предопределенную константу MPI_ANY_SOURCE, т.е. подойдет сообщение от любого процесса. Вместо параметра msgtag – MPI_ANY_TAG, т.е. будет принято сообщение с любым идентификатором.
Реальные значения принятого сообщения доступны через поля структуры: MPI_Status status;
status.count;
status.MPI_SOURCE; //от кого принято сообщение
status.MPI_TAG; //идентификатор сообщения
status.MPI_ERROR;
Функция возвращает MPI_Success в случае удачи, иначе - код ошибки.