- •Содержание курса
- •Общие сведения.
- •Топологии Виды топологий
- •Программирование «Трубы»
- •Программирование «Звезды»
- •Программирование «Клика»
- •Синхронный обмен данными
- •Функции синхронного обмена данными
- •Примеры:
- •Задание 1:
- •Задание 2:
- •Задание 3:
- •Асинхронный обмен данными
- •Функции необходимые для асинхронного обмена данными
- •Пример:
- •Определение времени вычисления на Parsytec.
- •Определение времени в программе
- •Структура компьютера
- •Константы, типы данных, структуры mpi
- •Тип данных mpi_Datatype
- •Предопределённые константы
- •Сообщения
- •Функции mpi
- •Функция передачи данных с блокировкой
- •Дополнительные функции
- •Виды параллелизма Геометрический (распараллеливание по пространству)
- •Функциональный (распараллеливание по процессам)
- •Конвейерный
- •Параллелизм типа принятия коллективного решения
- •Ускорение и эффективность вычислений на мвс
- •Метод Рунге-Кутта 4
- •2. Расчётные формулы:
- •3. Алгоритм распараллеливания.
- •Метод прогноза коррекции
- •2. Расчётные формулы
- •3. Алгоритм распараллеливания.
- •4. Ускорение вычислений.
- •4. Ускорение и точность вычислений.
- •Решение уравнений в частных производных
- •Колебания мембраны
- •2. Расчетные формулы
- •Решение стационарных уравнений на мвс
- •2. Расчётные формулы
- •Алгоритм распараллеливания.
- •Ускорение вычислений
- •Оптимизация на мвс
- •Расчётные формулы
- •Алгоритм распараллеливания
- •Ускорение вычислений.
Топологии Виды топологий
Топология “Труба” (pipe)
Топология “Кольцо”(ring)
Топология “Звезда”(star)
Топология “Клика” (clique)
Топология “Решетка” (grid)
Топология “Дерево” (tree)
Топология “Гиперкуб” (hyperCube)
Топология “Пирамида””
и другие.
Программирование «Трубы»
LinkCB_t*PrevLink, *NextLink;
Const int Reg=7; int error; …
Сособ 1:
If (MyProcID==0)
NextLink = ConnectLink(1, reg, &error);
If (MyProcID!=0) && (MyProcID!=nProcs-1) {
PrevLink = ConnectLink (MyProcID -1, reg, &error);
NextLink = ConnectLink (MyProcID+1, reg, &error);
}
If (MyProcID== nProcs-1)
PrevLink = ConnectLink (nProcs-2, reg, &error);
nProcs=5
nProcs-1=4
Связь устанавливается за nProcs-1 тактов по времени.
Сособ 2:
If (MyProcID!=0) PrevLink = ConnectLink (MyProcID -1, reg, &error);
If (MyProcID!= nProcs-1) NextLink = ConnectLink (MyProcID+1, reg, &error);
Сособ 3:
If (MyProcID%2) {# // Нечетные процессы
PrevLink = ConnectLink(MyProcID -1, reg, &error);
If (MyProcID!=nProcs-1) {NextLink = ConnectLink (MyProcID+1, reg, &error);}
else { // Четные процессы
If (MyProcID!=nProcs-1) NextLink = ConnectLink (MyProcID+1, reg, &error);
If (MyProcID!=0) PrevLink = ConnectLink (MyProcID -1, reg, &error);
}
Программирование «Звезды»
известно число рабочих процессоров
# define nworker 5
LinkCB_t*Master, *Slave[nworker];
число рабочих процессоров зависит от общего числа процессоров
LinkCB_t*Master, **Slave;
int nworker = nProcs-1;
slave = (LinkCB_t** ) maloc(nworker*sizeof(LinkCB_t*) );
// выделение памяти
If (MyProcID==0) for (int i=0; i< nworker; i++) Slave[i]=ConnectLink(i+1, reg, &error);
else Master=ConnectLink(0, reg, &error);
Программирование «Клика»
int i; // номер процессора
int j=0; // индекс канала связи
for (i=0; i< nProcs; i++)
If (i!=MyProcID) {
Slave[j]=ConnectLink(i, reg, &error);
Созданную топологию можно разрушить и создать новую. В любом месте программы можно установить новые каналы связи. При смене топологии значение переменных и констант сохраняется.
Синхронный обмен данными
Синхронный обмен данными программируется раздельно на передающем и получающем процессорах. В передающем процессоре программируется команда передачи по линку заданного числа байтов. В принимающем процессоре программируется команда приема по линку заданного числа байтов. Обмен происходит если передающий и принимающий процессоры выходят на команду обмена. Если один процессор вышел на команду обмена, то он ждет пока другой выйдет на свою команду обмена.
Неправильно запрограммированный обмен данными приведет к бесконечному ожиданию.
Функции синхронного обмена данными
Прототип функции передачи данных
Функция возвращает целое число.
int SendLink(LinkCB_t*Link, void*Buf, int Size);
Функция SendLink передает Size байтов из Buf по каналу связи Link.
Функция возвращает число на самом деле переданных байтов.
Прототип функции приема данных
int RecvLink(LinkCB_t*Link, void*Buf, int Size);
Функция принимает Size байтов в Buf по каналу связи Link.
Функция возвращает число на самом деле принятых байтов. Если параметр Size в RecvLink меньше Size в SendLink, то функция RecvLink возвращает -1, что является ошибкой.